diff --git a/.deadcode-out b/.deadcode-out index f6a194b17f..e366abee94 100644 --- a/.deadcode-out +++ b/.deadcode-out @@ -1,7 +1,7 @@ -code.gitea.io/gitea/cmd +forgejo.org/cmd NoMainListener -code.gitea.io/gitea/cmd/forgejo +forgejo.org/cmd/forgejo ContextSetNoInit ContextSetNoExit ContextSetStderr @@ -9,204 +9,152 @@ code.gitea.io/gitea/cmd/forgejo ContextSetStdout ContextSetStdin -code.gitea.io/gitea/models - IsErrUpdateTaskNotExist - ErrUpdateTaskNotExist.Error - ErrUpdateTaskNotExist.Unwrap +forgejo.org/models IsErrSHANotFound IsErrMergeDivergingFastForwardOnly - GetYamlFixturesAccess -code.gitea.io/gitea/models/actions - ScheduleList.GetUserIDs - ScheduleList.GetRepoIDs - ScheduleList.LoadTriggerUser - ScheduleList.LoadRepos - -code.gitea.io/gitea/models/asymkey - ErrGPGKeyAccessDenied.Error - ErrGPGKeyAccessDenied.Unwrap - HasDeployKey - -code.gitea.io/gitea/models/auth - GetSourceByName +forgejo.org/models/auth WebAuthnCredentials -code.gitea.io/gitea/models/db +forgejo.org/models/db TruncateBeans InTransaction DumpTables -code.gitea.io/gitea/models/dbfs +forgejo.org/models/dbfs file.renameTo Create Rename -code.gitea.io/gitea/models/forgefed +forgejo.org/models/forgefed GetFederationHost -code.gitea.io/gitea/models/forgejo/semver +forgejo.org/models/forgejo/semver GetVersion SetVersionString SetVersion -code.gitea.io/gitea/models/git +forgejo.org/models/git RemoveDeletedBranchByID -code.gitea.io/gitea/models/issues +forgejo.org/models/issues IsErrUnknownDependencyType - ErrNewIssueInsert.Error IsErrIssueWasClosed - ChangeMilestoneStatus -code.gitea.io/gitea/models/organization - GetTeamNamesByID - UpdateTeamUnits +forgejo.org/models/organization SearchMembersOptions.ToConds - UsersInTeamsCount -code.gitea.io/gitea/models/perm/access +forgejo.org/models/perm/access GetRepoWriters -code.gitea.io/gitea/models/project - UpdateColumnSorting - ChangeProjectStatus - -code.gitea.io/gitea/models/repo - DeleteAttachmentsByIssue - FindReposMapByIDs - IsErrTopicNotExist - ErrTopicNotExist.Error - ErrTopicNotExist.Unwrap - GetTopicByName +forgejo.org/models/repo WatchRepoMode -code.gitea.io/gitea/models/user - ErrUserInactive.Error - ErrUserInactive.Unwrap +forgejo.org/models/user IsErrExternalLoginUserAlreadyExist IsErrExternalLoginUserNotExist NewFederatedUser IsErrUserSettingIsNotExist GetUserAllSettings DeleteUserSetting - GetUserEmailsByNames - GetUserNamesByIDs -code.gitea.io/gitea/modules/activitypub +forgejo.org/modules/activitypub NewContext Context.APClientFactory -code.gitea.io/gitea/modules/assetfs +forgejo.org/modules/assetfs Bindata -code.gitea.io/gitea/modules/auth/password/hash +forgejo.org/modules/auth/password/hash DummyHasher.HashWithSaltBytes NewDummyHasher -code.gitea.io/gitea/modules/auth/password/pwn +forgejo.org/modules/auth/password/pwn WithHTTP -code.gitea.io/gitea/modules/base +forgejo.org/modules/base SetupGiteaRoot -code.gitea.io/gitea/modules/cache +forgejo.org/modules/cache GetInt WithNoCacheContext RemoveContextData -code.gitea.io/gitea/modules/charset - BreakWriter.Write - -code.gitea.io/gitea/modules/emoji +forgejo.org/modules/emoji ReplaceCodes -code.gitea.io/gitea/modules/eventsource +forgejo.org/modules/eventsource Event.String -code.gitea.io/gitea/modules/forgefed +forgejo.org/modules/forgefed + NewForgeUndoLike + ForgeUndoLike.UnmarshalJSON + ForgeUndoLike.Validate GetItemByType JSONUnmarshalerFn NotEmpty ToRepository OnRepository -code.gitea.io/gitea/modules/git +forgejo.org/modules/git AllowLFSFiltersArgs AddChanges AddChangesWithArgs CommitChanges CommitChangesWithArgs - IsErrExecTimeout - ErrExecTimeout.Error - ErrUnsupportedVersion.Error SetUpdateHook openRepositoryWithDefaultContext - IsTagExist ToEntryMode - LimitedReaderCloser.Read - LimitedReaderCloser.Close -code.gitea.io/gitea/modules/gitgraph - Parser.Reset - -code.gitea.io/gitea/modules/gitrepo +forgejo.org/modules/gitrepo GetBranchCommitID GetWikiDefaultBranch -code.gitea.io/gitea/modules/graceful +forgejo.org/modules/graceful Manager.TerminateContext Manager.Err Manager.Value Manager.Deadline -code.gitea.io/gitea/modules/hcaptcha +forgejo.org/modules/hcaptcha WithHTTP -code.gitea.io/gitea/modules/hostmatcher +forgejo.org/modules/hostmatcher HostMatchList.AppendPattern -code.gitea.io/gitea/modules/json +forgejo.org/modules/json StdJSON.Marshal StdJSON.Unmarshal StdJSON.NewEncoder StdJSON.NewDecoder StdJSON.Indent -code.gitea.io/gitea/modules/markup +forgejo.org/modules/log + NewEventWriterBuffer + +forgejo.org/modules/markup GetRendererByType RenderString IsMarkupFile -code.gitea.io/gitea/modules/markup/console +forgejo.org/modules/markup/console Render RenderString -code.gitea.io/gitea/modules/markup/markdown - IsDetails - IsSummary - IsTaskCheckBoxListItem - IsIcon +forgejo.org/modules/markup/markdown RenderRawString -code.gitea.io/gitea/modules/markup/markdown/math - WithInlineDollarParser - WithBlockDollarParser - -code.gitea.io/gitea/modules/markup/mdstripper +forgejo.org/modules/markup/mdstripper stripRenderer.AddOptions StripMarkdown -code.gitea.io/gitea/modules/markup/orgmode +forgejo.org/modules/markup/orgmode RenderString -code.gitea.io/gitea/modules/private - ActionsRunnerRegister - -code.gitea.io/gitea/modules/process +forgejo.org/modules/process Manager.ExecTimeout -code.gitea.io/gitea/modules/queue +forgejo.org/modules/queue newBaseChannelSimple newBaseChannelUnique newBaseRedisSimple @@ -215,89 +163,71 @@ code.gitea.io/gitea/modules/queue testStateRecorder.Reset newWorkerPoolQueueForTest -code.gitea.io/gitea/modules/queue/lqinternal +forgejo.org/modules/queue/lqinternal QueueItemIDBytes QueueItemKeyBytes ListLevelQueueKeys -code.gitea.io/gitea/modules/setting +forgejo.org/modules/setting NewConfigProviderFromData GitConfigType.GetOption InitLoggersForTest -code.gitea.io/gitea/modules/storage - ErrInvalidConfiguration.Error - IsErrInvalidConfiguration - -code.gitea.io/gitea/modules/structs - ParseCreateHook - ParsePushHook - -code.gitea.io/gitea/modules/sync +forgejo.org/modules/sync StatusTable.Start StatusTable.IsRunning -code.gitea.io/gitea/modules/timeutil +forgejo.org/modules/timeutil GetExecutableModTime MockSet MockUnset -code.gitea.io/gitea/modules/translation +forgejo.org/modules/translation MockLocale.Language MockLocale.TrString MockLocale.Tr MockLocale.TrN + MockLocale.TrPluralString MockLocale.TrSize + MockLocale.HasKey MockLocale.PrettyNumber -code.gitea.io/gitea/modules/util/filebuffer +forgejo.org/modules/util + OptionalArg + +forgejo.org/modules/util/filebuffer CreateFromReader -code.gitea.io/gitea/modules/validation +forgejo.org/modules/validation IsErrNotValid -code.gitea.io/gitea/modules/web +forgejo.org/modules/web RouteMock RouteMockReset -code.gitea.io/gitea/modules/web/middleware - DeleteLocaleCookie - -code.gitea.io/gitea/modules/zstd +forgejo.org/modules/zstd NewWriter Writer.Write Writer.Close -code.gitea.io/gitea/routers/web +forgejo.org/routers/web NotFound -code.gitea.io/gitea/routers/web/org +forgejo.org/routers/web/org MustEnableProjects -code.gitea.io/gitea/services/context +forgejo.org/services/context GetPrivateContext -code.gitea.io/gitea/services/convert - ToSecret - -code.gitea.io/gitea/services/forms - DeadlineForm.Validate - -code.gitea.io/gitea/services/pull - IsCommitStatusContextSuccess - -code.gitea.io/gitea/services/repository +forgejo.org/services/repository IsErrForkAlreadyExist -code.gitea.io/gitea/services/repository/archiver - ArchiveRepository - -code.gitea.io/gitea/services/repository/files +forgejo.org/services/repository/files ContentType.String - GetFileResponseFromCommit - TemporaryUploadRepository.GetLastCommit - TemporaryUploadRepository.GetLastCommitByRef -code.gitea.io/gitea/services/webhook +forgejo.org/services/repository/gitgraph + Parser.Reset + +forgejo.org/services/webhook NewNotifier diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index da649017ae..f3d30963c7 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,12 +1,12 @@ { "name": "Gitea DevContainer", - "image": "mcr.microsoft.com/devcontainers/go:1.23-bullseye", + "image": "mcr.microsoft.com/devcontainers/go:1.24-bullseye", "features": { // installs nodejs into container "ghcr.io/devcontainers/features/node:1": { "version": "20" }, - "ghcr.io/devcontainers/features/git-lfs:1.2.1": {}, + "ghcr.io/devcontainers/features/git-lfs:1.2.3": {}, "ghcr.io/devcontainers-contrib/features/poetry:2": {}, "ghcr.io/devcontainers/features/python:1": { "version": "3.12" diff --git a/.dockerignore b/.dockerignore index a1611a1ca5..5e7a893014 100644 --- a/.dockerignore +++ b/.dockerignore @@ -34,6 +34,7 @@ _testmain.go *coverage.out coverage.all +coverage/ cpu.out /modules/migration/bindata.go diff --git a/.editorconfig b/.editorconfig index 8e2234e64b..a547e8a585 100644 --- a/.editorconfig +++ b/.editorconfig @@ -26,3 +26,8 @@ insert_final_newline = false [options/locale/locale_*.ini] insert_final_newline = false + +# Weblate JSON output defaults to four spaces +[options/locale_next/locale_*.json] +indent_style = space +indent_size = 4 diff --git a/.envrc b/.envrc.example similarity index 100% rename from .envrc rename to .envrc.example diff --git a/.eslintrc.yaml b/.eslintrc.yaml deleted file mode 100644 index db85b143dd..0000000000 --- a/.eslintrc.yaml +++ /dev/null @@ -1,803 +0,0 @@ -root: true -reportUnusedDisableDirectives: true - -ignorePatterns: - - /web_src/js/vendor - - /web_src/fomantic - - /public/assets/js - -parserOptions: - sourceType: module - ecmaVersion: latest - -plugins: - - "@eslint-community/eslint-plugin-eslint-comments" - - "@stylistic/eslint-plugin-js" - - "@vitest" - - eslint-plugin-array-func - - eslint-plugin-github - - eslint-plugin-i - - eslint-plugin-no-jquery - - eslint-plugin-no-use-extend-native - - eslint-plugin-regexp - - eslint-plugin-sonarjs - - eslint-plugin-unicorn - - eslint-plugin-vitest-globals - - eslint-plugin-wc - -env: - es2024: true - node: true - -overrides: - - files: ["web_src/**/*"] - globals: - __webpack_public_path__: true - process: false # https://github.com/webpack/webpack/issues/15833 - - files: ["web_src/**/*", "docs/**/*"] - env: - browser: true - node: false - - files: ["web_src/**/*worker.*"] - env: - worker: true - rules: - no-restricted-globals: [2, addEventListener, blur, close, closed, confirm, defaultStatus, defaultstatus, error, event, external, find, focus, frameElement, frames, history, innerHeight, innerWidth, isFinite, isNaN, length, locationbar, menubar, moveBy, moveTo, name, onblur, onerror, onfocus, onload, onresize, onunload, open, opener, opera, outerHeight, outerWidth, pageXOffset, pageYOffset, parent, print, removeEventListener, resizeBy, resizeTo, screen, screenLeft, screenTop, screenX, screenY, scroll, scrollbars, scrollBy, scrollTo, scrollX, scrollY, status, statusbar, stop, toolbar, top] - - files: ["*.config.*"] - rules: - i/no-unused-modules: [0] - - files: ["**/*.test.*", "web_src/js/test/setup.js"] - env: - vitest-globals/env: true - rules: - "@vitest/consistent-test-filename": [0] - "@vitest/consistent-test-it": [0] - "@vitest/expect-expect": [0] - "@vitest/max-expects": [0] - "@vitest/max-nested-describe": [0] - "@vitest/no-alias-methods": [0] - "@vitest/no-commented-out-tests": [0] - "@vitest/no-conditional-expect": [0] - "@vitest/no-conditional-in-test": [0] - "@vitest/no-conditional-tests": [0] - "@vitest/no-disabled-tests": [0] - "@vitest/no-done-callback": [0] - "@vitest/no-duplicate-hooks": [0] - "@vitest/no-focused-tests": [0] - "@vitest/no-hooks": [0] - "@vitest/no-identical-title": [2] - "@vitest/no-interpolation-in-snapshots": [0] - "@vitest/no-large-snapshots": [0] - "@vitest/no-mocks-import": [0] - "@vitest/no-restricted-matchers": [0] - "@vitest/no-restricted-vi-methods": [0] - "@vitest/no-standalone-expect": [0] - "@vitest/no-test-prefixes": [0] - "@vitest/no-test-return-statement": [0] - "@vitest/prefer-called-with": [0] - "@vitest/prefer-comparison-matcher": [0] - "@vitest/prefer-each": [0] - "@vitest/prefer-equality-matcher": [0] - "@vitest/prefer-expect-resolves": [0] - "@vitest/prefer-hooks-in-order": [0] - "@vitest/prefer-hooks-on-top": [2] - "@vitest/prefer-lowercase-title": [0] - "@vitest/prefer-mock-promise-shorthand": [0] - "@vitest/prefer-snapshot-hint": [0] - "@vitest/prefer-spy-on": [0] - "@vitest/prefer-strict-equal": [0] - "@vitest/prefer-to-be": [0] - "@vitest/prefer-to-be-falsy": [0] - "@vitest/prefer-to-be-object": [0] - "@vitest/prefer-to-be-truthy": [0] - "@vitest/prefer-to-contain": [0] - "@vitest/prefer-to-have-length": [0] - "@vitest/prefer-todo": [0] - "@vitest/require-hook": [0] - "@vitest/require-to-throw-message": [0] - "@vitest/require-top-level-describe": [0] - "@vitest/valid-describe-callback": [2] - "@vitest/valid-expect": [2] - "@vitest/valid-title": [2] - - files: ["web_src/js/modules/fetch.js", "web_src/js/standalone/**/*"] - rules: - no-restricted-syntax: [2, WithStatement, ForInStatement, LabeledStatement, SequenceExpression] - -rules: - "@eslint-community/eslint-comments/disable-enable-pair": [2] - "@eslint-community/eslint-comments/no-aggregating-enable": [2] - "@eslint-community/eslint-comments/no-duplicate-disable": [2] - "@eslint-community/eslint-comments/no-restricted-disable": [0] - "@eslint-community/eslint-comments/no-unlimited-disable": [2] - "@eslint-community/eslint-comments/no-unused-disable": [2] - "@eslint-community/eslint-comments/no-unused-enable": [2] - "@eslint-community/eslint-comments/no-use": [0] - "@eslint-community/eslint-comments/require-description": [0] - "@stylistic/js/array-bracket-newline": [0] - "@stylistic/js/array-bracket-spacing": [2, never] - "@stylistic/js/array-element-newline": [0] - "@stylistic/js/arrow-parens": [2, always] - "@stylistic/js/arrow-spacing": [2, {before: true, after: true}] - "@stylistic/js/block-spacing": [0] - "@stylistic/js/brace-style": [2, 1tbs, {allowSingleLine: true}] - "@stylistic/js/comma-dangle": [2, always-multiline] - "@stylistic/js/comma-spacing": [2, {before: false, after: true}] - "@stylistic/js/comma-style": [2, last] - "@stylistic/js/computed-property-spacing": [2, never] - "@stylistic/js/dot-location": [2, property] - "@stylistic/js/eol-last": [2] - "@stylistic/js/function-call-spacing": [2, never] - "@stylistic/js/function-call-argument-newline": [0] - "@stylistic/js/function-paren-newline": [0] - "@stylistic/js/generator-star-spacing": [0] - "@stylistic/js/implicit-arrow-linebreak": [0] - "@stylistic/js/indent": [2, 2, {ignoreComments: true, SwitchCase: 1}] - "@stylistic/js/key-spacing": [2] - "@stylistic/js/keyword-spacing": [2] - "@stylistic/js/linebreak-style": [2, unix] - "@stylistic/js/lines-around-comment": [0] - "@stylistic/js/lines-between-class-members": [0] - "@stylistic/js/max-len": [0] - "@stylistic/js/max-statements-per-line": [0] - "@stylistic/js/multiline-ternary": [0] - "@stylistic/js/new-parens": [2] - "@stylistic/js/newline-per-chained-call": [0] - "@stylistic/js/no-confusing-arrow": [0] - "@stylistic/js/no-extra-parens": [0] - "@stylistic/js/no-extra-semi": [2] - "@stylistic/js/no-floating-decimal": [0] - "@stylistic/js/no-mixed-operators": [0] - "@stylistic/js/no-mixed-spaces-and-tabs": [2] - "@stylistic/js/no-multi-spaces": [2, {ignoreEOLComments: true, exceptions: {Property: true}}] - "@stylistic/js/no-multiple-empty-lines": [2, {max: 1, maxEOF: 0, maxBOF: 0}] - "@stylistic/js/no-tabs": [2] - "@stylistic/js/no-trailing-spaces": [2] - "@stylistic/js/no-whitespace-before-property": [2] - "@stylistic/js/nonblock-statement-body-position": [2] - "@stylistic/js/object-curly-newline": [0] - "@stylistic/js/object-curly-spacing": [2, never] - "@stylistic/js/object-property-newline": [0] - "@stylistic/js/one-var-declaration-per-line": [0] - "@stylistic/js/operator-linebreak": [2, after] - "@stylistic/js/padded-blocks": [2, never] - "@stylistic/js/padding-line-between-statements": [0] - "@stylistic/js/quote-props": [0] - "@stylistic/js/quotes": [2, single, {avoidEscape: true, allowTemplateLiterals: true}] - "@stylistic/js/rest-spread-spacing": [2, never] - "@stylistic/js/semi": [2, always, {omitLastInOneLineBlock: true}] - "@stylistic/js/semi-spacing": [2, {before: false, after: true}] - "@stylistic/js/semi-style": [2, last] - "@stylistic/js/space-before-blocks": [2, always] - "@stylistic/js/space-before-function-paren": [2, {anonymous: ignore, named: never, asyncArrow: always}] - "@stylistic/js/space-in-parens": [2, never] - "@stylistic/js/space-infix-ops": [2] - "@stylistic/js/space-unary-ops": [2] - "@stylistic/js/spaced-comment": [2, always] - "@stylistic/js/switch-colon-spacing": [2] - "@stylistic/js/template-curly-spacing": [2, never] - "@stylistic/js/template-tag-spacing": [2, never] - "@stylistic/js/wrap-iife": [2, inside] - "@stylistic/js/wrap-regex": [0] - "@stylistic/js/yield-star-spacing": [2, after] - accessor-pairs: [2] - array-callback-return: [2, {checkForEach: true}] - array-func/avoid-reverse: [2] - array-func/from-map: [2] - array-func/no-unnecessary-this-arg: [2] - array-func/prefer-array-from: [2] - array-func/prefer-flat-map: [0] # handled by unicorn/prefer-array-flat-map - array-func/prefer-flat: [0] # handled by unicorn/prefer-array-flat - arrow-body-style: [0] - block-scoped-var: [2] - camelcase: [0] - capitalized-comments: [0] - class-methods-use-this: [0] - complexity: [0] - consistent-return: [0] - consistent-this: [0] - constructor-super: [2] - curly: [0] - default-case-last: [2] - default-case: [0] - default-param-last: [0] - dot-notation: [0] - eqeqeq: [2] - for-direction: [2] - func-name-matching: [2] - func-names: [0] - func-style: [0] - getter-return: [2] - github/a11y-aria-label-is-well-formatted: [0] - github/a11y-no-title-attribute: [0] - github/a11y-no-visually-hidden-interactive-element: [0] - github/a11y-role-supports-aria-props: [0] - github/a11y-svg-has-accessible-name: [0] - github/array-foreach: [0] - github/async-currenttarget: [2] - github/async-preventdefault: [2] - github/authenticity-token: [0] - github/get-attribute: [0] - github/js-class-name: [0] - github/no-blur: [0] - github/no-d-none: [0] - github/no-dataset: [2] - github/no-dynamic-script-tag: [2] - github/no-implicit-buggy-globals: [2] - github/no-inner-html: [0] - github/no-innerText: [2] - github/no-then: [2] - github/no-useless-passive: [2] - github/prefer-observers: [2] - github/require-passive-events: [2] - github/unescaped-html-literal: [0] - grouped-accessor-pairs: [2] - guard-for-in: [0] - id-blacklist: [0] - id-length: [0] - id-match: [0] - i/consistent-type-specifier-style: [0] - i/default: [0] - i/dynamic-import-chunkname: [0] - i/export: [2] - i/exports-last: [0] - i/extensions: [2, always, {ignorePackages: true}] - i/first: [2] - i/group-exports: [0] - i/max-dependencies: [0] - i/named: [2] - i/namespace: [0] - i/newline-after-import: [0] - i/no-absolute-path: [0] - i/no-amd: [2] - i/no-anonymous-default-export: [0] - i/no-commonjs: [2] - i/no-cycle: [2, {ignoreExternal: true, maxDepth: 1}] - i/no-default-export: [0] - i/no-deprecated: [0] - i/no-dynamic-require: [0] - i/no-empty-named-blocks: [2] - i/no-extraneous-dependencies: [2] - i/no-import-module-exports: [0] - i/no-internal-modules: [0] - i/no-mutable-exports: [0] - i/no-named-as-default-member: [0] - i/no-named-as-default: [2] - i/no-named-default: [0] - i/no-named-export: [0] - i/no-namespace: [0] - i/no-nodejs-modules: [0] - i/no-relative-packages: [0] - i/no-relative-parent-imports: [0] - i/no-restricted-paths: [0] - i/no-self-import: [2] - i/no-unassigned-import: [0] - i/no-unresolved: [2, {commonjs: true, ignore: ["\\?.+$", ^vitest/]}] - i/no-unused-modules: [2, {unusedExports: true}] - i/no-useless-path-segments: [2, {commonjs: true}] - i/no-webpack-loader-syntax: [2] - i/order: [0] - i/prefer-default-export: [0] - i/unambiguous: [0] - init-declarations: [0] - line-comment-position: [0] - logical-assignment-operators: [0] - max-classes-per-file: [0] - max-depth: [0] - max-lines-per-function: [0] - max-lines: [0] - max-nested-callbacks: [0] - max-params: [0] - max-statements: [0] - multiline-comment-style: [2, separate-lines] - new-cap: [0] - no-alert: [0] - no-array-constructor: [2] - no-async-promise-executor: [0] - no-await-in-loop: [0] - no-bitwise: [0] - no-buffer-constructor: [0] - no-caller: [2] - no-case-declarations: [2] - no-class-assign: [2] - no-compare-neg-zero: [2] - no-cond-assign: [2, except-parens] - no-console: [1, {allow: [debug, info, warn, error]}] - no-const-assign: [2] - no-constant-binary-expression: [2] - no-constant-condition: [0] - no-constructor-return: [2] - no-continue: [0] - no-control-regex: [0] - no-debugger: [1] - no-delete-var: [2] - no-div-regex: [0] - no-dupe-args: [2] - no-dupe-class-members: [2] - no-dupe-else-if: [2] - no-dupe-keys: [2] - no-duplicate-case: [2] - no-duplicate-imports: [2] - no-else-return: [2] - no-empty-character-class: [2] - no-empty-function: [0] - no-empty-pattern: [2] - no-empty-static-block: [2] - no-empty: [2, {allowEmptyCatch: true}] - no-eq-null: [2] - no-eval: [2] - no-ex-assign: [2] - no-extend-native: [2] - no-extra-bind: [2] - no-extra-boolean-cast: [2] - no-extra-label: [0] - no-fallthrough: [2] - no-func-assign: [2] - no-global-assign: [2] - no-implicit-coercion: [2] - no-implicit-globals: [0] - no-implied-eval: [2] - no-import-assign: [2] - no-inline-comments: [0] - no-inner-declarations: [2] - no-invalid-regexp: [2] - no-invalid-this: [0] - no-irregular-whitespace: [2] - no-iterator: [2] - no-jquery/no-ajax-events: [2] - no-jquery/no-ajax: [2] - no-jquery/no-and-self: [2] - no-jquery/no-animate-toggle: [2] - no-jquery/no-animate: [2] - no-jquery/no-append-html: [2] - no-jquery/no-attr: [2] - no-jquery/no-bind: [2] - no-jquery/no-box-model: [2] - no-jquery/no-browser: [2] - no-jquery/no-camel-case: [2] - no-jquery/no-class-state: [2] - no-jquery/no-class: [0] - no-jquery/no-clone: [2] - no-jquery/no-closest: [0] - no-jquery/no-constructor-attributes: [2] - no-jquery/no-contains: [2] - no-jquery/no-context-prop: [2] - no-jquery/no-css: [2] - no-jquery/no-data: [0] - no-jquery/no-deferred: [2] - no-jquery/no-delegate: [2] - no-jquery/no-each-collection: [0] - no-jquery/no-each-util: [0] - no-jquery/no-each: [0] - no-jquery/no-error-shorthand: [2] - no-jquery/no-error: [2] - no-jquery/no-escape-selector: [2] - no-jquery/no-event-shorthand: [2] - no-jquery/no-extend: [2] - no-jquery/no-fade: [2] - no-jquery/no-filter: [0] - no-jquery/no-find-collection: [0] - no-jquery/no-find-util: [2] - no-jquery/no-find: [0] - no-jquery/no-fx-interval: [2] - no-jquery/no-global-eval: [2] - no-jquery/no-global-selector: [0] - no-jquery/no-grep: [2] - no-jquery/no-has: [2] - no-jquery/no-hold-ready: [2] - no-jquery/no-html: [0] - no-jquery/no-in-array: [2] - no-jquery/no-is-array: [2] - no-jquery/no-is-empty-object: [2] - no-jquery/no-is-function: [2] - no-jquery/no-is-numeric: [2] - no-jquery/no-is-plain-object: [2] - no-jquery/no-is-window: [2] - no-jquery/no-is: [2] - no-jquery/no-jquery-constructor: [0] - no-jquery/no-live: [2] - no-jquery/no-load-shorthand: [2] - no-jquery/no-load: [2] - no-jquery/no-map-collection: [0] - no-jquery/no-map-util: [2] - no-jquery/no-map: [2] - no-jquery/no-merge: [2] - no-jquery/no-node-name: [2] - no-jquery/no-noop: [2] - no-jquery/no-now: [2] - no-jquery/no-on-ready: [2] - no-jquery/no-other-methods: [0] - no-jquery/no-other-utils: [2] - no-jquery/no-param: [2] - no-jquery/no-parent: [0] - no-jquery/no-parents: [2] - no-jquery/no-parse-html-literal: [2] - no-jquery/no-parse-html: [2] - no-jquery/no-parse-json: [2] - no-jquery/no-parse-xml: [2] - no-jquery/no-prop: [2] - no-jquery/no-proxy: [2] - no-jquery/no-ready-shorthand: [2] - no-jquery/no-ready: [2] - no-jquery/no-selector-prop: [2] - no-jquery/no-serialize: [2] - no-jquery/no-size: [2] - no-jquery/no-sizzle: [0] - no-jquery/no-slide: [2] - no-jquery/no-sub: [2] - no-jquery/no-support: [2] - no-jquery/no-text: [0] - no-jquery/no-trigger: [0] - no-jquery/no-trim: [2] - no-jquery/no-type: [2] - no-jquery/no-unique: [2] - no-jquery/no-unload-shorthand: [2] - no-jquery/no-val: [0] - no-jquery/no-visibility: [2] - no-jquery/no-when: [2] - no-jquery/no-wrap: [2] - no-jquery/variable-pattern: [2] - no-label-var: [2] - no-labels: [0] # handled by no-restricted-syntax - no-lone-blocks: [2] - no-lonely-if: [0] - no-loop-func: [0] - no-loss-of-precision: [2] - no-magic-numbers: [0] - no-misleading-character-class: [2] - no-multi-assign: [0] - no-multi-str: [2] - no-negated-condition: [0] - no-nested-ternary: [0] - no-new-func: [2] - no-new-native-nonconstructor: [2] - no-new-object: [2] - no-new-symbol: [2] - no-new-wrappers: [2] - no-new: [0] - no-nonoctal-decimal-escape: [2] - no-obj-calls: [2] - no-octal-escape: [2] - no-octal: [2] - no-param-reassign: [0] - no-plusplus: [0] - no-promise-executor-return: [0] - no-proto: [2] - no-prototype-builtins: [2] - no-redeclare: [2] - no-regex-spaces: [2] - no-restricted-exports: [0] - no-restricted-globals: [2, addEventListener, blur, close, closed, confirm, defaultStatus, defaultstatus, error, event, external, find, focus, frameElement, frames, history, innerHeight, innerWidth, isFinite, isNaN, length, location, locationbar, menubar, moveBy, moveTo, name, onblur, onerror, onfocus, onload, onresize, onunload, open, opener, opera, outerHeight, outerWidth, pageXOffset, pageYOffset, parent, print, removeEventListener, resizeBy, resizeTo, screen, screenLeft, screenTop, screenX, screenY, scroll, scrollbars, scrollBy, scrollTo, scrollX, scrollY, self, status, statusbar, stop, toolbar, top, __dirname, __filename] - no-restricted-imports: [0] - no-restricted-syntax: [2, WithStatement, ForInStatement, LabeledStatement, SequenceExpression, {selector: "CallExpression[callee.name='fetch']", message: "use modules/fetch.js instead"}] - no-return-assign: [0] - no-script-url: [2] - no-self-assign: [2, {props: true}] - no-self-compare: [2] - no-sequences: [2] - no-setter-return: [2] - no-shadow-restricted-names: [2] - no-shadow: [0] - no-sparse-arrays: [2] - no-template-curly-in-string: [2] - no-ternary: [0] - no-this-before-super: [2] - no-throw-literal: [2] - no-undef-init: [2] - no-undef: [2, {typeof: true}] - no-undefined: [0] - no-underscore-dangle: [0] - no-unexpected-multiline: [2] - no-unmodified-loop-condition: [2] - no-unneeded-ternary: [2] - no-unreachable-loop: [2] - no-unreachable: [2] - no-unsafe-finally: [2] - no-unsafe-negation: [2] - no-unused-expressions: [2] - no-unused-labels: [2] - no-unused-private-class-members: [2] - no-unused-vars: [2, {args: all, argsIgnorePattern: ^_, varsIgnorePattern: ^_, caughtErrorsIgnorePattern: ^_, destructuredArrayIgnorePattern: ^_, ignoreRestSiblings: false}] - no-use-before-define: [2, {functions: false, classes: true, variables: true, allowNamedExports: true}] - no-use-extend-native/no-use-extend-native: [2] - no-useless-backreference: [2] - no-useless-call: [2] - no-useless-catch: [2] - no-useless-computed-key: [2] - no-useless-concat: [2] - no-useless-constructor: [2] - no-useless-escape: [2] - no-useless-rename: [2] - no-useless-return: [2] - no-var: [2] - no-void: [2] - no-warning-comments: [0] - no-with: [0] # handled by no-restricted-syntax - object-shorthand: [2, always] - one-var-declaration-per-line: [0] - one-var: [0] - operator-assignment: [2, always] - operator-linebreak: [2, after] - prefer-arrow-callback: [2, {allowNamedFunctions: true, allowUnboundThis: true}] - prefer-const: [2, {destructuring: all, ignoreReadBeforeAssign: true}] - prefer-destructuring: [0] - prefer-exponentiation-operator: [2] - prefer-named-capture-group: [0] - prefer-numeric-literals: [2] - prefer-object-has-own: [2] - prefer-object-spread: [2] - prefer-promise-reject-errors: [2, {allowEmptyReject: false}] - prefer-regex-literals: [2] - prefer-rest-params: [2] - prefer-spread: [2] - prefer-template: [2] - radix: [2, as-needed] - regexp/confusing-quantifier: [2] - regexp/control-character-escape: [2] - regexp/hexadecimal-escape: [0] - regexp/letter-case: [0] - regexp/match-any: [2] - regexp/negation: [2] - regexp/no-contradiction-with-assertion: [0] - regexp/no-control-character: [0] - regexp/no-dupe-characters-character-class: [2] - regexp/no-dupe-disjunctions: [2] - regexp/no-empty-alternative: [2] - regexp/no-empty-capturing-group: [2] - regexp/no-empty-character-class: [0] - regexp/no-empty-group: [2] - regexp/no-empty-lookarounds-assertion: [2] - regexp/no-empty-string-literal: [2] - regexp/no-escape-backspace: [2] - regexp/no-extra-lookaround-assertions: [0] - regexp/no-invalid-regexp: [2] - regexp/no-invisible-character: [2] - regexp/no-lazy-ends: [2] - regexp/no-legacy-features: [2] - regexp/no-misleading-capturing-group: [0] - regexp/no-misleading-unicode-character: [0] - regexp/no-missing-g-flag: [2] - regexp/no-non-standard-flag: [2] - regexp/no-obscure-range: [2] - regexp/no-octal: [2] - regexp/no-optional-assertion: [2] - regexp/no-potentially-useless-backreference: [2] - regexp/no-standalone-backslash: [2] - regexp/no-super-linear-backtracking: [0] - regexp/no-super-linear-move: [0] - regexp/no-trivially-nested-assertion: [2] - regexp/no-trivially-nested-quantifier: [2] - regexp/no-unused-capturing-group: [0] - regexp/no-useless-assertions: [2] - regexp/no-useless-backreference: [2] - regexp/no-useless-character-class: [2] - regexp/no-useless-dollar-replacements: [2] - regexp/no-useless-escape: [2] - regexp/no-useless-flag: [2] - regexp/no-useless-lazy: [2] - regexp/no-useless-non-capturing-group: [2] - regexp/no-useless-quantifier: [2] - regexp/no-useless-range: [2] - regexp/no-useless-set-operand: [2] - regexp/no-useless-string-literal: [2] - regexp/no-useless-two-nums-quantifier: [2] - regexp/no-zero-quantifier: [2] - regexp/optimal-lookaround-quantifier: [2] - regexp/optimal-quantifier-concatenation: [0] - regexp/prefer-character-class: [0] - regexp/prefer-d: [0] - regexp/prefer-escape-replacement-dollar-char: [0] - regexp/prefer-lookaround: [0] - regexp/prefer-named-backreference: [0] - regexp/prefer-named-capture-group: [0] - regexp/prefer-named-replacement: [0] - regexp/prefer-plus-quantifier: [2] - regexp/prefer-predefined-assertion: [2] - regexp/prefer-quantifier: [0] - regexp/prefer-question-quantifier: [2] - regexp/prefer-range: [2] - regexp/prefer-regexp-exec: [2] - regexp/prefer-regexp-test: [2] - regexp/prefer-result-array-groups: [0] - regexp/prefer-set-operation: [2] - regexp/prefer-star-quantifier: [2] - regexp/prefer-unicode-codepoint-escapes: [2] - regexp/prefer-w: [0] - regexp/require-unicode-regexp: [0] - regexp/simplify-set-operations: [2] - regexp/sort-alternatives: [0] - regexp/sort-character-class-elements: [0] - regexp/sort-flags: [0] - regexp/strict: [2] - regexp/unicode-escape: [0] - regexp/use-ignore-case: [0] - require-atomic-updates: [0] - require-await: [0] - require-unicode-regexp: [0] - require-yield: [2] - sonarjs/cognitive-complexity: [0] - sonarjs/elseif-without-else: [0] - sonarjs/max-switch-cases: [0] - sonarjs/no-all-duplicated-branches: [2] - sonarjs/no-collapsible-if: [0] - sonarjs/no-collection-size-mischeck: [2] - sonarjs/no-duplicate-string: [0] - sonarjs/no-duplicated-branches: [0] - sonarjs/no-element-overwrite: [2] - sonarjs/no-empty-collection: [2] - sonarjs/no-extra-arguments: [2] - sonarjs/no-gratuitous-expressions: [2] - sonarjs/no-identical-conditions: [2] - sonarjs/no-identical-expressions: [2] - sonarjs/no-identical-functions: [2, 5] - sonarjs/no-ignored-return: [2] - sonarjs/no-inverted-boolean-check: [2] - sonarjs/no-nested-switch: [0] - sonarjs/no-nested-template-literals: [0] - sonarjs/no-one-iteration-loop: [2] - sonarjs/no-redundant-boolean: [2] - sonarjs/no-redundant-jump: [2] - sonarjs/no-same-line-conditional: [2] - sonarjs/no-small-switch: [0] - sonarjs/no-unused-collection: [2] - sonarjs/no-use-of-empty-return-value: [2] - sonarjs/no-useless-catch: [2] - sonarjs/non-existent-operator: [2] - sonarjs/prefer-immediate-return: [0] - sonarjs/prefer-object-literal: [0] - sonarjs/prefer-single-boolean-return: [0] - sonarjs/prefer-while: [2] - sort-imports: [0] - sort-keys: [0] - sort-vars: [0] - strict: [0] - symbol-description: [2] - unicode-bom: [2, never] - unicorn/better-regex: [0] - unicorn/catch-error-name: [0] - unicorn/consistent-destructuring: [2] - unicorn/consistent-empty-array-spread: [2] - unicorn/consistent-function-scoping: [2] - unicorn/custom-error-definition: [0] - unicorn/empty-brace-spaces: [2] - unicorn/error-message: [0] - unicorn/escape-case: [0] - unicorn/expiring-todo-comments: [0] - unicorn/explicit-length-check: [0] - unicorn/filename-case: [0] - unicorn/import-index: [0] - unicorn/import-style: [0] - unicorn/new-for-builtins: [2] - unicorn/no-abusive-eslint-disable: [0] - unicorn/no-anonymous-default-export: [0] - unicorn/no-array-callback-reference: [0] - unicorn/no-array-for-each: [2] - unicorn/no-array-method-this-argument: [2] - unicorn/no-array-push-push: [2] - unicorn/no-array-reduce: [2] - unicorn/no-await-expression-member: [0] - unicorn/no-await-in-promise-methods: [2] - unicorn/no-console-spaces: [0] - unicorn/no-document-cookie: [2] - unicorn/no-empty-file: [2] - unicorn/no-for-loop: [0] - unicorn/no-hex-escape: [0] - unicorn/no-instanceof-array: [0] - unicorn/no-invalid-fetch-options: [2] - unicorn/no-invalid-remove-event-listener: [2] - unicorn/no-keyword-prefix: [0] - unicorn/no-length-as-slice-end: [2] - unicorn/no-lonely-if: [2] - unicorn/no-magic-array-flat-depth: [0] - unicorn/no-negated-condition: [0] - unicorn/no-negation-in-equality-check: [2] - unicorn/no-nested-ternary: [0] - unicorn/no-new-array: [0] - unicorn/no-new-buffer: [0] - unicorn/no-null: [0] - unicorn/no-object-as-default-parameter: [0] - unicorn/no-process-exit: [0] - unicorn/no-single-promise-in-promise-methods: [2] - unicorn/no-static-only-class: [2] - unicorn/no-thenable: [2] - unicorn/no-this-assignment: [2] - unicorn/no-typeof-undefined: [2] - unicorn/no-unnecessary-await: [2] - unicorn/no-unnecessary-polyfills: [2] - unicorn/no-unreadable-array-destructuring: [0] - unicorn/no-unreadable-iife: [2] - unicorn/no-unused-properties: [2] - unicorn/no-useless-fallback-in-spread: [2] - unicorn/no-useless-length-check: [2] - unicorn/no-useless-promise-resolve-reject: [2] - unicorn/no-useless-spread: [2] - unicorn/no-useless-switch-case: [2] - unicorn/no-useless-undefined: [0] - unicorn/no-zero-fractions: [2] - unicorn/number-literal-case: [0] - unicorn/numeric-separators-style: [0] - unicorn/prefer-add-event-listener: [2] - unicorn/prefer-array-find: [2] - unicorn/prefer-array-flat-map: [2] - unicorn/prefer-array-flat: [2] - unicorn/prefer-array-index-of: [2] - unicorn/prefer-array-some: [2] - unicorn/prefer-at: [0] - unicorn/prefer-blob-reading-methods: [2] - unicorn/prefer-code-point: [0] - unicorn/prefer-date-now: [2] - unicorn/prefer-default-parameters: [0] - unicorn/prefer-dom-node-append: [2] - unicorn/prefer-dom-node-dataset: [0] - unicorn/prefer-dom-node-remove: [2] - unicorn/prefer-dom-node-text-content: [2] - unicorn/prefer-event-target: [2] - unicorn/prefer-export-from: [0] - unicorn/prefer-includes: [2] - unicorn/prefer-json-parse-buffer: [0] - unicorn/prefer-keyboard-event-key: [2] - unicorn/prefer-logical-operator-over-ternary: [2] - unicorn/prefer-math-trunc: [2] - unicorn/prefer-modern-dom-apis: [0] - unicorn/prefer-modern-math-apis: [2] - unicorn/prefer-module: [2] - unicorn/prefer-native-coercion-functions: [2] - unicorn/prefer-negative-index: [2] - unicorn/prefer-node-protocol: [2] - unicorn/prefer-number-properties: [0] - unicorn/prefer-object-from-entries: [2] - unicorn/prefer-object-has-own: [0] - unicorn/prefer-optional-catch-binding: [2] - unicorn/prefer-prototype-methods: [0] - unicorn/prefer-query-selector: [0] - unicorn/prefer-reflect-apply: [0] - unicorn/prefer-regexp-test: [2] - unicorn/prefer-set-has: [0] - unicorn/prefer-set-size: [2] - unicorn/prefer-spread: [0] - unicorn/prefer-string-raw: [0] - unicorn/prefer-string-replace-all: [0] - unicorn/prefer-string-slice: [0] - unicorn/prefer-string-starts-ends-with: [2] - unicorn/prefer-string-trim-start-end: [2] - unicorn/prefer-structured-clone: [2] - unicorn/prefer-switch: [0] - unicorn/prefer-ternary: [0] - unicorn/prefer-text-content: [2] - unicorn/prefer-top-level-await: [0] - unicorn/prefer-type-error: [0] - unicorn/prevent-abbreviations: [0] - unicorn/relative-url-style: [2] - unicorn/require-array-join-separator: [2] - unicorn/require-number-to-fixed-digits-argument: [2] - unicorn/require-post-message-target-origin: [0] - unicorn/string-content: [0] - unicorn/switch-case-braces: [0] - unicorn/template-indent: [2] - unicorn/text-encoding-identifier-case: [0] - unicorn/throw-new-error: [2] - use-isnan: [2] - valid-typeof: [2, {requireStringLiterals: true}] - vars-on-top: [0] - wc/attach-shadow-constructor: [2] - wc/define-tag-after-class-definition: [0] - wc/expose-class-on-global: [0] - wc/file-name-matches-element: [2] - wc/guard-define-call: [0] - wc/guard-super-call: [2] - wc/max-elements-per-file: [0] - wc/no-child-traversal-in-attributechangedcallback: [2] - wc/no-child-traversal-in-connectedcallback: [2] - wc/no-closed-shadow-root: [2] - wc/no-constructor-attributes: [2] - wc/no-constructor-params: [2] - wc/no-constructor: [2] - wc/no-customized-built-in-elements: [2] - wc/no-exports-with-element: [0] - wc/no-invalid-element-name: [2] - wc/no-invalid-extends: [2] - wc/no-method-prefixed-with-on: [2] - wc/no-self-class: [2] - wc/no-typos: [2] - wc/require-listener-teardown: [2] - wc/tag-name-matches-class: [2] - yoda: [2, never] diff --git a/.forgejo/issue_template/config.yml b/.forgejo/issue_template/config.yml index 0e3caf9280..f2ea8d945a 100644 --- a/.forgejo/issue_template/config.yml +++ b/.forgejo/issue_template/config.yml @@ -1,7 +1,7 @@ contact_links: - name: 🔓 Security Reports url: mailto:security@forgejo.org - about: "Please email (GPG: `A4676E79`) instead of opening a public issue." + about: "Please email (See https://forgejo.org/.well-known/security.txt)." - name: 💬 Matrix Chat Room url: https://matrix.to/#/#forgejo-chat:matrix.org about: Please ask questions and discuss configuration or deployment problems here. diff --git a/.forgejo/testdata/build-release/Dockerfile b/.forgejo/testdata/build-release/Dockerfile index 9c44dedddd..d10564359e 100644 --- a/.forgejo/testdata/build-release/Dockerfile +++ b/.forgejo/testdata/build-release/Dockerfile @@ -1,6 +1,6 @@ -FROM code.forgejo.org/oci/alpine:3.20 +FROM data.forgejo.org/oci/alpine:3.21 ARG RELEASE_VERSION=unkown LABEL maintainer="contact@forgejo.org" \ org.opencontainers.image.version="${RELEASE_VERSION}" RUN mkdir -p /app/gitea -RUN ( echo '#!/bin/sh' ; echo "echo forgejo v$RELEASE_VERSION" ) > /app/gitea/forgejo-cli ; chmod +x /app/gitea/forgejo-cli +RUN ( echo '#!/bin/sh' ; echo "echo forgejo v$RELEASE_VERSION" ) > /app/gitea/gitea ; chmod +x /app/gitea/gitea diff --git a/.forgejo/testdata/build-release/go.mod b/.forgejo/testdata/build-release/go.mod index 697bc87b98..585dcc4f3d 100644 --- a/.forgejo/testdata/build-release/go.mod +++ b/.forgejo/testdata/build-release/go.mod @@ -1,3 +1,3 @@ -module code.gitea.io/gitea +module forgejo.org -go 1.23.1 +go 1.23.3 diff --git a/.forgejo/workflows-composite/apt-install-from/action.yaml b/.forgejo/workflows-composite/apt-install-from/action.yaml new file mode 100644 index 0000000000..ab55883a11 --- /dev/null +++ b/.forgejo/workflows-composite/apt-install-from/action.yaml @@ -0,0 +1,32 @@ +inputs: + packages: + description: 'Packages to install' + required: true + release: + description: 'Release to install from' + default: testing + +runs: + using: "composite" + steps: + - name: setup apt package source + run: | + export DEBIAN_FRONTEND=noninteractive + echo "deb http://deb.debian.org/debian/ ${RELEASE} main" > "/etc/apt/sources.list.d/${RELEASE}.list" + wget -O- http://neuro.debian.net/lists/bookworm.de-fzj.libre | tee /etc/apt/sources.list.d/neurodebian.sources.list + apt-key adv --recv-keys --keyserver hkps://keyserver.ubuntu.com 0xA5D32F012649A5A9 + env: + RELEASE: ${{inputs.release}} + - name: install packages + run: | + apt-get update -qq + apt-get -q install -qq -y ${PACKAGES} + env: + PACKAGES: ${{inputs.packages}} + - name: remove temporary package list to prevent using it in other steps + run: | + rm "/etc/apt/sources.list.d/${RELEASE}.list" + rm "/etc/apt/sources.list.d/neurodebian.sources.list" + apt-get update -qq + env: + RELEASE: ${{inputs.release}} diff --git a/.forgejo/workflows-composite/build-backend/action.yaml b/.forgejo/workflows-composite/build-backend/action.yaml new file mode 100644 index 0000000000..68a99ffaf9 --- /dev/null +++ b/.forgejo/workflows-composite/build-backend/action.yaml @@ -0,0 +1,15 @@ +runs: + using: "composite" + steps: + - run: | + su forgejo -c 'make deps-backend' + - uses: https://data.forgejo.org/actions/cache@v4 + id: cache-backend + with: + path: ${{github.workspace}}/gitea + key: backend-build-${{ github.sha }} + - if: steps.cache-backend.outputs.cache-hit != 'true' + run: | + su forgejo -c 'make backend' + env: + TAGS: bindata diff --git a/.forgejo/workflows-composite/setup-cache-go/action.yaml b/.forgejo/workflows-composite/setup-cache-go/action.yaml new file mode 100644 index 0000000000..f2818a7635 --- /dev/null +++ b/.forgejo/workflows-composite/setup-cache-go/action.yaml @@ -0,0 +1,61 @@ +# SPDX-License-Identifier: MIT +name: 'Forgejo Actions to setup Go and cache dependencies' +author: 'Forgejo authors' +description: | + Wrap the setup-go with improved dependency caching. +inputs: + username: + description: 'User for which to manage the dependency cache' + default: root + +runs: + using: "composite" + steps: + - name: "Install zstd for faster caching" + run: | + apt-get update -qq + apt-get -q install -qq -y zstd + + - name: "Set up Go using setup-go" + uses: https://data.forgejo.org/actions/setup-go@v5 + id: go-version + with: + go-version-file: "go.mod" + # do not cache dependencies, we do this manually + cache: false + + - name: "Get go environment information" + id: go-environment + run: | + chmod 755 $HOME # ensure ${RUN_AS_USER} has permission when go is located in $HOME + export GOROOT="$(go env GOROOT)" + echo "modcache=$(su ${RUN_AS_USER} -c '${GOROOT}/bin/go env GOMODCACHE')" >> "$GITHUB_OUTPUT" + echo "cache=$(su ${RUN_AS_USER} -c '${GOROOT}/bin/go env GOCACHE')" >> "$GITHUB_OUTPUT" + env: + RUN_AS_USER: ${{ inputs.username }} + GO_VERSION: ${{ steps.go-version.outputs.go-version }} + + - name: "Create cache folders with correct permissions (for non-root users)" + if: inputs.username != 'root' + # when the cache is restored, only the permissions of the last part are restored + # so assuming that /home/user exists and we are restoring /home/user/go/pkg/mod, + # both folders will have the correct permissions, but + # /home/user/go and /home/user/go/pkg might be owned by root + run: | + su ${RUN_AS_USER} -c 'mkdir -p "${MODCACHE_DIR}" "${CACHE_DIR}"' + env: + RUN_AS_USER: ${{ inputs.username }} + MODCACHE_DIR: ${{ steps.go-environment.outputs.modcache }} + CACHE_DIR: ${{ steps.go-environment.outputs.cache }} + + - name: "Restore Go dependencies from cache or mark for later caching" + id: cache-deps + uses: https://data.forgejo.org/actions/cache@v4 + with: + key: setup-cache-go-deps-${{ runner.os }}-${{ inputs.username }}-${{ steps.go-version.outputs.go_version }}-${{ hashFiles('go.sum', 'go.mod') }} + restore-keys: | + setup-cache-go-deps-${{ runner.os }}-${{ inputs.username }}-${{ steps.go-version.outputs.go_version }}- + setup-cache-go-deps-${{ runner.os }}-${{ inputs.username }}- + path: | + ${{ steps.go-environment.outputs.modcache }} + ${{ steps.go-environment.outputs.cache }} diff --git a/.forgejo/workflows-composite/setup-env/action.yaml b/.forgejo/workflows-composite/setup-env/action.yaml new file mode 100644 index 0000000000..f19569a137 --- /dev/null +++ b/.forgejo/workflows-composite/setup-env/action.yaml @@ -0,0 +1,25 @@ +# TODO: +# - [ ] prepare a forgejo ci image with the necessary tools and forgejo user +runs: + using: "composite" + steps: + - name: setup user and permissions + run: | + git config --add safe.directory '*' + # ignore if the user already exists (like with the playwright image) + adduser --quiet --comment forgejo --disabled-password forgejo || true + chown -R forgejo:forgejo . + + - uses: ./.forgejo/workflows-composite/setup-cache-go + with: + username: forgejo + + - name: validate go version + run: | + set -ex + toolchain=$(grep -oP '(?<=toolchain ).+' go.mod) + version=$(go version | cut -d' ' -f3) + if dpkg --compare-versions ${version#go} lt ${toolchain#go}; then + echo "go version too low: $toolchain >= $version" + exit 1 + fi diff --git a/.forgejo/workflows/backport.yml b/.forgejo/workflows/backport.yml index 32a93edbc0..31c5c0cc3a 100644 --- a/.forgejo/workflows/backport.yml +++ b/.forgejo/workflows/backport.yml @@ -22,6 +22,8 @@ # `backport/v1.21` label on a merged pull request that can be backported # without conflict. # +name: issue-labels + on: pull_request_target: types: @@ -31,21 +33,21 @@ on: jobs: backporting: if: > - !startsWith(vars.ROLE, 'forgejo-') && ( + ( vars.ROLE == 'forgejo-coding' ) && ( github.event.pull_request.merged && contains(toJSON(github.event.pull_request.labels), 'backport/v') ) runs-on: docker container: - image: 'code.forgejo.org/oci/node:20-bookworm' + image: 'data.forgejo.org/oci/node:22-bookworm' steps: - name: event info run: | cat <<'EOF' ${{ toJSON(github) }} EOF - - uses: https://code.forgejo.org/actions/git-backporting@v4.8.0 + - uses: https://data.forgejo.org/actions/git-backporting@v4.8.4 with: target-branch-pattern: "^backport/(?(v.*))$" strategy: ort diff --git a/.forgejo/workflows/build-oci-image.yml b/.forgejo/workflows/build-oci-image.yml new file mode 100644 index 0000000000..8e843b41ee --- /dev/null +++ b/.forgejo/workflows/build-oci-image.yml @@ -0,0 +1,41 @@ +on: + push: + branches: + - 'forgejo' + tags: + - '*-git-annex*' + +jobs: + build-oci-image: + runs-on: docker + strategy: + matrix: + type: ["rootful", "rootless"] + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # fetch the full history so that the Forgejo version is determined properly + - name: Determine registry and username + id: determine-registry-and-username + run: | + echo "registry=${GITHUB_SERVER_URL#https://}" >> "$GITHUB_OUTPUT" + echo "username=${GITHUB_REPOSITORY%/*}" >> "$GITHUB_OUTPUT" + - name: Install Docker + run: curl -fsSL https://get.docker.com | sh + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + registry: ${{ steps.determine-registry-and-username.outputs.registry }} + username: ${{ steps.determine-registry-and-username.outputs.username }} + password: ${{ secrets.REGISTRY_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v6 + with: + context: . + file: ${{ (matrix.type == 'rootful' && 'Dockerfile') || (matrix.type == 'rootless' && 'Dockerfile.rootless') }} + push: true + tags: ${{ steps.determine-registry-and-username.outputs.registry }}/${{ github.repository }}:${{ github.ref_name }}${{ (matrix.type == 'rootful' && ' ') || (matrix.type == 'rootless' && '-rootless') }} diff --git a/.forgejo/workflows/build-release-integration.yml b/.forgejo/workflows/build-release-integration.yml index 610b8f0520..1af6d567dd 100644 --- a/.forgejo/workflows/build-release-integration.yml +++ b/.forgejo/workflows/build-release-integration.yml @@ -22,13 +22,13 @@ on: jobs: release-simulation: - if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} - runs-on: self-hosted + if: vars.ROLE == 'forgejo-coding' + runs-on: lxc-bookworm steps: - - uses: actions/checkout@v3 + - uses: https://data.forgejo.org/actions/checkout@v4 - id: forgejo - uses: https://code.forgejo.org/actions/setup-forgejo@v1 + uses: https://data.forgejo.org/actions/setup-forgejo@v2.0.4 with: user: root password: admin1234 diff --git a/.forgejo/workflows/build-release.yml b/.forgejo/workflows/build-release.yml index ce05f6d8ff..a34f3533fd 100644 --- a/.forgejo/workflows/build-release.yml +++ b/.forgejo/workflows/build-release.yml @@ -14,6 +14,12 @@ # secrets.CASCADE_DESTINATION_TOKEN: scope read:user, write:repository, write:issue # vars.CASCADE_DESTINATION_DOER: forgejo-ci # +# vars.SKIP_END_TO_END: `true` or `false` +# It must be `false` (or absent) so https://code.forgejo.org/forgejo/end-to-end is run +# with the newly built release. +# It must be set to `true` when a release is missing, for instance because it was +# removed and failed to upload. +# on: push: tags: 'v[0-9]+.[0-9]+.*' @@ -23,11 +29,11 @@ on: jobs: release: - runs-on: self-hosted + runs-on: lxc-bookworm # root is used for testing, allow it if: vars.ROLE == 'forgejo-integration' || github.repository_owner == 'root' steps: - - uses: actions/checkout@v3 + - uses: https://data.forgejo.org/actions/checkout@v4 with: fetch-depth: 0 @@ -37,11 +43,11 @@ jobs: repository="${{ github.repository }}" echo "value=${repository##*/}" >> "$GITHUB_OUTPUT" - - uses: https://code.forgejo.org/actions/setup-node@v3 + - uses: https://data.forgejo.org/actions/setup-node@v4 with: - node-version: 20 + node-version: 22 - - uses: https://code.forgejo.org/actions/setup-go@v4 + - uses: https://data.forgejo.org/actions/setup-go@v5 with: go-version-file: "go.mod" @@ -87,7 +93,7 @@ jobs: - name: cache node_modules id: node - uses: https://code.forgejo.org/actions/cache@v3 + uses: https://data.forgejo.org/actions/cache@v4 with: path: | node_modules @@ -158,7 +164,7 @@ jobs: - name: build container & release if: ${{ secrets.TOKEN != '' }} - uses: https://code.forgejo.org/forgejo/forgejo-build-publish/build@v5.1.1 + uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.4 with: forgejo: "${{ env.GITHUB_SERVER_URL }}" owner: "${{ env.GITHUB_REPOSITORY_OWNER }}" @@ -170,14 +176,14 @@ jobs: platforms: linux/amd64,linux/arm64,linux/arm/v6 release-notes: "${{ steps.release-notes.outputs.value }}" binary-name: forgejo - binary-path: /app/gitea/forgejo-cli + binary-path: /app/gitea/gitea override: "${{ steps.release-info.outputs.override }}" verify-labels: "maintainer=contact@forgejo.org,org.opencontainers.image.version=${{ steps.release-info.outputs.version }}" verbose: ${{ vars.VERBOSE || secrets.VERBOSE || 'false' }} - name: build rootless container if: ${{ secrets.TOKEN != '' }} - uses: https://code.forgejo.org/forgejo/forgejo-build-publish/build@v5.1.1 + uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.4 with: forgejo: "${{ env.GITHUB_SERVER_URL }}" owner: "${{ env.GITHUB_REPOSITORY_OWNER }}" @@ -194,8 +200,8 @@ jobs: verbose: ${{ vars.VERBOSE || secrets.VERBOSE || 'false' }} - name: end-to-end tests - if: ${{ secrets.TOKEN != '' && vars.ROLE == 'forgejo-integration' }} - uses: https://code.forgejo.org/actions/cascading-pr@v2 + if: ${{ secrets.TOKEN != '' && vars.ROLE == 'forgejo-integration' && vars.SKIP_END_TO_END != 'true' }} + uses: https://data.forgejo.org/actions/cascading-pr@v2.2.0 with: origin-url: ${{ env.GITHUB_SERVER_URL }} origin-repo: ${{ github.repository }} diff --git a/.forgejo/workflows/cascade-setup-end-to-end.yml b/.forgejo/workflows/cascade-setup-end-to-end.yml index 404bbe8fa6..7c8c56de13 100644 --- a/.forgejo/workflows/cascade-setup-end-to-end.yml +++ b/.forgejo/workflows/cascade-setup-end-to-end.yml @@ -12,8 +12,10 @@ # whatever is in the default branch instead # # - after it is merged, double check it works by setting the -# run-end-to-end-test on a pull request (any pull request will doe +# run-end-to-end-test on a pull request (any pull request will do) # +name: issue-labels + on: push: branches: @@ -23,42 +25,23 @@ on: - labeled jobs: - info: - if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} - runs-on: docker - container: - image: code.forgejo.org/oci/node:20-bookworm - steps: - - name: event - run: | - echo github.event.pull_request.head.repo.fork = ${{ github.event.pull_request.head.repo.fork }} - echo github.event.action = ${{ github.event.action }} - echo github.event.pull_request.merged = ${{ github.event.pull_request.merged }} - echo github.event.pull_request.labels.*.name - cat <<'EOF' - ${{ toJSON(github.event.pull_request.labels.*.name) }} - EOF - cat <<'EOF' - ${{ toJSON(github.event) }} - EOF - cascade: if: > - !startsWith(vars.ROLE, 'forgejo-') && ( + vars.ROLE == 'forgejo-coding' && ( github.event_name == 'push' || ( - github.event.action == 'label_updated' && contains(github.event.pull_request.labels.*.name, 'run-end-to-end-tests') + github.event.action == 'label_updated' && github.event.label.name == 'run-end-to-end-tests' ) ) runs-on: docker container: - image: code.forgejo.org/oci/node:20-bookworm + image: data.forgejo.org/oci/node:22-bookworm steps: - - uses: actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v4 with: fetch-depth: '0' show-progress: 'false' - - uses: actions/cascading-pr@v2 + - uses: https://data.forgejo.org/actions/cascading-pr@v2.2.0 with: origin-url: ${{ env.GITHUB_SERVER_URL }} origin-repo: ${{ github.repository }} diff --git a/.forgejo/workflows/e2e.yml b/.forgejo/workflows/e2e.yml deleted file mode 100644 index 9f2fbb0fa2..0000000000 --- a/.forgejo/workflows/e2e.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: e2e - -on: - pull_request: - paths: - - Makefile - - playwright.config.js - - .forgejo/workflows/e2e.yml - - tests/e2e/** - - web_src/js/** - - web_src/css/form.css - - templates/webhook/shared-settings.tmpl - - templates/org/team/new.tmpl - -jobs: - test-e2e: - if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} - runs-on: docker - container: - image: 'code.forgejo.org/oci/playwright:latest' - steps: - - uses: https://code.forgejo.org/actions/checkout@v4 - - uses: https://code.forgejo.org/actions/setup-go@v4 - with: - go-version-file: "go.mod" - - run: | - git config --add safe.directory '*' - chown -R forgejo:forgejo . - - run: | - su forgejo -c 'make deps-frontend frontend deps-backend' - - run: | - su forgejo -c 'make backend' - - run: | - su forgejo -c 'make generate test-e2e-sqlite' - timeout-minutes: 40 - env: - USE_REPO_TEST_DIR: 1 diff --git a/.forgejo/workflows/forgejo-integration-cleanup.yml b/.forgejo/workflows/forgejo-integration-cleanup.yml index 049679a1eb..d490e3b2f2 100644 --- a/.forgejo/workflows/forgejo-integration-cleanup.yml +++ b/.forgejo/workflows/forgejo-integration-cleanup.yml @@ -9,7 +9,7 @@ jobs: if: vars.ROLE == 'forgejo-integration' runs-on: docker container: - image: 'code.forgejo.org/oci/node:20-bookworm' + image: 'data.forgejo.org/oci/node:22-bookworm' steps: - name: apt install curl jq diff --git a/.forgejo/workflows/merge-requirements.yml b/.forgejo/workflows/merge-requirements.yml new file mode 100644 index 0000000000..b052f18c06 --- /dev/null +++ b/.forgejo/workflows/merge-requirements.yml @@ -0,0 +1,45 @@ +# Copyright 2024 The Forgejo Authors +# SPDX-License-Identifier: MIT + +name: requirements + +on: + pull_request: + types: + - labeled + - edited + - opened + - synchronize + +jobs: + merge-conditions: + if: vars.ROLE == 'forgejo-coding' + runs-on: docker + container: + image: 'data.forgejo.org/oci/node:22-bookworm' + steps: + - name: Debug output + run: | + cat <<'EOF' + ${{ toJSON(github) }} + EOF + - name: Missing test label + if: > + !( + contains(toJSON(github.event.pull_request.labels), 'test/present') + || contains(toJSON(github.event.pull_request.labels), 'test/not-needed') + || contains(toJSON(github.event.pull_request.labels), 'test/manual') + ) + run: | + echo "Test label must be set to either 'present', 'not-needed' or 'manual'." + exit 1 + - name: Missing manual test instructions + if: > + ( + contains(toJSON(github.event.pull_request.labels), 'test/manual') + && !contains(toJSON(github.event.pull_request.body), '# Test') + ) + run: | + echo "Manual test label is set. The PR description needs to contain test steps introduced by a heading like:" + echo "# Testing" + exit 1 diff --git a/.forgejo/workflows/milestone.yml b/.forgejo/workflows/milestone.yml new file mode 100644 index 0000000000..9a51c515d0 --- /dev/null +++ b/.forgejo/workflows/milestone.yml @@ -0,0 +1,24 @@ +# Copyright 2024 The Forgejo Authors +# SPDX-License-Identifier: MIT +# +name: milestone + +on: + pull_request_target: + types: + - closed + +jobs: + set: + if: vars.ROLE == 'forgejo-coding' && github.event.pull_request.merged + runs-on: docker + container: + image: 'data.forgejo.org/oci/ci:1' + steps: + - uses: https://data.forgejo.org/forgejo/set-milestone@v1.0.0 + with: + forgejo: https://codeberg.org + repository: forgejo/forgejo + token: ${{ secrets.SET_MILESTONE_TOKEN }} + pr-number: ${{ github.event.pull_request.number }} + verbose: ${{ vars.SET_MILESTONE_VERBOSE }} diff --git a/.forgejo/workflows/mirror.yml b/.forgejo/workflows/mirror.yml index fd222115ac..d45a2f6f77 100644 --- a/.forgejo/workflows/mirror.yml +++ b/.forgejo/workflows/mirror.yml @@ -11,7 +11,7 @@ jobs: if: ${{ secrets.MIRROR_TOKEN != '' }} runs-on: docker container: - image: 'code.forgejo.org/oci/node:20-bookworm' + image: 'data.forgejo.org/oci/node:22-bookworm' steps: - name: git push {v*/,}forgejo run: | diff --git a/.forgejo/workflows/publish-release.yml b/.forgejo/workflows/publish-release.yml index 41c884c2d1..27d3b9383e 100644 --- a/.forgejo/workflows/publish-release.yml +++ b/.forgejo/workflows/publish-release.yml @@ -2,6 +2,8 @@ # # See also https://forgejo.org/docs/next/contributor/release/#stable-release-process # +# TOKEN_NEXT_DIGEST is a token with write repository access to https://invisible.forgejo.org/infrastructure/next-digest issued by https://invisible.forgejo.org/forgejo-next-digest +# # https://codeberg.org/forgejo-experimental/forgejo # # Copies a release from codeberg.org/forgejo-integration to codeberg.org/forgejo-experimental @@ -14,7 +16,7 @@ # vars.DOER: forgejo-experimental-ci # secrets.TOKEN: # -# http://private.forgejo.org/forgejo/forgejo +# http://invisible.forgejo.org/forgejo/forgejo # # Copies & sign a release from codeberg.org/forgejo-integration to codeberg.org/forgejo # @@ -36,20 +38,20 @@ on: jobs: publish: - runs-on: self-hosted + runs-on: lxc-bookworm if: vars.DOER != '' && vars.FORGEJO != '' && vars.TO_OWNER != '' && vars.FROM_OWNER != '' && secrets.TOKEN != '' steps: - - uses: actions/checkout@v3 + - uses: https://data.forgejo.org/actions/checkout@v4 - name: copy & sign - uses: https://code.forgejo.org/forgejo/forgejo-build-publish/publish@v5 + uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.3.4 with: from-forgejo: ${{ vars.FORGEJO }} to-forgejo: ${{ vars.FORGEJO }} from-owner: ${{ vars.FROM_OWNER }} to-owner: ${{ vars.TO_OWNER }} repo: ${{ vars.REPO }} - release-notes: "See https://codeberg.org/forgejo/forgejo/src/branch/forgejo/RELEASE-NOTES.md#{ANCHOR}" + release-notes: "See https://codeberg.org/forgejo/forgejo/src/branch/forgejo/release-notes-published/{VERSION}.md" ref-name: ${{ github.ref_name }} sha: ${{ github.sha }} from-token: ${{ secrets.TOKEN }} @@ -59,30 +61,28 @@ jobs: gpg-passphrase: ${{ secrets.GPG_PASSPHRASE }} verbose: ${{ vars.VERBOSE }} - - name: upgrade v*.next.forgejo.org - run: | - export DEBIAN_FRONTEND=noninteractive - apt-get update -qq - apt-get -q install -y -qq curl - version="${{ github.ref_name }}" - version=${version##*v} - major=$(echo $version | sed -E -e 's/^([0-9]+).*/\1/') - # https://forgejo.org/docs/next/developer/infrastructure - curl -o /dev/null -sS https://v$major.next.forgejo.org/.well-known/wakeup-on-logs/forgejo-v$major + - name: get trigger mirror issue + id: mirror + uses: https://data.forgejo.org/infrastructure/issue-action/get@v1.3.0 + with: + forgejo: https://code.forgejo.org + repository: forgejo/forgejo + labels: mirror-trigger - - name: set up go for the DNS update below - if: vars.ROLE == 'forgejo-experimental' && secrets.OVH_APP_KEY != '' - uses: https://code.forgejo.org/actions/setup-go@v4 + - name: trigger the mirror + uses: https://data.forgejo.org/infrastructure/issue-action/set@v1.3.0 with: - go-version-file: "go.mod" - - name: update the _release.experimental DNS record - if: vars.ROLE == 'forgejo-experimental' && secrets.OVH_APP_KEY != '' - uses: https://code.forgejo.org/actions/ovh-dns-update@v1 + forgejo: https://code.forgejo.org + repository: forgejo/forgejo + token: ${{ secrets.LABEL_ISSUE_FORGEJO_MIRROR_TOKEN }} + numbers: ${{ steps.mirror.outputs.numbers }} + label-wait-if-exists: 3600 + label: trigger + + - name: upgrade v*.next.forgejo.org + uses: https://data.forgejo.org/infrastructure/next-digest@v1.1.0 with: - subdomain: _release.experimental - domain: forgejo.com # there is a CNAME from .org to .com (for security reasons) - record-id: 5283602601 - value: v=${{ github.ref_name }} - ovh-app-key: ${{ secrets.OVH_APP_KEY }} - ovh-app-secret: ${{ secrets.OVH_APP_SECRET }} - ovh-consumer-key: ${{ secrets.OVH_CON_KEY }} + url: https://placeholder:${{ secrets.TOKEN_NEXT_DIGEST }}@invisible.forgejo.org/infrastructure/next-digest + ref_name: '${{ github.ref_name }}' + image: 'codeberg.org/forgejo-experimental/forgejo' + tag_suffix: '-rootless' diff --git a/.forgejo/workflows/release-notes-assistant-milestones.yml b/.forgejo/workflows/release-notes-assistant-milestones.yml index fb7bba1d52..db33d30afb 100644 --- a/.forgejo/workflows/release-notes-assistant-milestones.yml +++ b/.forgejo/workflows/release-notes-assistant-milestones.yml @@ -6,14 +6,14 @@ on: jobs: release-notes: - if: ${{ !startsWith(vars.ROLE, 'forgejo-') + if: vars.ROLE == 'forgejo-coding' runs-on: docker container: - image: 'code.forgejo.org/oci/node:20-bookworm' + image: 'data.forgejo.org/oci/node:22-bookworm' steps: - - uses: https://code.forgejo.org/actions/checkout@v3 + - uses: https://data.forgejo.org/actions/checkout@v4 - - uses: https://code.forgejo.org/actions/setup-go@v4 + - uses: https://data.forgejo.org/actions/setup-go@v5 with: go-version-file: "go.mod" cache: false diff --git a/.forgejo/workflows/release-notes-assistant.yml b/.forgejo/workflows/release-notes-assistant.yml index dd67b4e203..92edd912ec 100644 --- a/.forgejo/workflows/release-notes-assistant.yml +++ b/.forgejo/workflows/release-notes-assistant.yml @@ -1,3 +1,5 @@ +name: issue-labels + on: pull_request_target: types: @@ -7,12 +9,12 @@ on: jobs: release-notes: - if: ${{ !startsWith(vars.ROLE, 'forgejo-') && contains(github.event.pull_request.labels.*.name, 'worth a release-note') }} + if: ( vars.ROLE == 'forgejo-coding' ) && contains(github.event.pull_request.labels.*.name, 'worth a release-note') runs-on: docker container: - image: 'code.forgejo.org/oci/node:20-bookworm' + image: 'data.forgejo.org/oci/node:22-bookworm' steps: - - uses: https://code.forgejo.org/actions/checkout@v3 + - uses: https://data.forgejo.org/actions/checkout@v4 - name: event run: | @@ -23,7 +25,7 @@ jobs: ${{ toJSON(github.event) }} EOF - - uses: https://code.forgejo.org/actions/setup-go@v4 + - uses: https://data.forgejo.org/actions/setup-go@v5 with: go-version-file: "go.mod" cache: false diff --git a/.forgejo/workflows/renovate.yml b/.forgejo/workflows/renovate.yml index 400cd453b3..dbba9a82bb 100644 --- a/.forgejo/workflows/renovate.yml +++ b/.forgejo/workflows/renovate.yml @@ -8,7 +8,9 @@ name: renovate on: push: branches: - - 'renovate/**' # self-test updates + - renovate/** # self-test updates + paths: + - .forgejo/workflows/renovate.yml schedule: - cron: '0 0/2 * * *' workflow_dispatch: @@ -16,18 +18,21 @@ on: env: RENOVATE_DRY_RUN: ${{ (github.event_name != 'schedule' && github.ref_name != github.event.repository.default_branch) && 'full' || '' }} RENOVATE_REPOSITORIES: ${{ github.repository }} + # fix because 10.0.0-58-7e1df53+gitea-1.22.0 < 10.0.0 for semver + # and codeberg api returns such versions from `git describe --tags` + RENOVATE_X_PLATFORM_VERSION: 10.0.0+gitea-1.22.0 jobs: renovate: - if: ${{ secrets.RENOVATE_TOKEN != '' }} + if: vars.ROLE == 'forgejo-coding' && secrets.RENOVATE_TOKEN != '' runs-on: docker container: - image: code.forgejo.org/forgejo-contrib/renovate:38.93.2 + image: data.forgejo.org/renovate/renovate:39.212.0 steps: - name: Load renovate repo cache - uses: https://code.forgejo.org/actions/cache/restore@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + uses: https://data.forgejo.org/actions/cache/restore@3624ceb22c1c5a301c8db4169662070a689d9ea8 # v4.1.1 with: path: | .tmp/cache/renovate/repository @@ -60,7 +65,7 @@ jobs: - name: Save renovate repo cache if: always() && env.RENOVATE_DRY_RUN != 'full' - uses: https://code.forgejo.org/actions/cache/save@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + uses: https://data.forgejo.org/actions/cache/save@3624ceb22c1c5a301c8db4169662070a689d9ea8 # v4.1.1 with: path: | .tmp/cache/renovate/repository diff --git a/.forgejo/workflows/testing.yml b/.forgejo/workflows/testing.yml index 725cd242ee..713dfebf63 100644 --- a/.forgejo/workflows/testing.yml +++ b/.forgejo/workflows/testing.yml @@ -6,332 +6,271 @@ on: branches: - 'forgejo*' - 'v*/forgejo*' + workflow_dispatch: jobs: backend-checks: - if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} runs-on: docker container: - image: 'code.forgejo.org/oci/node:20-bookworm' + image: 'data.forgejo.org/oci/node:22-bookworm' + options: --tmpfs /tmp:exec,noatime steps: - name: event info run: | cat <<'EOF' ${{ toJSON(github) }} EOF - - uses: https://code.forgejo.org/actions/checkout@v3 - - uses: https://code.forgejo.org/actions/setup-go@v4 - with: - go-version-file: "go.mod" - - run: make deps-backend deps-tools - - run: make --always-make -j$(nproc) lint-backend tidy-check swagger-check fmt-check swagger-validate # ensure the "go-licenses" make target runs - - run: | - make backend - env: - TAGS: bindata - - uses: actions/cache@v4 - with: - path: '/workspace/forgejo/forgejo/gitea' - key: backend-build-${{ github.sha }} + - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: ./.forgejo/workflows-composite/setup-env + - run: su forgejo -c 'make deps-backend deps-tools' + - run: su forgejo -c 'make --always-make -j$(nproc) lint-backend tidy-check swagger-check lint-swagger fmt-check swagger-validate' # ensure the "go-licenses" make target runs + - uses: ./.forgejo/workflows-composite/build-backend frontend-checks: - if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} runs-on: docker container: - image: 'code.forgejo.org/oci/node:20-bookworm' + image: 'data.forgejo.org/oci/node:22-bookworm' + options: --tmpfs /tmp:exec,noatime steps: - - uses: https://code.forgejo.org/actions/checkout@v3 + - uses: https://data.forgejo.org/actions/checkout@v4 - run: make deps-frontend - run: make lint-frontend - run: make checks-frontend - run: make test-frontend-coverage - run: make frontend + - name: Install zstd for cache saving + # works around https://github.com/actions/cache/issues/1169, because the + # consuming job has zstd and doesn't restore the cache otherwise + run: | + apt-get update -qq + apt-get -q install -qq -y zstd + - name: "Cache frontend build for playwright testing" + uses: https://data.forgejo.org/actions/cache/save@v4 + with: + path: ${{github.workspace}}/public/assets + key: frontend-build-${{ github.sha }} test-unit: - if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} + if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing' runs-on: docker needs: [backend-checks, frontend-checks] container: - image: 'code.forgejo.org/oci/node:20-bookworm' + image: 'data.forgejo.org/oci/node:22-bookworm' + options: --tmpfs /tmp:exec,noatime services: elasticsearch: - image: docker.io/bitnami/elasticsearch:7 + image: data.forgejo.org/oci/bitnami/elasticsearch:7 + options: --tmpfs /bitnami/elasticsearch/data env: discovery.type: single-node ES_JAVA_OPTS: "-Xms512m -Xmx512m" minio: - image: docker.io/bitnami/minio:2024.8.17 + image: data.forgejo.org/oci/bitnami/minio:2024.8.17 options: >- - --hostname gitea.minio + --hostname gitea.minio --tmpfs /bitnami/minio/data:noatime env: MINIO_DOMAIN: minio MINIO_ROOT_USER: 123456 MINIO_ROOT_PASSWORD: 12345678 steps: - - uses: https://code.forgejo.org/actions/checkout@v3 - - uses: https://code.forgejo.org/actions/setup-go@v4 - with: - go-version-file: "go.mod" - - run: | - git config --add safe.directory '*' - adduser --quiet --comment forgejo --disabled-password forgejo - chown -R forgejo:forgejo . + - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: ./.forgejo/workflows-composite/setup-env - name: install git >= 2.42 - run: | - export DEBIAN_FRONTEND=noninteractive - echo deb http://deb.debian.org/debian/ testing main > /etc/apt/sources.list.d/testing.list - apt-get update -qq - apt-get -q install -qq -y git - rm /etc/apt/sources.list.d/testing.list - apt-get update -qq + uses: ./.forgejo/workflows-composite/apt-install-from + with: + packages: git - name: test release-notes-assistant.sh run: | apt-get -q install -qq -y jq ./release-notes-assistant.sh test_main - - run: | - su forgejo -c 'make deps-backend' - - uses: actions/cache/restore@v4 - id: cache-backend - with: - path: '/workspace/forgejo/forgejo/gitea' - key: backend-build-${{ github.sha }} - - if: steps.cache-backend.outputs.cache-hit != 'true' - run: | - su forgejo -c 'make backend' - env: - TAGS: bindata + - uses: ./.forgejo/workflows-composite/build-backend - run: | su forgejo -c 'make test-backend test-check' - timeout-minutes: 50 + timeout-minutes: 120 env: RACE_ENABLED: 'true' TAGS: bindata TEST_ELASTICSEARCH_URL: http://elasticsearch:9200 - test-remote-cacher: - if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} + test-e2e: + if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing' runs-on: docker needs: [backend-checks, frontend-checks] container: - image: 'code.forgejo.org/oci/node:20-bookworm' + image: 'data.forgejo.org/oci/playwright:latest' + options: --tmpfs /tmp:exec,noatime + steps: + - uses: https://data.forgejo.org/actions/checkout@v4 + with: + fetch-depth: 20 + - uses: ./.forgejo/workflows-composite/setup-env + - name: "Restore frontend build" + uses: https://data.forgejo.org/actions/cache/restore@v4 + id: cache-frontend + with: + path: ${{github.workspace}}/public/assets + key: frontend-build-${{ github.sha }} + - name: "Build frontend (if not cached)" + if: steps.cache-frontend.outputs.cache-hit != 'true' + run: | + su forgejo -c 'make deps-frontend frontend' + - uses: ./.forgejo/workflows-composite/build-backend + - name: Get changed files + id: changed-files + uses: https://data.forgejo.org/tj-actions/changed-files@v45 + with: + separator: '\n' + - run: | + su forgejo -c 'make generate test-e2e-sqlite' + timeout-minutes: 120 + env: + USE_REPO_TEST_DIR: 1 + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1 + CHANGED_FILES: ${{steps.changed-files.outputs.all_changed_files}} + - name: Upload test artifacts on failure + if: failure() + uses: https://data.forgejo.org/forgejo/upload-artifact@v4 + with: + name: test-artifacts.zip + path: tests/e2e/test-artifacts/ + retention-days: 3 + test-remote-cacher: + if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing' + runs-on: docker + needs: [backend-checks, frontend-checks, test-unit] + container: + image: 'data.forgejo.org/oci/node:22-bookworm' + options: --tmpfs /tmp:exec,noatime + name: ${{ format('test-remote-cacher ({0})', matrix.cacher.name) }} strategy: matrix: cacher: - # redis - - image: docker.io/bitnami/redis:7.2 - port: 6379 - # redict - - image: registry.redict.io/redict:7.3.0-scratch - port: 6379 - # valkey - - image: docker.io/bitnami/valkey:7.2 - port: 6379 - # garnet - - image: ghcr.io/microsoft/garnet-alpine:1.0.14 - port: 6379 + - name: redis + image: data.forgejo.org/oci/bitnami/redis:7.2 + options: --tmpfs /bitnami/redis/data:noatime + - name: redict + image: registry.redict.io/redict:7.3.0-scratch + options: --tmpfs /data:noatime + - name: valkey + image: data.forgejo.org/oci/bitnami/valkey:7.2 + options: --tmpfs /bitnami/redis/data:noatime + - name: garnet + image: ghcr.io/microsoft/garnet-alpine:1.0.14 + options: --tmpfs /data:noatime services: cacher: image: ${{ matrix.cacher.image }} options: ${{ matrix.cacher.options }} steps: - - uses: https://code.forgejo.org/actions/checkout@v3 - - uses: https://code.forgejo.org/actions/setup-go@v4 - with: - go-version-file: "go.mod" - - run: | - git config --add safe.directory '*' - adduser --quiet --comment forgejo --disabled-password forgejo - chown -R forgejo:forgejo . + - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: ./.forgejo/workflows-composite/setup-env - name: install git >= 2.42 - run: | - export DEBIAN_FRONTEND=noninteractive - echo deb http://deb.debian.org/debian/ testing main > /etc/apt/sources.list.d/testing.list - apt-get update -qq - apt-get -q install -qq -y git - rm /etc/apt/sources.list.d/testing.list - apt-get update -qq - - run: | - su forgejo -c 'make deps-backend' - - uses: actions/cache/restore@v4 - id: cache-backend + uses: ./.forgejo/workflows-composite/apt-install-from with: - path: '/workspace/forgejo/forgejo/gitea' - key: backend-build-${{ github.sha }} - - if: steps.cache-backend.outputs.cache-hit != 'true' - run: | - su forgejo -c 'make backend' - env: - TAGS: bindata + packages: git + - uses: ./.forgejo/workflows-composite/build-backend - run: | su forgejo -c 'make test-remote-cacher test-check' - timeout-minutes: 50 + timeout-minutes: 120 env: RACE_ENABLED: 'true' TAGS: bindata TEST_REDIS_SERVER: cacher:${{ matrix.cacher.port }} test-mysql: - if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} runs-on: docker needs: [backend-checks, frontend-checks] container: - image: 'code.forgejo.org/oci/node:20-bookworm' + image: 'data.forgejo.org/oci/node:22-bookworm' + options: --tmpfs /tmp:exec,noatime services: mysql: - image: 'docker.io/bitnami/mysql:8.4' + image: 'data.forgejo.org/oci/bitnami/mysql:8.4' env: ALLOW_EMPTY_PASSWORD: yes MYSQL_DATABASE: testgitea # # See also https://codeberg.org/forgejo/forgejo/issues/976 # - MYSQL_EXTRA_FLAGS: --innodb-adaptive-flushing=OFF --innodb-buffer-pool-size=4G --innodb-log-buffer-size=128M --innodb-flush-log-at-trx-commit=0 --innodb-flush-log-at-timeout=30 --innodb-flush-method=nosync --innodb-fsync-threshold=1000000000 + MYSQL_EXTRA_FLAGS: --innodb-adaptive-flushing=OFF --innodb-buffer-pool-size=4G --innodb-log-buffer-size=128M --innodb-flush-log-at-trx-commit=0 --innodb-flush-log-at-timeout=30 --innodb-flush-method=nosync --innodb-fsync-threshold=1000000000 --disable-log-bin + options: --tmpfs /bitnami/mysql/data:noatime steps: - - uses: https://code.forgejo.org/actions/checkout@v3 - - uses: https://code.forgejo.org/actions/setup-go@v4 - with: - go-version-file: "go.mod" + - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: ./.forgejo/workflows-composite/setup-env - name: install dependencies & git >= 2.42 - run: | - export DEBIAN_FRONTEND=noninteractive - echo deb http://deb.debian.org/debian/ testing main > /etc/apt/sources.list.d/testing.list - apt-get update -qq - apt-get install --no-install-recommends -qq -y git git-lfs - rm /etc/apt/sources.list.d/testing.list - apt-get update -qq - - name: setup user and permissions - run: | - git config --add safe.directory '*' - adduser --quiet --comment forgejo --disabled-password forgejo - chown -R forgejo:forgejo . - - run: | - su forgejo -c 'make deps-backend' - - uses: actions/cache/restore@v4 - id: cache-backend + uses: ./.forgejo/workflows-composite/apt-install-from with: - path: '/workspace/forgejo/forgejo/gitea' - key: backend-build-${{ github.sha }} - - if: steps.cache-backend.outputs.cache-hit != 'true' - run: | - su forgejo -c 'make backend' - env: - TAGS: bindata + packages: git git-annex-standalone git-lfs + - uses: ./.forgejo/workflows-composite/build-backend - run: | su forgejo -c 'make test-mysql-migration test-mysql' - timeout-minutes: 50 env: USE_REPO_TEST_DIR: 1 test-pgsql: - if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} runs-on: docker needs: [backend-checks, frontend-checks] container: - image: 'code.forgejo.org/oci/node:20-bookworm' + image: 'data.forgejo.org/oci/node:22-bookworm' + options: --tmpfs /tmp:exec,noatime services: minio: - image: docker.io/bitnami/minio:2024.8.17 + image: data.forgejo.org/oci/bitnami/minio:2024.8.17 env: MINIO_ROOT_USER: 123456 MINIO_ROOT_PASSWORD: 12345678 + options: --tmpfs /bitnami/minio/data ldap: - image: docker.io/gitea/test-openldap:latest + image: data.forgejo.org/oci/test-openldap:latest pgsql: - image: 'code.forgejo.org/oci/postgres:15' + image: data.forgejo.org/oci/bitnami/postgresql:16 env: - POSTGRES_DB: test - POSTGRES_PASSWORD: postgres + POSTGRESQL_DATABASE: test + POSTGRESQL_PASSWORD: postgres + POSTGRESQL_FSYNC: off + POSTGRESQL_EXTRA_FLAGS: -c full_page_writes=off + options: --tmpfs /bitnami/postgresql steps: - - uses: https://code.forgejo.org/actions/checkout@v3 - - uses: https://code.forgejo.org/actions/setup-go@v4 - with: - go-version-file: "go.mod" + - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: ./.forgejo/workflows-composite/setup-env - name: install dependencies & git >= 2.42 - run: | - export DEBIAN_FRONTEND=noninteractive - echo deb http://deb.debian.org/debian/ testing main > /etc/apt/sources.list.d/testing.list - apt-get update -qq - apt-get install --no-install-recommends -qq -y git git-lfs - rm /etc/apt/sources.list.d/testing.list - apt-get update -qq - - name: setup user and permissions - run: | - git config --add safe.directory '*' - adduser --quiet --comment forgejo --disabled-password forgejo - chown -R forgejo:forgejo . - - run: | - su forgejo -c 'make deps-backend' - - uses: actions/cache/restore@v4 - id: cache-backend + uses: ./.forgejo/workflows-composite/apt-install-from with: - path: '/workspace/forgejo/forgejo/gitea' - key: backend-build-${{ github.sha }} - - if: steps.cache-backend.outputs.cache-hit != 'true' - run: | - su forgejo -c 'make backend' - env: - TAGS: bindata + packages: git git-annex-standalone git-lfs + - uses: ./.forgejo/workflows-composite/build-backend - run: | su forgejo -c 'make test-pgsql-migration test-pgsql' - timeout-minutes: 50 env: RACE_ENABLED: true USE_REPO_TEST_DIR: 1 TEST_LDAP: 1 test-sqlite: - if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} runs-on: docker needs: [backend-checks, frontend-checks] container: - image: 'code.forgejo.org/oci/node:20-bookworm' + image: 'data.forgejo.org/oci/node:22-bookworm' + options: --tmpfs /tmp:exec,noatime steps: - - uses: https://code.forgejo.org/actions/checkout@v3 - - uses: https://code.forgejo.org/actions/setup-go@v4 - with: - go-version-file: "go.mod" + - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: ./.forgejo/workflows-composite/setup-env - name: install dependencies & git >= 2.42 - run: | - export DEBIAN_FRONTEND=noninteractive - echo deb http://deb.debian.org/debian/ testing main > /etc/apt/sources.list.d/testing.list - apt-get update -qq - apt-get install --no-install-recommends -qq -y git git-lfs - rm /etc/apt/sources.list.d/testing.list - apt-get update -qq - - name: setup user and permissions - run: | - git config --add safe.directory '*' - adduser --quiet --comment forgejo --disabled-password forgejo - chown -R forgejo:forgejo . - - run: | - su forgejo -c 'make deps-backend' - - uses: actions/cache/restore@v4 - id: cache-backend + uses: ./.forgejo/workflows-composite/apt-install-from with: - path: '/workspace/forgejo/forgejo/gitea' - key: backend-build-${{ github.sha }} - - if: steps.cache-backend.outputs.cache-hit != 'true' - run: | - su forgejo -c 'make backend' - env: - TAGS: bindata sqlite sqlite_unlock_notify + packages: git git-annex-standalone git-lfs + - uses: ./.forgejo/workflows-composite/build-backend - run: | su forgejo -c 'make test-sqlite-migration test-sqlite' - timeout-minutes: 50 env: TAGS: sqlite sqlite_unlock_notify RACE_ENABLED: true TEST_TAGS: sqlite sqlite_unlock_notify USE_REPO_TEST_DIR: 1 security-check: - if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} runs-on: docker needs: - test-sqlite - test-pgsql - test-mysql - - test-remote-cacher - - test-unit container: - image: 'code.forgejo.org/oci/node:20-bookworm' + image: 'data.forgejo.org/oci/node:22-bookworm' + options: --tmpfs /tmp:exec,noatime steps: - - uses: https://code.forgejo.org/actions/checkout@v3 - - uses: https://code.forgejo.org/actions/setup-go@v4 - with: - go-version-file: "go.mod" - - run: make deps-backend deps-tools - - run: make security-check + - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: ./.forgejo/workflows-composite/setup-env + - run: su forgejo -c 'make deps-backend deps-tools' + - run: su forgejo -c 'make security-check' diff --git a/.gitignore b/.gitignore index 7f40d0ba55..744e24a09a 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,7 @@ _testmain.go *coverage.out coverage.all +coverage/ cpu.out /modules/migration/bindata.go @@ -56,6 +57,7 @@ cpu.out /gitea-vet /debug /integrations.test +/forgejo /bin /dist @@ -72,6 +74,7 @@ cpu.out /tests/e2e/reports /tests/e2e/test-artifacts /tests/e2e/test-snapshots +/tests/e2e/.auth /tests/*.ini /tests/**/*.git/**/*.sample /node_modules @@ -115,6 +118,9 @@ prime/ *_source.tar.bz2 .DS_Store +# Direnv configuration +/.envrc + # nix-direnv generated files .direnv/ diff --git a/.golangci.yml b/.golangci.yml index 4a20269b0e..136c0e624a 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -19,12 +19,12 @@ linters: - revive - staticcheck - stylecheck - - tenv - testifylint - typecheck - unconvert - unused - unparam + - usetesting - wastedassign run: @@ -77,6 +77,8 @@ linters-settings: - name: unreachable-code - name: var-declaration - name: var-naming + - name: redefines-builtin-id + disabled: true gofumpt: extra-rules: true depguard: @@ -91,7 +93,7 @@ linters-settings: desc: use os or io instead - pkg: golang.org/x/exp desc: it's experimental and unreliable - - pkg: code.gitea.io/gitea/modules/git/internal + - pkg: forgejo.org/modules/git/internal desc: do not use the internal package, use AddXxx function instead - pkg: gopkg.in/ini.v1 desc: do not use the ini package, use gitea's config system instead diff --git a/.release-notes-assistant.yaml b/.release-notes-assistant.yaml index 15c73f9b39..b3e5a8e665 100644 --- a/.release-notes-assistant.yaml +++ b/.release-notes-assistant.yaml @@ -10,7 +10,7 @@ branch-known: cleanup-line: 'sed -Ee "s/^(feat|fix):\s*//g" -e "s/^\[WIP\] //" -e "s/^WIP: //" -e "s;\[(UI|BUG|FEAT|v.*?/forgejo)\]\s*;;g"' render-header: | - ## Draft release notes + ## Release notes comment: |
Where does that come from? diff --git a/CODEOWNERS b/CODEOWNERS index d46efc052b..ff2a4b9fdd 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -16,6 +16,9 @@ templates/.* @caesar @crystal @gusted ## the issue sidebar was touched by fnetx templates/repo/issue/view_content/sidebar.* @fnetx +# Playwright tests +tests/e2e/.* @fnetx + # Files related to Go development. # The modules usually don't require much knowledge about Forgejo and could @@ -30,8 +33,9 @@ models/.* @gusted # for code that lives in here. routers/.* @gusted -# Let new strings be checked by the translation team. -options/locale/locale_en-US.ini @0ko +# Let locale changes be checked by the translation team. +options/locale/.* @0ko +options/locale_next/.* @0ko # Personal interest .*/webhook.* @oliverpool diff --git a/Dockerfile b/Dockerfile index 01ab36b711..70c649679d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ -FROM --platform=$BUILDPLATFORM docker.io/tonistiigi/xx AS xx +FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/xx AS xx -FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.23-alpine3.20 as build-env +FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/golang:1.24-alpine3.21 AS build-env ARG GOPROXY ENV GOPROXY=${GOPROXY:-direct} @@ -30,8 +30,8 @@ RUN cp /*-alpine-linux-musl*/lib/ld-musl-*.so.1 /lib || true RUN apk --no-cache add build-base git nodejs npm -COPY . ${GOPATH}/src/code.gitea.io/gitea -WORKDIR ${GOPATH}/src/code.gitea.io/gitea +COPY . ${GOPATH}/src/forgejo.org +WORKDIR ${GOPATH}/src/forgejo.org RUN make clean RUN make frontend @@ -47,11 +47,11 @@ RUN chmod 755 /tmp/local/usr/bin/entrypoint \ /tmp/local/etc/s6/gitea/* \ /tmp/local/etc/s6/openssh/* \ /tmp/local/etc/s6/.s6-svscan/* \ - /go/src/code.gitea.io/gitea/gitea \ - /go/src/code.gitea.io/gitea/environment-to-ini -RUN chmod 644 /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete + /go/src/forgejo.org/gitea \ + /go/src/forgejo.org/environment-to-ini +RUN chmod 644 /go/src/forgejo.org/contrib/autocompletion/bash_autocomplete -FROM code.forgejo.org/oci/golang:1.23-alpine3.20 +FROM data.forgejo.org/oci/alpine:3.21 ARG RELEASE_VERSION LABEL maintainer="contact@forgejo.org" \ org.opencontainers.image.authors="Forgejo" \ @@ -78,6 +78,7 @@ RUN apk --no-cache add \ sqlite \ su-exec \ gnupg \ + git-annex \ && rm -rf /var/cache/apk/* RUN addgroup \ @@ -98,11 +99,11 @@ ENV GITEA_CUSTOM=/data/gitea VOLUME ["/data"] ENTRYPOINT ["/usr/bin/entrypoint"] -CMD ["/bin/s6-svscan", "/etc/s6"] +CMD ["/usr/bin/s6-svscan", "/etc/s6"] COPY --from=build-env /tmp/local / RUN cd /usr/local/bin ; ln -s gitea forgejo -COPY --from=build-env /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea -RUN ln /app/gitea/gitea /app/gitea/forgejo-cli -COPY --from=build-env /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini -COPY --from=build-env /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete /etc/profile.d/gitea_bash_autocomplete.sh +COPY --from=build-env /go/src/forgejo.org/gitea /app/gitea/gitea +RUN ln -s /app/gitea/gitea /app/gitea/forgejo-cli +COPY --from=build-env /go/src/forgejo.org/environment-to-ini /usr/local/bin/environment-to-ini +COPY --from=build-env /go/src/forgejo.org/contrib/autocompletion/bash_autocomplete /etc/profile.d/gitea_bash_autocomplete.sh diff --git a/Dockerfile.rootless b/Dockerfile.rootless index d2f5f71524..a6819c6cd2 100644 --- a/Dockerfile.rootless +++ b/Dockerfile.rootless @@ -1,6 +1,6 @@ -FROM --platform=$BUILDPLATFORM docker.io/tonistiigi/xx AS xx +FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/xx AS xx -FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.23-alpine3.20 as build-env +FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/golang:1.24-alpine3.21 AS build-env ARG GOPROXY ENV GOPROXY=${GOPROXY:-direct} @@ -30,8 +30,8 @@ RUN cp /*-alpine-linux-musl*/lib/ld-musl-*.so.1 /lib || true RUN apk --no-cache add build-base git nodejs npm -COPY . ${GOPATH}/src/code.gitea.io/gitea -WORKDIR ${GOPATH}/src/code.gitea.io/gitea +COPY . ${GOPATH}/src/forgejo.org +WORKDIR ${GOPATH}/src/forgejo.org RUN make clean RUN make frontend @@ -45,11 +45,12 @@ COPY docker/rootless /tmp/local RUN chmod 755 /tmp/local/usr/local/bin/docker-entrypoint.sh \ /tmp/local/usr/local/bin/docker-setup.sh \ /tmp/local/usr/local/bin/gitea \ - /go/src/code.gitea.io/gitea/gitea \ - /go/src/code.gitea.io/gitea/environment-to-ini -RUN chmod 644 /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete + /go/src/forgejo.org/gitea \ + /go/src/forgejo.org/environment-to-ini +RUN chmod 644 /go/src/forgejo.org/contrib/autocompletion/bash_autocomplete -FROM code.forgejo.org/oci/golang:1.23-alpine3.20 +FROM data.forgejo.org/oci/alpine:3.21 +ARG RELEASE_VERSION LABEL maintainer="contact@forgejo.org" \ org.opencontainers.image.authors="Forgejo" \ org.opencontainers.image.url="https://forgejo.org" \ @@ -71,6 +72,8 @@ RUN apk --no-cache add \ git \ curl \ gnupg \ + openssh-client \ + git-annex \ && rm -rf /var/cache/apk/* RUN addgroup \ @@ -89,10 +92,10 @@ RUN chown git:git /var/lib/gitea /etc/gitea COPY --from=build-env /tmp/local / RUN cd /usr/local/bin ; ln -s gitea forgejo -COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea -RUN ln /app/gitea/gitea /app/gitea/forgejo-cli -COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini -COPY --from=build-env /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete /etc/profile.d/gitea_bash_autocomplete.sh +COPY --from=build-env --chown=root:root /go/src/forgejo.org/gitea /app/gitea/gitea +RUN ln -s /app/gitea/gitea /app/gitea/forgejo-cli +COPY --from=build-env --chown=root:root /go/src/forgejo.org/environment-to-ini /usr/local/bin/environment-to-ini +COPY --from=build-env /go/src/forgejo.org/contrib/autocompletion/bash_autocomplete /etc/profile.d/gitea_bash_autocomplete.sh #git:git USER 1000:1000 diff --git a/Makefile b/Makefile index a2bfbdc95c..b1272b640f 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ self := $(location) @tmpdir=`mktemp --tmpdir -d` ; \ echo Using temporary directory $$tmpdir for test repositories ; \ USE_REPO_TEST_DIR= $(MAKE) -f $(self) --no-print-directory REPO_TEST_DIR=$$tmpdir/ $@ ; \ - STATUS=$$? ; rm -r "$$tmpdir" ; exit $$STATUS + STATUS=$$? ; chmod -R +w "$$tmpdir" && rm -r "$$tmpdir" ; exit $$STATUS else @@ -16,50 +16,51 @@ else DIST := dist DIST_DIRS := $(DIST)/binaries $(DIST)/release -IMPORT := code.gitea.io/gitea +IMPORT := forgejo.org -GO ?= go +GO ?= $(shell go env GOROOT)/bin/go SHASUM ?= shasum -a 256 HAS_GO := $(shell hash $(GO) > /dev/null 2>&1 && echo yes) COMMA := , DIFF ?= diff --unified +ifeq ($(USE_GOTESTSUM), yes) + GOTEST ?= gotestsum -- + GOTESTCOMPILEDRUNPREFIX ?= gotestsum --raw-command -- go tool test2json -t + GOTESTCOMPILEDRUNSUFFIX ?= -test.v=test2json +else + GOTEST ?= $(GO) test + GOTESTCOMPILEDRUNPREFIX ?= + GOTESTCOMPILEDRUNSUFFIX ?= +endif + XGO_VERSION := go-1.21.x AIR_PACKAGE ?= github.com/air-verse/air@v1 # renovate: datasource=go -EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/v3/cmd/editorconfig-checker@v3.0.3 # renovate: datasource=go +EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/v3/cmd/editorconfig-checker@v3.2.1 # renovate: datasource=go GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.7.0 # renovate: datasource=go -GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/cmd/golangci-lint@v1.61.0 # renovate: datasource=go +GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/cmd/golangci-lint@v1.64.7 # renovate: datasource=go GXZ_PACKAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.11 # renovate: datasource=go MISSPELL_PACKAGE ?= github.com/golangci/misspell/cmd/misspell@v0.6.0 # renovate: datasource=go SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.31.0 # renovate: datasource=go XGO_PACKAGE ?= src.techknowlogick.com/xgo@latest GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1.6.0 # renovate: datasource=go GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1 # renovate: datasource=go -DEADCODE_PACKAGE ?= golang.org/x/tools/cmd/deadcode@v0.25.0 # renovate: datasource=go +DEADCODE_PACKAGE ?= golang.org/x/tools/cmd/deadcode@v0.31.0 # renovate: datasource=go GOMOCK_PACKAGE ?= go.uber.org/mock/mockgen@v0.4.0 # renovate: datasource=go -GOPLS_PACKAGE ?= golang.org/x/tools/gopls@v0.16.2 # renovate: datasource=go -RENOVATE_NPM_PACKAGE ?= renovate@38.93.2 # renovate: datasource=docker packageName=code.forgejo.org/forgejo-contrib/renovate +GOPLS_PACKAGE ?= golang.org/x/tools/gopls@v0.18.1 # renovate: datasource=go +RENOVATE_NPM_PACKAGE ?= renovate@39.212.0 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate + +# https://github.com/disposable-email-domains/disposable-email-domains/commits/main/ +DISPOSABLE_EMAILS_SHA ?= 0c27e671231d27cf66370034d7f6818037416989 # renovate: ... ifeq ($(HAS_GO), yes) CGO_EXTRA_CFLAGS := -DSQLITE_MAX_VARIABLE_NUMBER=32766 CGO_CFLAGS ?= $(shell $(GO) env CGO_CFLAGS) $(CGO_EXTRA_CFLAGS) endif -ifeq ($(GOOS),windows) - IS_WINDOWS := yes -else ifeq ($(patsubst Windows%,Windows,$(OS)),Windows) - ifeq ($(GOOS),) - IS_WINDOWS := yes - endif -endif -ifeq ($(IS_WINDOWS),yes) - GOFLAGS := -v -buildmode=exe - EXECUTABLE ?= gitea.exe -else - GOFLAGS := -v - EXECUTABLE ?= gitea -endif +GOFLAGS := -v +EXECUTABLE ?= gitea ifeq ($(shell sed --version 2>/dev/null | grep -q GNU && echo gnu),gnu) SED_INPLACE := sed -i @@ -91,7 +92,7 @@ else FORGEJO_VERSION_API ?= $(GITEA_VERSION)+${GITEA_COMPATIBILITY} else # drop the "g" prefix prepended by git describe to the commit hash - FORGEJO_VERSION ?= $(shell git describe --exclude '*-test' --tags --always | sed 's/^v//' | sed 's/\-g/-/')+${GITEA_COMPATIBILITY} + FORGEJO_VERSION ?= $(shell git describe --exclude '*-test' --tags --always | sed 's/^v//' | sed 's/\-g/-/2')+${GITEA_COMPATIBILITY} endif endif FORGEJO_VERSION_MAJOR=$(shell echo $(FORGEJO_VERSION) | sed -e 's/\..*//') @@ -114,15 +115,20 @@ FORGEJO_VERSION_API ?= ${FORGEJO_VERSION} show-version-api: @echo ${FORGEJO_VERSION_API} +# Strip binaries by default to reduce size, allow overriding for debugging +STRIP ?= 1 +ifeq ($(STRIP),1) + LDFLAGS := $(LDFLAGS) -s -w +endif LDFLAGS := $(LDFLAGS) -X "main.ReleaseVersion=$(RELEASE_VERSION)" -X "main.MakeVersion=$(MAKE_VERSION)" -X "main.Version=$(FORGEJO_VERSION)" -X "main.Tags=$(TAGS)" -X "main.ForgejoVersion=$(FORGEJO_VERSION_API)" LINUX_ARCHS ?= linux/amd64,linux/386,linux/arm-5,linux/arm-6,linux/arm64 ifeq ($(HAS_GO), yes) - GO_TEST_PACKAGES ?= $(filter-out $(shell $(GO) list code.gitea.io/gitea/models/migrations/...) $(shell $(GO) list code.gitea.io/gitea/models/forgejo_migrations/...) code.gitea.io/gitea/tests/integration/migration-test code.gitea.io/gitea/tests code.gitea.io/gitea/tests/integration code.gitea.io/gitea/tests/e2e,$(shell $(GO) list ./...)) + GO_TEST_PACKAGES ?= $(filter-out $(shell $(GO) list forgejo.org/models/migrations/...) $(shell $(GO) list forgejo.org/models/forgejo_migrations/...) forgejo.org/tests/integration/migration-test forgejo.org/tests forgejo.org/tests/integration forgejo.org/tests/e2e,$(shell $(GO) list ./...)) endif REMOTE_CACHER_MODULES ?= cache nosql session queue -GO_TEST_REMOTE_CACHER_PACKAGES ?= $(addprefix code.gitea.io/gitea/modules/,$(REMOTE_CACHER_MODULES)) +GO_TEST_REMOTE_CACHER_PACKAGES ?= $(addprefix forgejo.org/modules/,$(REMOTE_CACHER_MODULES)) FOMANTIC_WORK_DIR := web_src/fomantic @@ -154,9 +160,8 @@ TAR_EXCLUDES := .git data indexers queues log node_modules $(EXECUTABLE) $(FOMAN GO_DIRS := build cmd models modules routers services tests WEB_DIRS := web_src/js web_src/css -ESLINT_FILES := web_src/js tools *.js tests/e2e/*.js tests/e2e/shared/*.js STYLELINT_FILES := web_src/css web_src/js/components/*.vue -SPELLCHECK_FILES := $(GO_DIRS) $(WEB_DIRS) docs/content templates options/locale/locale_en-US.ini .github $(wildcard *.go *.js *.md *.yml *.yaml *.toml) +SPELLCHECK_FILES := $(GO_DIRS) $(WEB_DIRS) docs/content templates options/locale/locale_en-US.ini .github $(wildcard *.go *.js *.ts *.vue *.md *.yml *.yaml) GO_SOURCES := $(wildcard *.go) GO_SOURCES += $(shell find $(GO_DIRS) -type f -name "*.go" ! -path modules/options/bindata.go ! -path modules/public/bindata.go ! -path modules/templates/bindata.go) @@ -164,7 +169,7 @@ GO_SOURCES += $(GENERATED_GO_DEST) GO_SOURCES_NO_BINDATA := $(GO_SOURCES) ifeq ($(HAS_GO), yes) - MIGRATION_PACKAGES := $(shell $(GO) list code.gitea.io/gitea/models/migrations/... code.gitea.io/gitea/models/forgejo_migrations/...) + MIGRATION_PACKAGES := $(shell $(GO) list forgejo.org/models/migrations/... forgejo.org/models/forgejo_migrations/...) endif ifeq ($(filter $(TAGS_SPLIT),bindata),bindata) @@ -408,30 +413,30 @@ lint-frontend: lint-js lint-css lint-frontend-fix: lint-js-fix lint-css-fix .PHONY: lint-backend -lint-backend: lint-go lint-go-vet lint-editorconfig lint-renovate +lint-backend: lint-go lint-go-vet lint-editorconfig lint-renovate lint-locale lint-locale-usage lint-disposable-emails .PHONY: lint-backend-fix -lint-backend-fix: lint-go-fix lint-go-vet lint-editorconfig +lint-backend-fix: lint-go-fix lint-go-vet lint-editorconfig lint-disposable-emails-fix .PHONY: lint-codespell -lint-codespell: - codespell +lint-codespell: deps-py + @poetry run codespell .PHONY: lint-codespell-fix -lint-codespell-fix: - codespell -w +lint-codespell-fix: deps-py + @poetry run codespell -w .PHONY: lint-codespell-fix-i -lint-codespell-fix-i: - codespell -w -i 3 -C 2 +lint-codespell-fix-i: deps-py + @poetry run codespell -w -i 3 -C 2 .PHONY: lint-js lint-js: node_modules - npx eslint --color --max-warnings=0 --ext js,vue $(ESLINT_FILES) + npx eslint --color --max-warnings=0 .PHONY: lint-js-fix lint-js-fix: node_modules - npx eslint --color --max-warnings=0 --ext js,vue $(ESLINT_FILES) --fix + npx eslint --color --max-warnings=0 --fix .PHONY: lint-css lint-css: node_modules @@ -451,6 +456,14 @@ lint-renovate: node_modules @if grep --quiet --extended-regexp -e '^( WARN:|ERROR:)' .lint-renovate ; then cat .lint-renovate ; rm .lint-renovate ; exit 1 ; fi @rm .lint-renovate +.PHONY: lint-locale +lint-locale: + $(GO) run build/lint-locale/lint-locale.go + +.PHONY: lint-locale-usage +lint-locale-usage: + $(GO) run build/lint-locale-usage/lint-locale-usage.go --allow-missing-msgids + .PHONY: lint-md lint-md: node_modules npx markdownlint docs *.md @@ -463,7 +476,7 @@ lint-spell: lint-codespell lint-spell-fix: lint-codespell-fix @go run $(MISSPELL_PACKAGE) -w $(SPELLCHECK_FILES) -RUN_DEADCODE = $(GO) run $(DEADCODE_PACKAGE) -generated=false -f='{{println .Path}}{{range .Funcs}}{{printf "\t%s\n" .Name}}{{end}}{{println}}' -test code.gitea.io/gitea +RUN_DEADCODE = $(GO) run $(DEADCODE_PACKAGE) -generated=false -f='{{println .Path}}{{range .Funcs}}{{printf "\t%s\n" .Name}}{{end}}{{println}}' -test forgejo.org .PHONY: lint-go lint-go: @@ -477,13 +490,6 @@ lint-go-fix: $(GO) run $(GOLANGCI_LINT_PACKAGE) run $(GOLANGCI_LINT_ARGS) --fix $(RUN_DEADCODE) > .deadcode-out -# workaround step for the lint-go-windows CI task because 'go run' can not -# have distinct GOOS/GOARCH for its build and run steps -.PHONY: lint-go-windows -lint-go-windows: - @GOOS= GOARCH= $(GO) install $(GOLANGCI_LINT_PACKAGE) - golangci-lint run - .PHONY: lint-go-vet lint-go-vet: @echo "Running go vet..." @@ -498,6 +504,14 @@ lint-go-gopls: lint-editorconfig: $(GO) run $(EDITORCONFIG_CHECKER_PACKAGE) templates .forgejo/workflows +.PHONY: lint-disposable-emails +lint-disposable-emails: + $(GO) run build/generate-disposable-email.go -check -r $(DISPOSABLE_EMAILS_SHA) + +.PHONY: lint-disposable-emails-fix +lint-disposable-emails-fix: + $(GO) run build/generate-disposable-email.go -r $(DISPOSABLE_EMAILS_SHA) + .PHONY: lint-templates lint-templates: .venv node_modules @node tools/lint-templates-svg.js @@ -505,7 +519,7 @@ lint-templates: .venv node_modules .PHONY: lint-yaml lint-yaml: .venv - @poetry run yamllint . + @poetry run yamllint -s . .PHONY: security-check security-check: @@ -534,12 +548,12 @@ test: test-frontend test-backend .PHONY: test-backend test-backend: @echo "Running go test with $(GOTESTFLAGS) -tags '$(TEST_TAGS)'..." - @$(GO) test $(GOTESTFLAGS) -tags='$(TEST_TAGS)' $(GO_TEST_PACKAGES) + @$(GOTEST) $(GOTESTFLAGS) -tags='$(TEST_TAGS)' $(GO_TEST_PACKAGES) .PHONY: test-remote-cacher test-remote-cacher: @echo "Running go test with $(GOTESTFLAGS) -tags '$(TEST_TAGS)'..." - @$(GO) test $(GOTESTFLAGS) -tags='$(TEST_TAGS)' $(GO_TEST_REMOTE_CACHER_PACKAGES) + @$(GOTEST) $(GOTESTFLAGS) -tags='$(TEST_TAGS)' $(GO_TEST_REMOTE_CACHER_PACKAGES) .PHONY: test-frontend test-frontend: node_modules @@ -564,7 +578,7 @@ test-check: .PHONY: test\#% test\#%: @echo "Running go test with -tags '$(TEST_TAGS)'..." - @$(GO) test $(GOTESTFLAGS) -tags='$(TEST_TAGS)' -run $(subst .,/,$*) $(GO_TEST_PACKAGES) + @$(GOTEST) $(GOTESTFLAGS) -tags='$(TEST_TAGS)' -run $(subst .,/,$*) $(GO_TEST_PACKAGES) .PHONY: coverage coverage: @@ -575,7 +589,7 @@ coverage: .PHONY: unit-test-coverage unit-test-coverage: @echo "Running unit-test-coverage $(GOTESTFLAGS) -tags '$(TEST_TAGS)'..." - @$(GO) test $(GOTESTFLAGS) -timeout=20m -tags='$(TEST_TAGS)' -cover -coverprofile coverage.out $(GO_TEST_PACKAGES) && echo "\n==>\033[32m Ok\033[m\n" || exit 1 + @$(GOTEST) $(GOTESTFLAGS) -timeout=20m -tags='$(TEST_TAGS)' -cover -coverprofile coverage.out $(GO_TEST_PACKAGES) && echo "\n==>\033[32m Ok\033[m\n" || exit 1 .PHONY: tidy tidy: @@ -596,7 +610,7 @@ tidy-check: tidy go-licenses: $(GO_LICENSE_FILE) $(GO_LICENSE_FILE): go.mod go.sum - -$(shell $(GO) env GOROOT)/bin/go run $(GO_LICENSES_PACKAGE) save . --force --ignore code.gitea.io/gitea --save_path=$(GO_LICENSE_TMP_DIR) 2>/dev/null + -$(GO) run $(GO_LICENSES_PACKAGE) save . --force --ignore forgejo.org --save_path=$(GO_LICENSE_TMP_DIR) 2>/dev/null $(GO) run build/generate-go-licenses.go $(GO_LICENSE_TMP_DIR) $(GO_LICENSE_FILE) @rm -rf $(GO_LICENSE_TMP_DIR) @@ -608,11 +622,11 @@ generate-ini-sqlite: .PHONY: test-sqlite test-sqlite: integrations.sqlite.test generate-ini-sqlite - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini ./integrations.sqlite.test + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini $(GOTESTCOMPILEDRUNPREFIX) ./integrations.sqlite.test $(GOTESTCOMPILEDRUNSUFFIX) .PHONY: test-sqlite\#% test-sqlite\#%: integrations.sqlite.test generate-ini-sqlite - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini ./integrations.sqlite.test -test.run $(subst .,/,$*) + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini $(GOTESTCOMPILEDRUNPREFIX) ./integrations.sqlite.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run $(subst .,/,$*) .PHONY: test-sqlite-migration test-sqlite-migration: migrations.sqlite.test migrations.individual.sqlite.test @@ -629,11 +643,11 @@ generate-ini-mysql: .PHONY: test-mysql test-mysql: integrations.mysql.test generate-ini-mysql - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini ./integrations.mysql.test + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini $(GOTESTCOMPILEDRUNPREFIX) ./integrations.mysql.test $(GOTESTCOMPILEDRUNSUFFIX) .PHONY: test-mysql\#% test-mysql\#%: integrations.mysql.test generate-ini-mysql - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini ./integrations.mysql.test -test.run $(subst .,/,$*) + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini $(GOTESTCOMPILEDRUNPREFIX) ./integrations.mysql.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run $(subst .,/,$*) .PHONY: test-mysql-migration test-mysql-migration: migrations.mysql.test migrations.individual.mysql.test @@ -647,15 +661,16 @@ generate-ini-pgsql: -e 's|{{REPO_TEST_DIR}}|${REPO_TEST_DIR}|g' \ -e 's|{{TEST_LOGGER}}|$(or $(TEST_LOGGER),test$(COMMA)file)|g' \ -e 's|{{TEST_TYPE}}|$(or $(TEST_TYPE),integration)|g' \ + -e 's|{{TEST_STORAGE_TYPE}}|$(or $(TEST_STORAGE_TYPE),minio)|g' \ tests/pgsql.ini.tmpl > tests/pgsql.ini .PHONY: test-pgsql test-pgsql: integrations.pgsql.test generate-ini-pgsql - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./integrations.pgsql.test + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini $(GOTESTCOMPILEDRUNPREFIX) ./integrations.pgsql.test $(GOTESTCOMPILEDRUNSUFFIX) .PHONY: test-pgsql\#% test-pgsql\#%: integrations.pgsql.test generate-ini-pgsql - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./integrations.pgsql.test -test.run $(subst .,/,$*) + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini $(GOTESTCOMPILEDRUNPREFIX) ./integrations.pgsql.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run $(subst .,/,$*) .PHONY: test-pgsql-migration test-pgsql-migration: migrations.pgsql.test migrations.individual.pgsql.test @@ -674,35 +689,34 @@ test-e2e: test-e2e-sqlite .PHONY: test-e2e-sqlite test-e2e-sqlite: playwright e2e.sqlite.test generate-ini-sqlite - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini ./e2e.sqlite.test -test.run TestE2e + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini $(GOTESTCOMPILEDRUNPREFIX) ./e2e.sqlite.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run TestE2e .PHONY: test-e2e-sqlite\#% test-e2e-sqlite\#%: playwright e2e.sqlite.test generate-ini-sqlite - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini ./e2e.sqlite.test -test.run TestE2e/$* + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini $(GOTESTCOMPILEDRUNPREFIX) ./e2e.sqlite.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run TestE2e/$* .PHONY: test-e2e-sqlite-firefox\#% test-e2e-sqlite-firefox\#%: playwright e2e.sqlite.test generate-ini-sqlite - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini PLAYWRIGHT_PROJECT=firefox ./e2e.sqlite.test -test.run TestE2e/$* + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini PLAYWRIGHT_PROJECT=firefox $(GOTESTCOMPILEDRUNPREFIX) ./e2e.sqlite.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run TestE2e/$* .PHONY: test-e2e-mysql test-e2e-mysql: playwright e2e.mysql.test generate-ini-mysql - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini ./e2e.mysql.test -test.run TestE2e + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini $(GOTESTCOMPILEDRUNPREFIX) ./e2e.mysql.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run TestE2e .PHONY: test-e2e-mysql\#% test-e2e-mysql\#%: playwright e2e.mysql.test generate-ini-mysql - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini ./e2e.mysql.test -test.run TestE2e/$* + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini $(GOTESTCOMPILEDRUNPREFIX) ./e2e.mysql.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run TestE2e/$* .PHONY: test-e2e-pgsql test-e2e-pgsql: playwright e2e.pgsql.test generate-ini-pgsql - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./e2e.pgsql.test -test.run TestE2e + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini $(GOTESTCOMPILEDRUNPREFIX) ./e2e.pgsql.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run TestE2e .PHONY: test-e2e-pgsql\#% test-e2e-pgsql\#%: playwright e2e.pgsql.test generate-ini-pgsql - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./e2e.pgsql.test -test.run TestE2e/$* + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini $(GOTESTCOMPILEDRUNPREFIX) ./e2e.pgsql.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run TestE2e/$* .PHONY: test-e2e-debugserver test-e2e-debugserver: e2e.sqlite.test generate-ini-sqlite - sed -i s/3003/3000/g tests/sqlite.ini GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini ./e2e.sqlite.test -test.run TestDebugserver -test.timeout 24h .PHONY: bench-sqlite @@ -726,73 +740,73 @@ integration-test-coverage-sqlite: integrations.cover.sqlite.test generate-ini-sq GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini ./integrations.cover.sqlite.test -test.coverprofile=integration.coverage.out integrations.mysql.test: git-check $(GO_SOURCES) - $(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -o integrations.mysql.test + $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/integration -o integrations.mysql.test integrations.pgsql.test: git-check $(GO_SOURCES) - $(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -o integrations.pgsql.test + $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/integration -o integrations.pgsql.test integrations.sqlite.test: git-check $(GO_SOURCES) - $(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -o integrations.sqlite.test -tags '$(TEST_TAGS)' + $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/integration -o integrations.sqlite.test -tags '$(TEST_TAGS)' integrations.cover.test: git-check $(GO_SOURCES) - $(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -coverpkg $(shell echo $(GO_TEST_PACKAGES) | tr ' ' ',') -o integrations.cover.test + $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/integration -coverpkg $(shell echo $(GO_TEST_PACKAGES) | tr ' ' ',') -o integrations.cover.test integrations.cover.sqlite.test: git-check $(GO_SOURCES) - $(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -coverpkg $(shell echo $(GO_TEST_PACKAGES) | tr ' ' ',') -o integrations.cover.sqlite.test -tags '$(TEST_TAGS)' + $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/integration -coverpkg $(shell echo $(GO_TEST_PACKAGES) | tr ' ' ',') -o integrations.cover.sqlite.test -tags '$(TEST_TAGS)' .PHONY: migrations.mysql.test migrations.mysql.test: $(GO_SOURCES) generate-ini-mysql - $(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration/migration-test -o migrations.mysql.test - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini ./migrations.mysql.test + $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/integration/migration-test -o migrations.mysql.test + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini $(GOTESTCOMPILEDRUNPREFIX) ./migrations.mysql.test $(GOTESTCOMPILEDRUNSUFFIX) .PHONY: migrations.pgsql.test migrations.pgsql.test: $(GO_SOURCES) generate-ini-pgsql - $(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration/migration-test -o migrations.pgsql.test - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./migrations.pgsql.test + $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/integration/migration-test -o migrations.pgsql.test + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini $(GOTESTCOMPILEDRUNPREFIX) ./migrations.pgsql.test $(GOTESTCOMPILEDRUNSUFFIX) .PHONY: migrations.sqlite.test migrations.sqlite.test: $(GO_SOURCES) generate-ini-sqlite - $(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration/migration-test -o migrations.sqlite.test -tags '$(TEST_TAGS)' - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini ./migrations.sqlite.test + $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/integration/migration-test -o migrations.sqlite.test -tags '$(TEST_TAGS)' + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini $(GOTESTCOMPILEDRUNPREFIX) ./migrations.sqlite.test $(GOTESTCOMPILEDRUNSUFFIX) .PHONY: migrations.individual.mysql.test migrations.individual.mysql.test: $(GO_SOURCES) for pkg in $(MIGRATION_PACKAGES); do \ - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' $$pkg || exit 1; \ + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini $(GOTEST) $(GOTESTFLAGS) -tags '$(TEST_TAGS)' $$pkg || exit 1; \ done .PHONY: migrations.individual.sqlite.test\#% migrations.individual.sqlite.test\#%: $(GO_SOURCES) generate-ini-sqlite - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' code.gitea.io/gitea/models/migrations/$* + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini $(GOTEST) $(GOTESTFLAGS) -tags '$(TEST_TAGS)' forgejo.org/models/migrations/$* .PHONY: migrations.individual.pgsql.test migrations.individual.pgsql.test: $(GO_SOURCES) for pkg in $(MIGRATION_PACKAGES); do \ - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' $$pkg || exit 1;\ + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini $(GOTEST) $(GOTESTFLAGS) -tags '$(TEST_TAGS)' $$pkg || exit 1;\ done .PHONY: migrations.individual.pgsql.test\#% migrations.individual.pgsql.test\#%: $(GO_SOURCES) generate-ini-pgsql - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' code.gitea.io/gitea/models/migrations/$* + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini $(GOTEST) $(GOTESTFLAGS) -tags '$(TEST_TAGS)' forgejo.org/models/migrations/$* .PHONY: migrations.individual.sqlite.test migrations.individual.sqlite.test: $(GO_SOURCES) generate-ini-sqlite for pkg in $(MIGRATION_PACKAGES); do \ - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' $$pkg || exit 1; \ + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini $(GOTEST) $(GOTESTFLAGS) -tags '$(TEST_TAGS)' $$pkg || exit 1; \ done .PHONY: migrations.individual.sqlite.test\#% migrations.individual.sqlite.test\#%: $(GO_SOURCES) generate-ini-sqlite - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' code.gitea.io/gitea/models/migrations/$* + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini $(GOTEST) $(GOTESTFLAGS) -tags '$(TEST_TAGS)' forgejo.org/models/migrations/$* e2e.mysql.test: $(GO_SOURCES) - $(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/e2e -o e2e.mysql.test + $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/e2e -o e2e.mysql.test e2e.pgsql.test: $(GO_SOURCES) - $(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/e2e -o e2e.pgsql.test + $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/e2e -o e2e.pgsql.test e2e.sqlite.test: $(GO_SOURCES) - $(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/e2e -o e2e.sqlite.test -tags '$(TEST_TAGS)' + $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/e2e -o e2e.sqlite.test -tags '$(TEST_TAGS)' .PHONY: check check: test @@ -803,7 +817,7 @@ check: test .PHONY: install $(TAGS_PREREQ) install: $(wildcard *.go) - CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) install -v -tags '$(TAGS)' -ldflags '-s -w $(LDFLAGS)' + CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) install -v -tags '$(TAGS)' -ldflags '$(LDFLAGS)' .PHONY: build build: frontend backend @@ -831,13 +845,13 @@ merge-locales: @echo "NOT NEEDED: THIS IS A NOOP AS OF Forgejo 7.0 BUT KEPT FOR BACKWARD COMPATIBILITY" $(EXECUTABLE): $(GO_SOURCES) $(TAGS_PREREQ) - CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) build $(GOFLAGS) $(EXTRA_GOFLAGS) -tags '$(TAGS)' -ldflags '-s -w $(LDFLAGS)' -o $@ + CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) build $(GOFLAGS) $(EXTRA_GOFLAGS) -tags '$(TAGS)' -ldflags '$(LDFLAGS)' -o $@ forgejo: $(EXECUTABLE) ln -f $(EXECUTABLE) forgejo static-executable: $(GO_SOURCES) $(TAGS_PREREQ) - CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) build $(GOFLAGS) $(EXTRA_GOFLAGS) -tags 'netgo osusergo $(TAGS)' -ldflags '-s -w -linkmode external -extldflags "-static" $(LDFLAGS)' -o $(EXECUTABLE) + CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) build $(GOFLAGS) $(EXTRA_GOFLAGS) -tags 'netgo osusergo $(TAGS)' -ldflags '-linkmode external -extldflags "-static" $(LDFLAGS)' -o $(EXECUTABLE) .PHONY: release release: frontend generate release-linux release-copy release-compress vendor release-sources release-check @@ -848,10 +862,6 @@ sources-tarbal: frontend generate vendor release-sources release-check $(DIST_DIRS): mkdir -p $(DIST_DIRS) -.PHONY: release-windows -release-windows: | $(DIST_DIRS) - CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) run $(XGO_PACKAGE) -go $(XGO_VERSION) -buildmode exe -dest $(DIST)/binaries -tags 'osusergo $(TAGS)' -ldflags '-linkmode external -extldflags "-static" $(LDFLAGS)' -targets 'windows/*' -out gitea-$(VERSION) . - .PHONY: release-linux release-linux: | $(DIST_DIRS) CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) run $(XGO_PACKAGE) -go $(XGO_VERSION) -dest $(DIST)/binaries -tags 'netgo osusergo $(TAGS)' -ldflags '-linkmode external -extldflags "-static" $(LDFLAGS)' -targets '$(LINUX_ARCHS)' -out forgejo-$(VERSION) . @@ -896,7 +906,7 @@ release-docs: | $(DIST_DIRS) docs .PHONY: reproduce-build reproduce-build: # Start building the Dockerfile with the RELEASE_VERSION tag set. GOPROXY is set -# for convience, because the default of the Dockerfile is `direct` which can be +# for convenience, because the default of the Dockerfile is `direct` which can be # quite slow. @docker build --build-arg="RELEASE_VERSION=$(RELEASE_VERSION)" --build-arg="GOPROXY=$(shell $(GO) env GOPROXY)" --tag "forgejo-reproducibility" . @id=$$(docker create forgejo-reproducibility); \ @@ -1003,7 +1013,7 @@ generate-gitignore: .PHONY: generate-gomock generate-gomock: - $(GO) run $(GOMOCK_PACKAGE) -package mock -destination ./modules/queue/mock/redisuniversalclient.go code.gitea.io/gitea/modules/nosql RedisClient + $(GO) run $(GOMOCK_PACKAGE) -package mock -destination ./modules/queue/mock/redisuniversalclient.go forgejo.org/modules/nosql RedisClient .PHONY: generate-images generate-images: | node_modules diff --git a/README.md b/README.md index 2edc449177..0c4becacc4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ -

Welcome to Forgejo

diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index f86e10c21a..32f7b8c264 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -4,19 +4,31 @@ A minor or major Forgejo release is published every [three months](https://forge A [patch or minor release](https://semver.org/spec/v2.0.0.html) (e.g. upgrading from v7.0.0 to v7.0.1 or v7.1.0) does not require manual intervention. But [major releases](https://semver.org/spec/v2.0.0.html#spec-item-8) where the first version number changes (e.g. upgrading from v1.21 to v7.0) contain breaking changes and the release notes explain how to deal with them. -The release notes of each release [are available in the corresponding milestone](https://codeberg.org/forgejo/forgejo/milestones), starting with [Forgejo 7.0.7](https://codeberg.org/forgejo/forgejo/milestone/7683) and [Forgejo 8.0.1](https://codeberg.org/forgejo/forgejo/milestone/7682). +The release notes of each release [are available in the release-notes-published directory of this repository](release-notes-published), starting with [Forgejo 7.0.7](release-notes-published/7.0.7.md) and [Forgejo 8.0.1](release-notes-published/8.0.1.md). + +## 9.0.2 + +See the [Forgejo 9.0.2 release notes](release-notes-published/9.0.2.md). + +## 9.0.1 + +See the [Forgejo 9.0.1 release notes](release-notes-published/9.0.1.md). + +## 9.0.0 + +See the [Forgejo 9.0.0 release notes](release-notes-published/9.0.0.md). ## 8.0.3 -The Forgejo v8.0.3 release notes are [available in the v8.0.3 milestone](https://codeberg.org/forgejo/forgejo/milestone/8231). +See the [Forgejo 8.0.3 release notes](release-notes-published/8.0.3.md). ## 8.0.2 -The Forgejo v8.0.2 release notes are [available in the v8.0.2 milestone](https://codeberg.org/forgejo/forgejo/milestone/7728). +See the [Forgejo 8.0.2 release notes](release-notes-published/8.0.2.md). ## 8.0.1 -The Forgejo v8.0.1 release notes are [available in the v8.0.1 milestone](https://codeberg.org/forgejo/forgejo/milestone/7682). +See the [Forgejo 8.0.1 release notes](release-notes-published/8.0.1.md). ## 8.0.0 @@ -155,17 +167,25 @@ A [companion blog post](https://forgejo.org/2024-07-release-v8-0/) provides addi - [PR](https://codeberg.org/forgejo/forgejo/pulls/2937): 31 March updates +## 7.0.11 + +See the [Forgejo 7.0.11 release notes](release-notes-published/7.0.11.md). + +## 7.0.10 + +See the [Forgejo 7.0.10 release notes](release-notes-published/7.0.10.md). + ## 7.0.9 -The Forgejo v7.0.9 release notes are [available in the v7.0.9 milestone](https://codeberg.org/forgejo/forgejo/milestone/8232). +See the [Forgejo 7.0.9 release notes](release-notes-published/7.0.9.md). ## 7.0.8 -The Forgejo v7.0.8 release notes are [available in the v7.0.8 milestone](https://codeberg.org/forgejo/forgejo/milestone/7729). +See the [Forgejo 7.0.8 release notes](release-notes-published/7.0.8.md). ## 7.0.7 -The Forgejo v7.0.7 release notes are [available in the v7.0.7 milestone](https://codeberg.org/forgejo/forgejo/milestone/7683). +See the [Forgejo 7.0.7 release notes](release-notes-published/7.0.7.md). ## 7.0.6 @@ -1570,7 +1590,7 @@ this situation, [follow the instructions in the companion blog post](https://for The most prominent ones are described here, others can be found in the list of commits included in the release as described above. - * [Fix links to pull request reviews sent via mail](https://codeberg.org/forgejo/forgejo/commit/88e179d5ef8ee41f71d068195685ff098b38ca31). The pull request link was correct but it did not go the the review and stayed at the beginning of the page + * [Fix links to pull request reviews sent via mail](https://codeberg.org/forgejo/forgejo/commit/88e179d5ef8ee41f71d068195685ff098b38ca31). The pull request link was correct but it did not go the review and stayed at the beginning of the page * [Recognize OGG as an audio format](https://codeberg.org/forgejo/forgejo/commit/622ec5c79f299c32ac2667a1aa7b4bf5d7c2d6cf) * [Consistently show the last time a cron job was run in the admin panel](https://codeberg.org/forgejo/forgejo/commit/5f769ef20) * [Fix NuGet registry v2 & v3 API search endpoints](https://codeberg.org/forgejo/forgejo/commit/471138829b0c24fe8c621dbb866ae8bb45ebc674) @@ -1589,7 +1609,7 @@ this situation, [follow the instructions in the companion blog post](https://for * [Fix pull request check list when there are more than 30](https://codeberg.org/forgejo/forgejo/commit/e226b9646) * [Fix attachment clipboard copy on insecure origin](https://codeberg.org/forgejo/forgejo/commit/12ac84c26) * [Fix the profile README rendering](https://codeberg.org/forgejo/forgejo/commit/84c3b60a4) that [was inconsistent with other markdown files renderings](https://codeberg.org/forgejo/forgejo/issues/833) - * [Fix API leaking the user email when the caller is not authentified](https://codeberg.org/forgejo/forgejo/commit/d89003cc1) + * [Fix API leaking the user email when the caller is not authenticated](https://codeberg.org/forgejo/forgejo/commit/d89003cc1) ## 1.20.2-0 @@ -1647,7 +1667,7 @@ $ git -C forgejo log --oneline --no-merges origin/v1.19/forgejo..origin/v1.20/fo The semantic version was updated to `5.0.0+0-gitea-1.20.1` because it contains breaking changes. - **Breaking:** - [Scoped access tokens](https://codeberg.org/forgejo/forgejo/commit/18de83b2a3fc120922096b7348d6375094ae1532) or (Personal Access Tokens), were refactored and although existing tokens are still valid, they may have a different scope than before. To ensure that no tokens have a larger scope than expected they must be removed and recreated. - - If your `app.ini` has one of the the following `[indexer].ISSUE_INDEXER_QUEUE_TYPE`, `[indexer].ISSUE_INDEXER_QUEUE_BATCH_NUMBER`, `[indexer].`, `[indexer].ISSUE_INDEXER_QUEUE_DIR`, `[indexer].ISSUE_INDEXER_QUEUE_CONN_STR`, `[indexer].UPDATE_BUFFER_LEN`, `[mailer].SEND_BUFFER_LEN`, `[repository].PULL_REQUEST_QUEUE_LENGTH` or `[repository].MIRROR_QUEUE_LENGTH`, Forgejo will abort immediately. Unless you know exactly what you're doing, you must comment them out so the default values are used. + - If your `app.ini` has one of the following `[indexer].ISSUE_INDEXER_QUEUE_TYPE`, `[indexer].ISSUE_INDEXER_QUEUE_BATCH_NUMBER`, `[indexer].`, `[indexer].ISSUE_INDEXER_QUEUE_DIR`, `[indexer].ISSUE_INDEXER_QUEUE_CONN_STR`, `[indexer].UPDATE_BUFFER_LEN`, `[mailer].SEND_BUFFER_LEN`, `[repository].PULL_REQUEST_QUEUE_LENGTH` or `[repository].MIRROR_QUEUE_LENGTH`, Forgejo will abort immediately. Unless you know exactly what you're doing, you must comment them out so the default values are used. - The `-p` option of `environment-to-ini` is [no longer supported](https://codeberg.org/forgejo/forgejo/commit/fa0b5b14c2faa6a5f76bb2e7bc9241a5e4354189) - The ".png" suffix for [user and organizations is now reserved](https://codeberg.org/forgejo/forgejo/commit/2b91841cd3e1213ff3e4ed4209d6a4be89c2fa79) - The section `[git.reflog]` is [now obsolete and its keys have been moved](https://codeberg.org/forgejo/forgejo/commit/2f149c5c9db97f20fbbc65e32d1f3133048b11a2) to the following replacements: @@ -1741,7 +1761,7 @@ $ git -C forgejo log --oneline --no-merges origin/v1.19/forgejo..origin/v1.20/fo - [The repository migration can be canceled](https://codeberg.org/forgejo/forgejo/commit/f6e029e6c7849d4361abf7f1d749b5d528364ac4) - [Add button on the diff header to copy the file name](https://codeberg.org/forgejo/forgejo/commit/c5ede35124c8d5280219c24049bb0ad7da9f02ed) - [Add --quiet option to the dump CLI](https://codeberg.org/forgejo/forgejo/commit/cb1536471bcef4d78a3fe5cbd738b9f60fabbcc2) - - [Support searching for an issue with its number in the the list of issues](https://codeberg.org/forgejo/forgejo/commit/1144b1d129de530b2c07dfdfaf55de383cd82212) + - [Support searching for an issue with its number in the list of issues](https://codeberg.org/forgejo/forgejo/commit/1144b1d129de530b2c07dfdfaf55de383cd82212) - [Improve the list of notifications](https://codeberg.org/forgejo/forgejo/commit/f7ede92f82f7f3ec7bb31a1249f9524e5b728f34) - [When editing a file in the web UI, allow for a preview whenever possible](https://codeberg.org/forgejo/forgejo/commit/ac64c8297444ade63a2a364c4afb7e6c1de5a75f) - [Make release download URLs human readable](https://codeberg.org/forgejo/forgejo/commit/42919ccb7cd32ab67d0878baf2bac6cd007899a8) @@ -1778,7 +1798,7 @@ $ git -C forgejo log --oneline --no-merges origin/v1.19/forgejo..origin/v1.20/fo - [Add API for gitignore templates](https://codeberg.org/forgejo/forgejo/commit/36a5d4c2f3b5670e5e921034cd5d25817534a6d4) - [Add API to upuload a file to an empty repository](https://codeberg.org/forgejo/forgejo/commit/cf465b472166ccf6d3e001e3043e4bf43e16e6b3) - [Allow for --not when listing the commits of a repo](https://codeberg.org/forgejo/forgejo/commit/f766b002938b5c81e343c81fda3c0669fa09809f) - - [Add `files` and `verification` parameters to improve performances when listing the commits of a a repo](https://codeberg.org/forgejo/forgejo/commit/1dd83dbb917d55bd253001646d6743f247a4d98b) + - [Add `files` and `verification` parameters to improve performances when listing the commits of a repo](https://codeberg.org/forgejo/forgejo/commit/1dd83dbb917d55bd253001646d6743f247a4d98b) - [Allow for listing a single commit in a repository](https://codeberg.org/forgejo/forgejo/commit/5930ab5fdf7a970fcca3cd50b44cf1cacb615a54) - [Create a branch directly from commit on the create branch API](https://codeberg.org/forgejo/forgejo/commit/cd9a13ebb47d32f46b38439a524e3b2e0c619490) - [Add API for Label templates](https://codeberg.org/forgejo/forgejo/commit/25dc1556cd70b567a4920beb002a0addfbfd6ef2) diff --git a/assets/favicon.svg b/assets/favicon.svg index bcacdc0200..bb0031b93d 100644 --- a/assets/favicon.svg +++ b/assets/favicon.svg @@ -1,27 +1,33 @@ - - - - - - - - + + + + + + + + + + + + + + + + + + diff --git a/assets/go-licenses.json b/assets/go-licenses.json index 89fa08074c..e222089dc5 100644 --- a/assets/go-licenses.json +++ b/assets/go-licenses.json @@ -19,11 +19,21 @@ "path": "code.forgejo.org/forgejo-contrib/go-libravatar/LICENSE", "licenseText": "Copyright (c) 2016 Sandro Santilli \u003cstrk@kbt.io\u003e\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n" }, + { + "name": "code.forgejo.org/forgejo/levelqueue", + "path": "code.forgejo.org/forgejo/levelqueue/LICENSE", + "licenseText": "Copyright (c) 2019 Lunny Xiao\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n" + }, { "name": "code.forgejo.org/forgejo/reply", "path": "code.forgejo.org/forgejo/reply/LICENSE", "licenseText": "MIT License\n\nCopyright (c) The Forgejo Authors\nCopyright (c) Discourse\nCopyright (c) Claudemiro\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n" }, + { + "name": "code.forgejo.org/go-chi/binding", + "path": "code.forgejo.org/go-chi/binding/LICENSE", + "licenseText": "Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n\"License\" shall mean the terms and conditions for use, reproduction, and\ndistribution as defined by Sections 1 through 9 of this document.\n\n\"Licensor\" shall mean the copyright owner or entity authorized by the copyright\nowner that is granting the License.\n\n\"Legal Entity\" shall mean the union of the acting entity and all other entities\nthat control, are controlled by, or are under common control with that entity.\nFor the purposes of this definition, \"control\" means (i) the power, direct or\nindirect, to cause the direction or management of such entity, whether by\ncontract or otherwise, or (ii) ownership of fifty percent (50%) or more of the\noutstanding shares, or (iii) beneficial ownership of such entity.\n\n\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising\npermissions granted by this License.\n\n\"Source\" form shall mean the preferred form for making modifications, including\nbut not limited to software source code, documentation source, and configuration\nfiles.\n\n\"Object\" form shall mean any form resulting from mechanical transformation or\ntranslation of a Source form, including but not limited to compiled object code,\ngenerated documentation, and conversions to other media types.\n\n\"Work\" shall mean the work of authorship, whether in Source or Object form, made\navailable under the License, as indicated by a copyright notice that is included\nin or attached to the work (an example is provided in the Appendix below).\n\n\"Derivative Works\" shall mean any work, whether in Source or Object form, that\nis based on (or derived from) the Work and for which the editorial revisions,\nannotations, elaborations, or other modifications represent, as a whole, an\noriginal work of authorship. For the purposes of this License, Derivative Works\nshall not include works that remain separable from, or merely link (or bind by\nname) to the interfaces of, the Work and Derivative Works thereof.\n\n\"Contribution\" shall mean any work of authorship, including the original version\nof the Work and any modifications or additions to that Work or Derivative Works\nthereof, that is intentionally submitted to Licensor for inclusion in the Work\nby the copyright owner or by an individual or Legal Entity authorized to submit\non behalf of the copyright owner. For the purposes of this definition,\n\"submitted\" means any form of electronic, verbal, or written communication sent\nto the Licensor or its representatives, including but not limited to\ncommunication on electronic mailing lists, source code control systems, and\nissue tracking systems that are managed by, or on behalf of, the Licensor for\nthe purpose of discussing and improving the Work, but excluding communication\nthat is conspicuously marked or otherwise designated in writing by the copyright\nowner as \"Not a Contribution.\"\n\n\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf\nof whom a Contribution has been received by Licensor and subsequently\nincorporated within the Work.\n\n2. Grant of Copyright License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable copyright license to reproduce, prepare Derivative Works of,\npublicly display, publicly perform, sublicense, and distribute the Work and such\nDerivative Works in Source or Object form.\n\n3. Grant of Patent License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable (except as stated in this section) patent license to make, have\nmade, use, offer to sell, sell, import, and otherwise transfer the Work, where\nsuch license applies only to those patent claims licensable by such Contributor\nthat are necessarily infringed by their Contribution(s) alone or by combination\nof their Contribution(s) with the Work to which such Contribution(s) was\nsubmitted. If You institute patent litigation against any entity (including a\ncross-claim or counterclaim in a lawsuit) alleging that the Work or a\nContribution incorporated within the Work constitutes direct or contributory\npatent infringement, then any patent licenses granted to You under this License\nfor that Work shall terminate as of the date such litigation is filed.\n\n4. Redistribution.\n\nYou may reproduce and distribute copies of the Work or Derivative Works thereof\nin any medium, with or without modifications, and in Source or Object form,\nprovided that You meet the following conditions:\n\nYou must give any other recipients of the Work or Derivative Works a copy of\nthis License; and\nYou must cause any modified files to carry prominent notices stating that You\nchanged the files; and\nYou must retain, in the Source form of any Derivative Works that You distribute,\nall copyright, patent, trademark, and attribution notices from the Source form\nof the Work, excluding those notices that do not pertain to any part of the\nDerivative Works; and\nIf the Work includes a \"NOTICE\" text file as part of its distribution, then any\nDerivative Works that You distribute must include a readable copy of the\nattribution notices contained within such NOTICE file, excluding those notices\nthat do not pertain to any part of the Derivative Works, in at least one of the\nfollowing places: within a NOTICE text file distributed as part of the\nDerivative Works; within the Source form or documentation, if provided along\nwith the Derivative Works; or, within a display generated by the Derivative\nWorks, if and wherever such third-party notices normally appear. The contents of\nthe NOTICE file are for informational purposes only and do not modify the\nLicense. You may add Your own attribution notices within Derivative Works that\nYou distribute, alongside or as an addendum to the NOTICE text from the Work,\nprovided that such additional attribution notices cannot be construed as\nmodifying the License.\nYou may add Your own copyright statement to Your modifications and may provide\nadditional or different license terms and conditions for use, reproduction, or\ndistribution of Your modifications, or for any such Derivative Works as a whole,\nprovided Your use, reproduction, and distribution of the Work otherwise complies\nwith the conditions stated in this License.\n\n5. Submission of Contributions.\n\nUnless You explicitly state otherwise, any Contribution intentionally submitted\nfor inclusion in the Work by You to the Licensor shall be under the terms and\nconditions of this License, without any additional terms or conditions.\nNotwithstanding the above, nothing herein shall supersede or modify the terms of\nany separate license agreement you may have executed with Licensor regarding\nsuch Contributions.\n\n6. Trademarks.\n\nThis License does not grant permission to use the trade names, trademarks,\nservice marks, or product names of the Licensor, except as required for\nreasonable and customary use in describing the origin of the Work and\nreproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty.\n\nUnless required by applicable law or agreed to in writing, Licensor provides the\nWork (and each Contributor provides its Contributions) on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,\nincluding, without limitation, any warranties or conditions of TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are\nsolely responsible for determining the appropriateness of using or\nredistributing the Work and assume any risks associated with Your exercise of\npermissions under this License.\n\n8. Limitation of Liability.\n\nIn no event and under no legal theory, whether in tort (including negligence),\ncontract, or otherwise, unless required by applicable law (such as deliberate\nand grossly negligent acts) or agreed to in writing, shall any Contributor be\nliable to You for damages, including any direct, indirect, special, incidental,\nor consequential damages of any character arising as a result of this License or\nout of the use or inability to use the Work (including but not limited to\ndamages for loss of goodwill, work stoppage, computer failure or malfunction, or\nany and all other commercial damages or losses), even if such Contributor has\nbeen advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability.\n\nWhile redistributing the Work or Derivative Works thereof, You may choose to\noffer, and charge a fee for, acceptance of support, warranty, indemnity, or\nother liability obligations and/or rights consistent with this License. However,\nin accepting such obligations, You may act only on Your own behalf and on Your\nsole responsibility, not on behalf of any other Contributor, and only if You\nagree to indemnify, defend, and hold each Contributor harmless for any liability\nincurred by, or claims asserted against, such Contributor by reason of your\naccepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work\n\nTo apply the Apache License to your work, attach the following boilerplate\nnotice, with the fields enclosed by brackets \"[]\" replaced with your own\nidentifying information. (Don't include the brackets!) The text should be\nenclosed in the appropriate comment syntax for the file format. We also\nrecommend that a file or class name and description of purpose be included on\nthe same \"printed page\" as the copyright notice for easier identification within\nthird-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License." + }, { "name": "code.forgejo.org/go-chi/cache", "path": "code.forgejo.org/go-chi/cache/LICENSE", @@ -75,14 +85,9 @@ "licenseText": "MIT License\n\nCopyright (c) 2019 Go xsd:duration\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n" }, { - "name": "gitea.com/go-chi/binding", - "path": "gitea.com/go-chi/binding/LICENSE", - "licenseText": "Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n\"License\" shall mean the terms and conditions for use, reproduction, and\ndistribution as defined by Sections 1 through 9 of this document.\n\n\"Licensor\" shall mean the copyright owner or entity authorized by the copyright\nowner that is granting the License.\n\n\"Legal Entity\" shall mean the union of the acting entity and all other entities\nthat control, are controlled by, or are under common control with that entity.\nFor the purposes of this definition, \"control\" means (i) the power, direct or\nindirect, to cause the direction or management of such entity, whether by\ncontract or otherwise, or (ii) ownership of fifty percent (50%) or more of the\noutstanding shares, or (iii) beneficial ownership of such entity.\n\n\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising\npermissions granted by this License.\n\n\"Source\" form shall mean the preferred form for making modifications, including\nbut not limited to software source code, documentation source, and configuration\nfiles.\n\n\"Object\" form shall mean any form resulting from mechanical transformation or\ntranslation of a Source form, including but not limited to compiled object code,\ngenerated documentation, and conversions to other media types.\n\n\"Work\" shall mean the work of authorship, whether in Source or Object form, made\navailable under the License, as indicated by a copyright notice that is included\nin or attached to the work (an example is provided in the Appendix below).\n\n\"Derivative Works\" shall mean any work, whether in Source or Object form, that\nis based on (or derived from) the Work and for which the editorial revisions,\nannotations, elaborations, or other modifications represent, as a whole, an\noriginal work of authorship. For the purposes of this License, Derivative Works\nshall not include works that remain separable from, or merely link (or bind by\nname) to the interfaces of, the Work and Derivative Works thereof.\n\n\"Contribution\" shall mean any work of authorship, including the original version\nof the Work and any modifications or additions to that Work or Derivative Works\nthereof, that is intentionally submitted to Licensor for inclusion in the Work\nby the copyright owner or by an individual or Legal Entity authorized to submit\non behalf of the copyright owner. For the purposes of this definition,\n\"submitted\" means any form of electronic, verbal, or written communication sent\nto the Licensor or its representatives, including but not limited to\ncommunication on electronic mailing lists, source code control systems, and\nissue tracking systems that are managed by, or on behalf of, the Licensor for\nthe purpose of discussing and improving the Work, but excluding communication\nthat is conspicuously marked or otherwise designated in writing by the copyright\nowner as \"Not a Contribution.\"\n\n\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf\nof whom a Contribution has been received by Licensor and subsequently\nincorporated within the Work.\n\n2. Grant of Copyright License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable copyright license to reproduce, prepare Derivative Works of,\npublicly display, publicly perform, sublicense, and distribute the Work and such\nDerivative Works in Source or Object form.\n\n3. Grant of Patent License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable (except as stated in this section) patent license to make, have\nmade, use, offer to sell, sell, import, and otherwise transfer the Work, where\nsuch license applies only to those patent claims licensable by such Contributor\nthat are necessarily infringed by their Contribution(s) alone or by combination\nof their Contribution(s) with the Work to which such Contribution(s) was\nsubmitted. If You institute patent litigation against any entity (including a\ncross-claim or counterclaim in a lawsuit) alleging that the Work or a\nContribution incorporated within the Work constitutes direct or contributory\npatent infringement, then any patent licenses granted to You under this License\nfor that Work shall terminate as of the date such litigation is filed.\n\n4. Redistribution.\n\nYou may reproduce and distribute copies of the Work or Derivative Works thereof\nin any medium, with or without modifications, and in Source or Object form,\nprovided that You meet the following conditions:\n\nYou must give any other recipients of the Work or Derivative Works a copy of\nthis License; and\nYou must cause any modified files to carry prominent notices stating that You\nchanged the files; and\nYou must retain, in the Source form of any Derivative Works that You distribute,\nall copyright, patent, trademark, and attribution notices from the Source form\nof the Work, excluding those notices that do not pertain to any part of the\nDerivative Works; and\nIf the Work includes a \"NOTICE\" text file as part of its distribution, then any\nDerivative Works that You distribute must include a readable copy of the\nattribution notices contained within such NOTICE file, excluding those notices\nthat do not pertain to any part of the Derivative Works, in at least one of the\nfollowing places: within a NOTICE text file distributed as part of the\nDerivative Works; within the Source form or documentation, if provided along\nwith the Derivative Works; or, within a display generated by the Derivative\nWorks, if and wherever such third-party notices normally appear. The contents of\nthe NOTICE file are for informational purposes only and do not modify the\nLicense. You may add Your own attribution notices within Derivative Works that\nYou distribute, alongside or as an addendum to the NOTICE text from the Work,\nprovided that such additional attribution notices cannot be construed as\nmodifying the License.\nYou may add Your own copyright statement to Your modifications and may provide\nadditional or different license terms and conditions for use, reproduction, or\ndistribution of Your modifications, or for any such Derivative Works as a whole,\nprovided Your use, reproduction, and distribution of the Work otherwise complies\nwith the conditions stated in this License.\n\n5. Submission of Contributions.\n\nUnless You explicitly state otherwise, any Contribution intentionally submitted\nfor inclusion in the Work by You to the Licensor shall be under the terms and\nconditions of this License, without any additional terms or conditions.\nNotwithstanding the above, nothing herein shall supersede or modify the terms of\nany separate license agreement you may have executed with Licensor regarding\nsuch Contributions.\n\n6. Trademarks.\n\nThis License does not grant permission to use the trade names, trademarks,\nservice marks, or product names of the Licensor, except as required for\nreasonable and customary use in describing the origin of the Work and\nreproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty.\n\nUnless required by applicable law or agreed to in writing, Licensor provides the\nWork (and each Contributor provides its Contributions) on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,\nincluding, without limitation, any warranties or conditions of TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are\nsolely responsible for determining the appropriateness of using or\nredistributing the Work and assume any risks associated with Your exercise of\npermissions under this License.\n\n8. Limitation of Liability.\n\nIn no event and under no legal theory, whether in tort (including negligence),\ncontract, or otherwise, unless required by applicable law (such as deliberate\nand grossly negligent acts) or agreed to in writing, shall any Contributor be\nliable to You for damages, including any direct, indirect, special, incidental,\nor consequential damages of any character arising as a result of this License or\nout of the use or inability to use the Work (including but not limited to\ndamages for loss of goodwill, work stoppage, computer failure or malfunction, or\nany and all other commercial damages or losses), even if such Contributor has\nbeen advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability.\n\nWhile redistributing the Work or Derivative Works thereof, You may choose to\noffer, and charge a fee for, acceptance of support, warranty, indemnity, or\nother liability obligations and/or rights consistent with this License. However,\nin accepting such obligations, You may act only on Your own behalf and on Your\nsole responsibility, not on behalf of any other Contributor, and only if You\nagree to indemnify, defend, and hold each Contributor harmless for any liability\nincurred by, or claims asserted against, such Contributor by reason of your\naccepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work\n\nTo apply the Apache License to your work, attach the following boilerplate\nnotice, with the fields enclosed by brackets \"[]\" replaced with your own\nidentifying information. (Don't include the brackets!) The text should be\nenclosed in the appropriate comment syntax for the file format. We also\nrecommend that a file or class name and description of purpose be included on\nthe same \"printed page\" as the copyright notice for easier identification within\nthird-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License." - }, - { - "name": "gitea.com/lunny/levelqueue", - "path": "gitea.com/lunny/levelqueue/LICENSE", - "licenseText": "Copyright (c) 2019 Lunny Xiao\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n" + "name": "github.com/42wim/httpsig", + "path": "github.com/42wim/httpsig/LICENSE", + "licenseText": "BSD 3-Clause License\n\nCopyright (c) 2018, go-fed\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" }, { "name": "github.com/42wim/sshsig", @@ -105,8 +110,8 @@ "licenseText": "Copyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" }, { - "name": "github.com/RoaringBitmap/roaring", - "path": "github.com/RoaringBitmap/roaring/LICENSE", + "name": "github.com/RoaringBitmap/roaring/v2", + "path": "github.com/RoaringBitmap/roaring/v2/LICENSE", "licenseText": "\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright 2016 by the authors\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n================================================================================\n\nPortions of runcontainer.go are from the Go standard library, which is licensed\nunder:\n\nCopyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\n copyright notice, this list of conditions and the following disclaimer\n in the documentation and/or other materials provided with the\n distribution.\n * Neither the name of Google Inc. nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" }, { @@ -292,7 +297,7 @@ { "name": "github.com/cyphar/filepath-securejoin", "path": "github.com/cyphar/filepath-securejoin/LICENSE", - "licenseText": "Copyright (C) 2014-2015 Docker Inc \u0026 Go Authors. All rights reserved.\nCopyright (C) 2017 SUSE LLC. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" + "licenseText": "Copyright (C) 2014-2015 Docker Inc \u0026 Go Authors. All rights reserved.\nCopyright (C) 2017-2024 SUSE LLC. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" }, { "name": "github.com/davecgh/go-spew/spew", @@ -489,11 +494,6 @@ "path": "github.com/golang-jwt/jwt/v5/LICENSE", "licenseText": "Copyright (c) 2012 Dave Grijalva\nCopyright (c) 2021 golang-jwt maintainers\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n" }, - { - "name": "github.com/golang/geo", - "path": "github.com/golang/geo/LICENSE", - "licenseText": "\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n" - }, { "name": "github.com/golang/groupcache/lru", "path": "github.com/golang/groupcache/lru/LICENSE", @@ -567,7 +567,7 @@ { "name": "github.com/gorilla/sessions", "path": "github.com/gorilla/sessions/LICENSE", - "licenseText": "Copyright (c) 2023 The Gorilla Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n\t * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n\t * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n\t * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" + "licenseText": "Copyright (c) 2024 The Gorilla Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n\t * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n\t * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n\t * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" }, { "name": "github.com/hashicorp/go-cleanhttp", @@ -610,8 +610,8 @@ "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2014 Juan Batiz-Benet\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n" }, { - "name": "github.com/jhillyerd/enmime", - "path": "github.com/jhillyerd/enmime/LICENSE", + "name": "github.com/jhillyerd/enmime/v2", + "path": "github.com/jhillyerd/enmime/v2/LICENSE", "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2012-2016 James Hillyerd, All Rights Reserved\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n" }, { @@ -712,11 +712,11 @@ { "name": "github.com/meilisearch/meilisearch-go", "path": "github.com/meilisearch/meilisearch-go/LICENSE", - "licenseText": "MIT License\n\nCopyright (c) 2020-2024 Meili SAS\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n" + "licenseText": "MIT License\n\nCopyright (c) 2020-2025 Meili SAS\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n" }, { - "name": "github.com/mholt/acmez/v2", - "path": "github.com/mholt/acmez/v2/LICENSE", + "name": "github.com/mholt/acmez/v3", + "path": "github.com/mholt/acmez/v3/LICENSE", "licenseText": " Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n" }, { @@ -734,6 +734,11 @@ "path": "github.com/miekg/dns/LICENSE", "licenseText": "BSD 3-Clause License\n\nCopyright (c) 2009, The Go Authors. Extensions copyright (c) 2011, Miek Gieben. \nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" }, + { + "name": "github.com/minio/crc64nvme", + "path": "github.com/minio/crc64nvme/LICENSE", + "licenseText": "\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n" + }, { "name": "github.com/minio/md5-simd", "path": "github.com/minio/md5-simd/LICENSE", @@ -759,6 +764,11 @@ "path": "github.com/modern-go/reflect2/LICENSE", "licenseText": " Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n" }, + { + "name": "github.com/munnerz/goautoneg", + "path": "github.com/munnerz/goautoneg/LICENSE", + "licenseText": "Copyright (c) 2011, Open Knowledge Foundation Ltd.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n\n Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in\n the documentation and/or other materials provided with the\n distribution.\n\n Neither the name of the Open Knowledge Foundation Ltd. nor the\n names of its contributors may be used to endorse or promote\n products derived from this software without specific prior written\n permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" + }, { "name": "github.com/nektos/act/pkg", "path": "github.com/nektos/act/pkg/LICENSE", @@ -807,7 +817,7 @@ { "name": "github.com/pjbgf/sha1cd", "path": "github.com/pjbgf/sha1cd/LICENSE", - "licenseText": " Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n" + "licenseText": " Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright 2023 pjbgf\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n" }, { "name": "github.com/pkg/errors", @@ -824,6 +834,11 @@ "path": "github.com/pquerna/otp/LICENSE", "licenseText": "\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n" }, + { + "name": "github.com/prometheus/client_golang/internal/github.com/golang/gddo/httputil", + "path": "github.com/prometheus/client_golang/internal/github.com/golang/gddo/httputil/LICENSE", + "licenseText": "Copyright (c) 2013 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" + }, { "name": "github.com/prometheus/client_golang/prometheus", "path": "github.com/prometheus/client_golang/prometheus/LICENSE", @@ -934,11 +949,6 @@ "path": "github.com/x448/float16/LICENSE", "licenseText": "MIT License\n\nCopyright (c) 2019 Montgomery Edwardsâ´â´â¸ and Faye Amacker\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n" }, - { - "name": "github.com/xanzy/go-gitlab", - "path": "github.com/xanzy/go-gitlab/LICENSE", - "licenseText": " Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"{}\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright {yyyy} {name of copyright owner}\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n" - }, { "name": "github.com/xanzy/ssh-agent", "path": "github.com/xanzy/ssh-agent/LICENSE", @@ -969,6 +979,11 @@ "path": "github.com/zeebo/blake3/LICENSE", "licenseText": "This work is released into the public domain with CC0 1.0.\n\n-------------------------------------------------------------------------------\n\nCreative Commons Legal Code\n\nCC0 1.0 Universal\n\n CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE\n LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN\n ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS\n INFORMATION ON AN \"AS-IS\" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES\n REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS\n PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM\n THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED\n HEREUNDER.\n\nStatement of Purpose\n\nThe laws of most jurisdictions throughout the world automatically confer\nexclusive Copyright and Related Rights (defined below) upon the creator\nand subsequent owner(s) (each and all, an \"owner\") of an original work of\nauthorship and/or a database (each, a \"Work\").\n\nCertain owners wish to permanently relinquish those rights to a Work for\nthe purpose of contributing to a commons of creative, cultural and\nscientific works (\"Commons\") that the public can reliably and without fear\nof later claims of infringement build upon, modify, incorporate in other\nworks, reuse and redistribute as freely as possible in any form whatsoever\nand for any purposes, including without limitation commercial purposes.\nThese owners may contribute to the Commons to promote the ideal of a free\nculture and the further production of creative, cultural and scientific\nworks, or to gain reputation or greater distribution for their Work in\npart through the use and efforts of others.\n\nFor these and/or other purposes and motivations, and without any\nexpectation of additional consideration or compensation, the person\nassociating CC0 with a Work (the \"Affirmer\"), to the extent that he or she\nis an owner of Copyright and Related Rights in the Work, voluntarily\nelects to apply CC0 to the Work and publicly distribute the Work under its\nterms, with knowledge of his or her Copyright and Related Rights in the\nWork and the meaning and intended legal effect of CC0 on those rights.\n\n1. Copyright and Related Rights. A Work made available under CC0 may be\nprotected by copyright and related or neighboring rights (\"Copyright and\nRelated Rights\"). Copyright and Related Rights include, but are not\nlimited to, the following:\n\n i. the right to reproduce, adapt, distribute, perform, display,\n communicate, and translate a Work;\n ii. moral rights retained by the original author(s) and/or performer(s);\niii. publicity and privacy rights pertaining to a person's image or\n likeness depicted in a Work;\n iv. rights protecting against unfair competition in regards to a Work,\n subject to the limitations in paragraph 4(a), below;\n v. rights protecting the extraction, dissemination, use and reuse of data\n in a Work;\n vi. database rights (such as those arising under Directive 96/9/EC of the\n European Parliament and of the Council of 11 March 1996 on the legal\n protection of databases, and under any national implementation\n thereof, including any amended or successor version of such\n directive); and\nvii. other similar, equivalent or corresponding rights throughout the\n world based on applicable law or treaty, and any national\n implementations thereof.\n\n2. Waiver. To the greatest extent permitted by, but not in contravention\nof, applicable law, Affirmer hereby overtly, fully, permanently,\nirrevocably and unconditionally waives, abandons, and surrenders all of\nAffirmer's Copyright and Related Rights and associated claims and causes\nof action, whether now known or unknown (including existing as well as\nfuture claims and causes of action), in the Work (i) in all territories\nworldwide, (ii) for the maximum duration provided by applicable law or\ntreaty (including future time extensions), (iii) in any current or future\nmedium and for any number of copies, and (iv) for any purpose whatsoever,\nincluding without limitation commercial, advertising or promotional\npurposes (the \"Waiver\"). Affirmer makes the Waiver for the benefit of each\nmember of the public at large and to the detriment of Affirmer's heirs and\nsuccessors, fully intending that such Waiver shall not be subject to\nrevocation, rescission, cancellation, termination, or any other legal or\nequitable action to disrupt the quiet enjoyment of the Work by the public\nas contemplated by Affirmer's express Statement of Purpose.\n\n3. Public License Fallback. Should any part of the Waiver for any reason\nbe judged legally invalid or ineffective under applicable law, then the\nWaiver shall be preserved to the maximum extent permitted taking into\naccount Affirmer's express Statement of Purpose. In addition, to the\nextent the Waiver is so judged Affirmer hereby grants to each affected\nperson a royalty-free, non transferable, non sublicensable, non exclusive,\nirrevocable and unconditional license to exercise Affirmer's Copyright and\nRelated Rights in the Work (i) in all territories worldwide, (ii) for the\nmaximum duration provided by applicable law or treaty (including future\ntime extensions), (iii) in any current or future medium and for any number\nof copies, and (iv) for any purpose whatsoever, including without\nlimitation commercial, advertising or promotional purposes (the\n\"License\"). The License shall be deemed effective as of the date CC0 was\napplied by Affirmer to the Work. Should any part of the License for any\nreason be judged legally invalid or ineffective under applicable law, such\npartial invalidity or ineffectiveness shall not invalidate the remainder\nof the License, and in such case Affirmer hereby affirms that he or she\nwill not (i) exercise any of his or her remaining Copyright and Related\nRights in the Work or (ii) assert any associated claims and causes of\naction with respect to the Work, in either case contrary to Affirmer's\nexpress Statement of Purpose.\n\n4. Limitations and Disclaimers.\n\n a. No trademark or patent rights held by Affirmer are waived, abandoned,\n surrendered, licensed or otherwise affected by this document.\n b. Affirmer offers the Work as-is and makes no representations or\n warranties of any kind concerning the Work, express, implied,\n statutory or otherwise, including without limitation warranties of\n title, merchantability, fitness for a particular purpose, non\n infringement, or the absence of latent or other defects, accuracy, or\n the present or absence of errors, whether or not discoverable, all to\n the greatest extent permissible under applicable law.\n c. Affirmer disclaims responsibility for clearing rights of other persons\n that may apply to the Work or any use thereof, including without\n limitation any person's Copyright and Related Rights in the Work.\n Further, Affirmer disclaims responsibility for obtaining any necessary\n consents, permissions or other rights required for any use of the\n Work.\n d. Affirmer understands and acknowledges that Creative Commons is not a\n party to this document and has no duty or obligation with respect to\n this CC0 or use of the Work.\n" }, + { + "name": "gitlab.com/gitlab-org/api/client-go", + "path": "gitlab.com/gitlab-org/api/client-go/LICENSE", + "licenseText": " Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"{}\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright {yyyy} {name of copyright owner}\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n" + }, { "name": "go.etcd.io/bbolt", "path": "go.etcd.io/bbolt/LICENSE", @@ -989,6 +1004,11 @@ "path": "go.uber.org/zap/LICENSE", "licenseText": "Copyright (c) 2016-2017 Uber Technologies, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n" }, + { + "name": "go.uber.org/zap/exp/zapslog", + "path": "go.uber.org/zap/exp/zapslog/LICENSE", + "licenseText": "Copyright (c) 2016-2024 Uber Technologies, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n" + }, { "name": "golang.org/x/crypto", "path": "golang.org/x/crypto/LICENSE", @@ -1032,17 +1052,7 @@ { "name": "golang.org/x/time/rate", "path": "golang.org/x/time/rate/LICENSE", - "licenseText": "Copyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" - }, - { - "name": "google.golang.org/genproto/googleapis/rpc/status", - "path": "google.golang.org/genproto/googleapis/rpc/status/LICENSE", - "licenseText": "\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n" - }, - { - "name": "google.golang.org/grpc", - "path": "google.golang.org/grpc/LICENSE", - "licenseText": "\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n" + "licenseText": "Copyright 2009 The Go Authors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google LLC nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" }, { "name": "google.golang.org/protobuf", diff --git a/assets/logo.svg b/assets/logo.svg index bcacdc0200..bb0031b93d 100644 --- a/assets/logo.svg +++ b/assets/logo.svg @@ -1,27 +1,33 @@ - - - - - - - - + + + + + + + + + + + + + + + + + + diff --git a/build.go b/build.go index 234579b514..d410e171c7 100644 --- a/build.go +++ b/build.go @@ -11,13 +11,4 @@ package main import ( // for embed _ "github.com/shurcooL/vfsgen" - - // for cover merge - _ "golang.org/x/tools/cover" - - // for vet - _ "code.gitea.io/gitea-vet" - - // for swagger - _ "github.com/go-swagger/go-swagger/cmd/swagger" ) diff --git a/build/backport-locales.go b/build/backport-locales.go index 3df83ea6d9..3125f19014 100644 --- a/build/backport-locales.go +++ b/build/backport-locales.go @@ -12,8 +12,8 @@ import ( "path/filepath" "strings" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/container" + "forgejo.org/modules/setting" ) func main() { diff --git a/build/code-batch-process.go b/build/code-batch-process.go index cc2ab68026..516736b65c 100644 --- a/build/code-batch-process.go +++ b/build/code-batch-process.go @@ -15,7 +15,7 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/build/codeformat" + "forgejo.org/build/codeformat" ) // Windows has a limitation for command line arguments, the size can not exceed 32KB. diff --git a/build/codeformat/formatimports.go b/build/codeformat/formatimports.go index c9fc2a27b4..acedd13234 100644 --- a/build/codeformat/formatimports.go +++ b/build/codeformat/formatimports.go @@ -13,8 +13,8 @@ import ( ) var importPackageGroupOrders = map[string]int{ - "": 1, // internal - "code.gitea.io/gitea/": 2, + "": 1, // internal + "forgejo.org/": 2, } var errInvalidCommentBetweenImports = errors.New("comments between imported packages are invalid, please move comments to the end of the package line") diff --git a/build/codeformat/formatimports_test.go b/build/codeformat/formatimports_test.go index 1abc9f8ab7..03c780911f 100644 --- a/build/codeformat/formatimports_test.go +++ b/build/codeformat/formatimports_test.go @@ -58,8 +58,8 @@ import ( "code.gitea.io/other/package" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" "xorm.io/the/package" @@ -82,8 +82,8 @@ import ( _ "image/jpeg" // for processing jpeg images _ "image/png" // for processing png images - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" "code.gitea.io/other/package" "github.com/issue9/identicon" diff --git a/build/generate-disposable-email.go b/build/generate-disposable-email.go new file mode 100644 index 0000000000..f87df088c5 --- /dev/null +++ b/build/generate-disposable-email.go @@ -0,0 +1,203 @@ +// Copyright 2024 James Hatfield +// SPDX-License-Identifier: MIT + +//go:build ignore + +package main + +import ( + "bufio" + "bytes" + "crypto" + "flag" + "fmt" + "go/format" + "io" + "log" + "net/http" + "os" + "regexp" + "strings" +) + +const disposableEmailListURL string = "https://raw.githubusercontent.com/disposable-email-domains/disposable-email-domains/%s/disposable_email_blocklist.conf" + +var ( + gitRef *string = flag.String("r", "master", "Git reference of the domain list version") + outPat *string = flag.String("o", "modules/setting/disposable_email_domain_data.go", "Output path") + check *bool = flag.Bool("check", false, "Check if the current output file matches the current upstream list") +) + +func main() { + flag.Parse() + + if *check { + // read in the local copy of the domain list + local, err := get_local_file() + if err != nil { + log.Fatalf("File Read Error: %v", err) + } + + // generate the remote copy of the domain list + remote, err := generate() + if err != nil { + log.Fatalf("Generation Error: %v", err) + } + + // strip the comments from both (so we dont fail simply due to git ref difference) + local = strip_comments(local) + remote = strip_comments(remote) + + // generate the hash of the local copy + local_sha, err := hash(local) + if err != nil { + log.Fatalf("Local Hash Generation Error: %v", err) + } + + // generate the hash of the remote copy + remote_sha, err := hash(remote) + if err != nil { + log.Fatalf("Remote Hash Generation Error: %v", err) + } + + // if the hashes dont match then the local copy needs to be updated + if local_sha != remote_sha { + log.Fatalf("Disposable email domain list needs to be updated!! \"make lint-disposable-emails-fix\"") + } + } else { + // generate the source code (array of domains) + res, err := generate() + if err != nil { + log.Fatalf("Generation Error: %v", err) + } + + // write result to a file + err = os.WriteFile(*outPat, res, 0o644) + if err != nil { + log.Fatalf("File Write Error: %v", err) + } + } +} + +func strip_comments(data []byte) []byte { + result := make([]byte, 0, len(data)) + + re := regexp.MustCompile(`^\W*//.*$`) + + for _, line := range bytes.Split(data, []byte("\n")) { + if !re.Match(line) { + result = append(result, line...) + } + } + + return result +} + +func hash(data []byte) (string, error) { + var err error + + hash := crypto.SHA3_256.New() + + _, err = hash.Write(data) + if err != nil { + return "", err + } + + return fmt.Sprintf("%x", hash.Sum(nil)), err +} + +func get_local_file() ([]byte, error) { + var err error + + f, err := os.Open(*outPat) + if err != nil { + return nil, err + } + defer f.Close() + + data, err := io.ReadAll(f) + if err != nil { + return nil, err + } + + return data, err +} + +func get_remote() ([]string, error) { + var err error + var url string = fmt.Sprintf(disposableEmailListURL, *gitRef) + + // download the domain list + res, err := http.Get(url) + if err != nil { + return nil, err + } + defer res.Body.Close() + + body, err := io.ReadAll(res.Body) + if err != nil { + return nil, err + } + + // go through all entries (1 domain per line) + scanner := bufio.NewScanner(bytes.NewReader(body)) + + var arrDomains []string + for scanner.Scan() { + line := scanner.Text() + arrDomains = append(arrDomains, line) + } + + return arrDomains, err +} + +func generate() ([]byte, error) { + var err error + var url string = fmt.Sprintf(disposableEmailListURL, *gitRef) + + // download the domains list + arrDomains, err := get_remote() + if err != nil { + return nil, err + } + + // build the string in a readable way + var sb strings.Builder + + _, err = sb.WriteString("[]string{\n") + if err != nil { + return nil, err + } + + for _, item := range arrDomains { + _, err = sb.WriteString(fmt.Sprintf("\t%q,\n", item)) + if err != nil { + return nil, err + } + } + + _, err = sb.WriteString("}") + if err != nil { + return nil, err + } + + // insert the values into file + final := fmt.Sprintf(hdr, url, sb.String()) + + return format.Source([]byte(final)) +} + +const hdr = ` +// Copyright 2024 James Hatfield +// SPDX-License-Identifier: MIT +// +// Code generated by build/generate-disposable-email.go. DO NOT EDIT +// Sourced from %s +package setting + +import "sync" + +var DisposableEmailDomains = sync.OnceValue(func() []string { + return %s +}) +` diff --git a/build/generate-emoji.go b/build/generate-emoji.go index 5a88e456ee..0ad49a6541 100644 --- a/build/generate-emoji.go +++ b/build/generate-emoji.go @@ -20,7 +20,7 @@ import ( "strings" "unicode/utf8" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" ) const ( @@ -53,8 +53,6 @@ func (e Emoji) MarshalJSON() ([]byte, error) { } func main() { - var err error - flag.Parse() // generate data @@ -83,8 +81,6 @@ var replacer = strings.NewReplacer( var emojiRE = regexp.MustCompile(`\{Emoji:"([^"]*)"`) func generate() ([]byte, error) { - var err error - // load gemoji data res, err := http.Get(gemojiURL) if err != nil { diff --git a/build/generate-gitignores.go b/build/generate-gitignores.go index 1e09c83a6a..7acfd6cbe4 100644 --- a/build/generate-gitignores.go +++ b/build/generate-gitignores.go @@ -15,7 +15,7 @@ import ( "path/filepath" "strings" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/util" ) func main() { diff --git a/build/generate-go-licenses.go b/build/generate-go-licenses.go index 22ef817ebc..3f4d62a2cc 100644 --- a/build/generate-go-licenses.go +++ b/build/generate-go-licenses.go @@ -16,7 +16,7 @@ import ( "sort" "strings" - "code.gitea.io/gitea/modules/container" + "forgejo.org/modules/container" ) // regexp is based on go-license, excluding README and NOTICE @@ -102,9 +102,9 @@ func main() { pkgName := path.Dir(pkgPath) // There might be a bug somewhere in go-licenses that sometimes interprets the - // root package as "." and sometimes as "code.gitea.io/gitea". Workaround by + // root package as "." and sometimes as "forgejo.org". Workaround by // removing both of them for the sake of stable output. - if pkgName == "." || pkgName == "code.gitea.io/gitea" { + if pkgName == "." || pkgName == "forgejo.org" { continue } diff --git a/build/generate-licenses.go b/build/generate-licenses.go index 9a111bc811..e925d8af02 100644 --- a/build/generate-licenses.go +++ b/build/generate-licenses.go @@ -15,7 +15,7 @@ import ( "path/filepath" "strings" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/util" ) func main() { diff --git a/build/gocovmerge.go b/build/gocovmerge.go deleted file mode 100644 index c6f74ed85c..0000000000 --- a/build/gocovmerge.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2020 The Gitea Authors. All rights reserved. -// Copyright (c) 2015, Wade Simmons -// SPDX-License-Identifier: MIT - -// gocovmerge takes the results from multiple `go test -coverprofile` runs and -// merges them into one profile - -//go:build ignore - -package main - -import ( - "flag" - "fmt" - "io" - "log" - "os" - "sort" - - "golang.org/x/tools/cover" -) - -func mergeProfiles(p, merge *cover.Profile) { - if p.Mode != merge.Mode { - log.Fatalf("cannot merge profiles with different modes") - } - // Since the blocks are sorted, we can keep track of where the last block - // was inserted and only look at the blocks after that as targets for merge - startIndex := 0 - for _, b := range merge.Blocks { - startIndex = mergeProfileBlock(p, b, startIndex) - } -} - -func mergeProfileBlock(p *cover.Profile, pb cover.ProfileBlock, startIndex int) int { - sortFunc := func(i int) bool { - pi := p.Blocks[i+startIndex] - return pi.StartLine >= pb.StartLine && (pi.StartLine != pb.StartLine || pi.StartCol >= pb.StartCol) - } - - i := 0 - if sortFunc(i) != true { - i = sort.Search(len(p.Blocks)-startIndex, sortFunc) - } - i += startIndex - if i < len(p.Blocks) && p.Blocks[i].StartLine == pb.StartLine && p.Blocks[i].StartCol == pb.StartCol { - if p.Blocks[i].EndLine != pb.EndLine || p.Blocks[i].EndCol != pb.EndCol { - log.Fatalf("OVERLAP MERGE: %v %v %v", p.FileName, p.Blocks[i], pb) - } - switch p.Mode { - case "set": - p.Blocks[i].Count |= pb.Count - case "count", "atomic": - p.Blocks[i].Count += pb.Count - default: - log.Fatalf("unsupported covermode: '%s'", p.Mode) - } - } else { - if i > 0 { - pa := p.Blocks[i-1] - if pa.EndLine >= pb.EndLine && (pa.EndLine != pb.EndLine || pa.EndCol > pb.EndCol) { - log.Fatalf("OVERLAP BEFORE: %v %v %v", p.FileName, pa, pb) - } - } - if i < len(p.Blocks)-1 { - pa := p.Blocks[i+1] - if pa.StartLine <= pb.StartLine && (pa.StartLine != pb.StartLine || pa.StartCol < pb.StartCol) { - log.Fatalf("OVERLAP AFTER: %v %v %v", p.FileName, pa, pb) - } - } - p.Blocks = append(p.Blocks, cover.ProfileBlock{}) - copy(p.Blocks[i+1:], p.Blocks[i:]) - p.Blocks[i] = pb - } - return i + 1 -} - -func addProfile(profiles []*cover.Profile, p *cover.Profile) []*cover.Profile { - i := sort.Search(len(profiles), func(i int) bool { return profiles[i].FileName >= p.FileName }) - if i < len(profiles) && profiles[i].FileName == p.FileName { - mergeProfiles(profiles[i], p) - } else { - profiles = append(profiles, nil) - copy(profiles[i+1:], profiles[i:]) - profiles[i] = p - } - return profiles -} - -func dumpProfiles(profiles []*cover.Profile, out io.Writer) { - if len(profiles) == 0 { - return - } - fmt.Fprintf(out, "mode: %s\n", profiles[0].Mode) - for _, p := range profiles { - for _, b := range p.Blocks { - fmt.Fprintf(out, "%s:%d.%d,%d.%d %d %d\n", p.FileName, b.StartLine, b.StartCol, b.EndLine, b.EndCol, b.NumStmt, b.Count) - } - } -} - -func main() { - flag.Parse() - - var merged []*cover.Profile - - for _, file := range flag.Args() { - profiles, err := cover.ParseProfiles(file) - if err != nil { - log.Fatalf("failed to parse profile '%s': %v", file, err) - } - for _, p := range profiles { - merged = addProfile(merged, p) - } - } - - dumpProfiles(merged, os.Stdout) -} diff --git a/build/lint-locale-usage/lint-locale-usage.go b/build/lint-locale-usage/lint-locale-usage.go new file mode 100644 index 0000000000..31154ba7cb --- /dev/null +++ b/build/lint-locale-usage/lint-locale-usage.go @@ -0,0 +1,331 @@ +// Copyright 2023 The Gitea Authors. All rights reserved. +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package main + +import ( + "fmt" + "go/ast" + goParser "go/parser" + "go/token" + "io/fs" + "os" + "path/filepath" + "strconv" + "strings" + "text/template" + tmplParser "text/template/parse" + + "forgejo.org/modules/container" + "forgejo.org/modules/locale" + fjTemplates "forgejo.org/modules/templates" + "forgejo.org/modules/util" +) + +// this works by first gathering all valid source string IDs from `en-US` reference files +// and then checking if all used source strings are actually defined + +type OnMsgidHandler func(fset *token.FileSet, pos token.Pos, msgid string) + +type LocatedError struct { + Location string + Kind string + Err error +} + +func (e LocatedError) Error() string { + var sb strings.Builder + + sb.WriteString(e.Location) + sb.WriteString(":\t") + if e.Kind != "" { + sb.WriteString(e.Kind) + sb.WriteString(": ") + } + sb.WriteString("ERROR: ") + sb.WriteString(e.Err.Error()) + + return sb.String() +} + +func isLocaleTrFunction(funcname string) bool { + return funcname == "Tr" || funcname == "TrN" +} + +// the `Handle*File` functions follow the following calling convention: +// * `fname` is the name of the input file +// * `src` is either `nil` (then the function invokes `ReadFile` to read the file) +// or the contents of the file as {`[]byte`, or a `string`} + +func (omh OnMsgidHandler) HandleGoFile(fname string, src any) error { + fset := token.NewFileSet() + node, err := goParser.ParseFile(fset, fname, src, goParser.SkipObjectResolution) + if err != nil { + return LocatedError{ + Location: fname, + Kind: "Go parser", + Err: err, + } + } + + ast.Inspect(node, func(n ast.Node) bool { + // search for function calls of the form `anything.Tr(any-string-lit)` + + call, ok := n.(*ast.CallExpr) + if !ok || len(call.Args) != 1 { + return true + } + + funSel, ok := call.Fun.(*ast.SelectorExpr) + if (!ok) || !isLocaleTrFunction(funSel.Sel.Name) { + return true + } + + argLit, ok := call.Args[0].(*ast.BasicLit) + if (!ok) || argLit.Kind != token.STRING { + return true + } + + // extract string content + arg, err := strconv.Unquote(argLit.Value) + if err != nil { + return true + } + + // found interesting string + omh(fset, argLit.ValuePos, arg) + + return true + }) + + return nil +} + +// derived from source: modules/templates/scopedtmpl/scopedtmpl.go, L169-L213 +func (omh OnMsgidHandler) handleTemplateNode(fset *token.FileSet, node tmplParser.Node) { + switch node.Type() { + case tmplParser.NodeAction: + omh.handleTemplatePipeNode(fset, node.(*tmplParser.ActionNode).Pipe) + case tmplParser.NodeList: + nodeList := node.(*tmplParser.ListNode) + omh.handleTemplateFileNodes(fset, nodeList.Nodes) + case tmplParser.NodePipe: + omh.handleTemplatePipeNode(fset, node.(*tmplParser.PipeNode)) + case tmplParser.NodeTemplate: + omh.handleTemplatePipeNode(fset, node.(*tmplParser.TemplateNode).Pipe) + case tmplParser.NodeIf: + nodeIf := node.(*tmplParser.IfNode) + omh.handleTemplateBranchNode(fset, nodeIf.BranchNode) + case tmplParser.NodeRange: + nodeRange := node.(*tmplParser.RangeNode) + omh.handleTemplateBranchNode(fset, nodeRange.BranchNode) + case tmplParser.NodeWith: + nodeWith := node.(*tmplParser.WithNode) + omh.handleTemplateBranchNode(fset, nodeWith.BranchNode) + + case tmplParser.NodeCommand: + nodeCommand := node.(*tmplParser.CommandNode) + + omh.handleTemplateFileNodes(fset, nodeCommand.Args) + + if len(nodeCommand.Args) != 2 { + return + } + + nodeChain, ok := nodeCommand.Args[0].(*tmplParser.ChainNode) + if !ok { + return + } + + nodeString, ok := nodeCommand.Args[1].(*tmplParser.StringNode) + if !ok { + return + } + + nodeIdent, ok := nodeChain.Node.(*tmplParser.IdentifierNode) + if !ok || nodeIdent.Ident != "ctx" { + return + } + + if len(nodeChain.Field) != 2 || nodeChain.Field[0] != "Locale" || !isLocaleTrFunction(nodeChain.Field[1]) { + return + } + + // found interesting string + // the column numbers are a bit "off", but much better than nothing + omh(fset, token.Pos(nodeString.Pos), nodeString.Text) + + default: + } +} + +func (omh OnMsgidHandler) handleTemplatePipeNode(fset *token.FileSet, pipeNode *tmplParser.PipeNode) { + if pipeNode == nil { + return + } + + // NOTE: we can't pass `pipeNode.Cmds` to handleTemplateFileNodes due to incompatible argument types + for _, node := range pipeNode.Cmds { + omh.handleTemplateNode(fset, node) + } +} + +func (omh OnMsgidHandler) handleTemplateBranchNode(fset *token.FileSet, branchNode tmplParser.BranchNode) { + omh.handleTemplatePipeNode(fset, branchNode.Pipe) + omh.handleTemplateFileNodes(fset, branchNode.List.Nodes) + if branchNode.ElseList != nil { + omh.handleTemplateFileNodes(fset, branchNode.ElseList.Nodes) + } +} + +func (omh OnMsgidHandler) handleTemplateFileNodes(fset *token.FileSet, nodes []tmplParser.Node) { + for _, node := range nodes { + omh.handleTemplateNode(fset, node) + } +} + +func (omh OnMsgidHandler) HandleTemplateFile(fname string, src any) error { + var tmplContent []byte + switch src2 := src.(type) { + case nil: + var err error + tmplContent, err = os.ReadFile(fname) + if err != nil { + return LocatedError{ + Location: fname, + Kind: "ReadFile", + Err: err, + } + } + case []byte: + tmplContent = src2 + case string: + // SAFETY: we do not modify tmplContent below + tmplContent = util.UnsafeStringToBytes(src2) + default: + panic("invalid type for 'src'") + } + + fset := token.NewFileSet() + fset.AddFile(fname, 1, len(tmplContent)).SetLinesForContent(tmplContent) + // SAFETY: we do not modify tmplContent2 below + tmplContent2 := util.UnsafeBytesToString(tmplContent) + + tmpl := template.New(fname) + tmpl.Funcs(fjTemplates.NewFuncMap()) + tmplParsed, err := tmpl.Parse(tmplContent2) + if err != nil { + return LocatedError{ + Location: fname, + Kind: "Template parser", + Err: err, + } + } + omh.handleTemplateFileNodes(fset, tmplParsed.Tree.Root.Nodes) + return nil +} + +// This command assumes that we get started from the project root directory +// +// Possible command line flags: +// +// --allow-missing-msgids don't return an error code if missing message IDs are found +// +// EXIT CODES: +// +// 0 success, no issues found +// 1 unable to walk directory tree +// 2 unable to parse locale ini/json files +// 3 unable to parse go or text/template files +// 4 found missing message IDs +// +//nolint:forbidigo +func main() { + allowMissingMsgids := false + for _, arg := range os.Args[1:] { + if arg == "--allow-missing-msgids" { + allowMissingMsgids = true + } + } + + onError := func(err error) { + if err == nil { + return + } + fmt.Println(err.Error()) + os.Exit(3) + } + + msgids := make(container.Set[string]) + onMsgid := func(trKey, trValue string) error { + msgids[trKey] = struct{}{} + return nil + } + + localeFile := filepath.Join(filepath.Join("options", "locale"), "locale_en-US.ini") + localeContent, err := os.ReadFile(localeFile) + if err != nil { + fmt.Printf("%s:\tERROR: %s\n", localeFile, err.Error()) + os.Exit(2) + } + + if err = locale.IterateMessagesContent(localeContent, onMsgid); err != nil { + fmt.Printf("%s:\tERROR: %s\n", localeFile, err.Error()) + os.Exit(2) + } + + localeFile = filepath.Join(filepath.Join("options", "locale_next"), "locale_en-US.json") + localeContent, err = os.ReadFile(localeFile) + if err != nil { + fmt.Printf("%s:\tERROR: %s\n", localeFile, err.Error()) + os.Exit(2) + } + + if err := locale.IterateMessagesNextContent(localeContent, onMsgid); err != nil { + fmt.Printf("%s:\tERROR: %s\n", localeFile, err.Error()) + os.Exit(2) + } + + gotAnyMsgidError := false + + omh := OnMsgidHandler(func(fset *token.FileSet, pos token.Pos, msgid string) { + if !msgids.Contains(msgid) { + gotAnyMsgidError = true + fmt.Printf("%s:\tmissing msgid: %s\n", fset.Position(pos).String(), msgid) + } + }) + + if err := filepath.WalkDir(".", func(fpath string, d fs.DirEntry, err error) error { + if err != nil { + if os.IsNotExist(err) { + return nil + } + return err + } + name := d.Name() + if d.IsDir() { + if name == "docker" || name == ".git" || name == "node_modules" { + return fs.SkipDir + } + } else if name == "bindata.go" { + // skip false positives + } else if strings.HasSuffix(name, ".go") { + onError(omh.HandleGoFile(fpath, nil)) + } else if strings.HasSuffix(name, ".tmpl") { + if strings.HasPrefix(fpath, "tests") && strings.HasSuffix(name, ".ini.tmpl") { + // skip false positives + } else { + onError(omh.HandleTemplateFile(fpath, nil)) + } + } + return nil + }); err != nil { + fmt.Printf("walkdir ERROR: %s\n", err.Error()) + os.Exit(1) + } + + if !allowMissingMsgids && gotAnyMsgidError { + os.Exit(4) + } +} diff --git a/build/lint-locale-usage/lint-locale-usage_test.go b/build/lint-locale-usage/lint-locale-usage_test.go new file mode 100644 index 0000000000..3b3b746053 --- /dev/null +++ b/build/lint-locale-usage/lint-locale-usage_test.go @@ -0,0 +1,44 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package main + +import ( + "go/token" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func HandleGoFileWrapped(t *testing.T, fname, src string) []string { + var ret []string + omh := OnMsgidHandler(func(fset *token.FileSet, pos token.Pos, msgid string) { + ret = append(ret, msgid) + }) + require.NoError(t, omh.HandleGoFile(fname, src)) + return ret +} + +func HandleTemplateFileWrapped(t *testing.T, fname, src string) []string { + var ret []string + omh := OnMsgidHandler(func(fset *token.FileSet, pos token.Pos, msgid string) { + ret = append(ret, msgid) + }) + require.NoError(t, omh.HandleTemplateFile(fname, src)) + return ret +} + +func TestUsagesParser(t *testing.T) { + t.Run("go, simple", func(t *testing.T) { + assert.EqualValues(t, + []string{"what.an.example"}, + HandleGoFileWrapped(t, "", "package main\nfunc Render(ctx *context.Context) string { return ctx.Tr(\"what.an.example\"); }\n")) + }) + + t.Run("template, simple", func(t *testing.T) { + assert.EqualValues(t, + []string{"what.an.example"}, + HandleTemplateFileWrapped(t, "", "{{ ctx.Locale.Tr \"what.an.example\" }}\n")) + }) +} diff --git a/build/lint-locale/lint-locale.go b/build/lint-locale/lint-locale.go new file mode 100644 index 0000000000..94ce941e62 --- /dev/null +++ b/build/lint-locale/lint-locale.go @@ -0,0 +1,191 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +//nolint:forbidigo +package main + +import ( + "fmt" + "html" + "io/fs" + "os" + "path/filepath" + "regexp" + "slices" + "strings" + + "forgejo.org/modules/locale" + + "github.com/microcosm-cc/bluemonday" + "github.com/sergi/go-diff/diffmatchpatch" +) + +var ( + policy *bluemonday.Policy + tagRemover *strings.Replacer + safeURL = "https://TO-BE-REPLACED.COM" + + // Matches href="", href="#", href="%s", href="#%s", href="%[1]s" and href="#%[1]s". + placeHolderRegex = regexp.MustCompile(`href="#?(%s|%\[\d\]s)?"`) + + dmp = diffmatchpatch.New() +) + +func initBlueMondayPolicy() { + policy = bluemonday.NewPolicy() + + policy.RequireParseableURLs(true) + policy.AllowURLSchemes("https") + + // Only allow safe URL on href. + // Only allow target="_blank". + // Only allow rel="nopener noreferrer", rel="noopener" and rel="noreferrer". + // Only allow placeholder on id and class. + policy.AllowAttrs("href").Matching(regexp.MustCompile("^" + regexp.QuoteMeta(safeURL) + "$")).OnElements("a") + policy.AllowAttrs("target").Matching(regexp.MustCompile("^_blank$")).OnElements("a") + policy.AllowAttrs("rel").Matching(regexp.MustCompile("^(noopener|noreferrer|noopener noreferrer)$")).OnElements("a") + policy.AllowAttrs("id", "class").Matching(regexp.MustCompile(`^%s|%\[\d\]s$`)).OnElements("a") + + // Only allow positional placeholder as class. + positionalPlaceholderRe := regexp.MustCompile(`^%\[\d\]s$`) + policy.AllowAttrs("class").Matching(positionalPlaceholderRe).OnElements("strong") + policy.AllowAttrs("id").Matching(positionalPlaceholderRe).OnElements("code") + + // Allowed elements with no attributes. Must be a recognized tagname. + policy.AllowElements("strong", "br", "b", "strike", "code", "i") + + // TODO: Remove in `actions.workflow.dispatch.trigger_found`. + policy.AllowNoAttrs().OnElements("c") +} + +func initRemoveTags() { + oldnew := []string{} + for _, el := range []string{ + "email@example.com", "correu@example.com", "epasts@domens.lv", "email@exemplo.com", "eposta@ornek.com", "email@példa.hu", "email@esempio.it", + "user", "utente", "lietotÄjs", "gebruiker", "usuário", "Benutzer", "Bruker", "bruger", "użytkownik", + "server", "servidor", "kiszolgáló", "serveris", + "label", "etichetta", "etiÄ·ete", "rótulo", "Label", "utilizador", "etiket", "iezÄ«me", "etykieta", + } { + oldnew = append(oldnew, "<"+el+">", "REPLACED-TAG") + } + + tagRemover = strings.NewReplacer(oldnew...) +} + +func preprocessTranslationValue(value string) string { + // href should be a parsable URL, replace placeholder strings with a safe url. + value = placeHolderRegex.ReplaceAllString(value, `href="`+safeURL+`"`) + + // Remove tags that aren't tags but will be parsed as tags. We already know they are safe and sound. + value = tagRemover.Replace(value) + + return value +} + +func checkValue(trKey, value string) []string { + keyValue := preprocessTranslationValue(value) + + if html.UnescapeString(policy.Sanitize(keyValue)) == keyValue { + return nil + } + + // Create a nice diff of the difference. + diffs := dmp.DiffMain(keyValue, html.UnescapeString(policy.Sanitize(keyValue)), false) + diffs = dmp.DiffCleanupSemantic(diffs) + diffs = dmp.DiffCleanupEfficiency(diffs) + + return []string{trKey + ": " + dmp.DiffPrettyText(diffs)} +} + +func checkLocaleContent(localeContent []byte) []string { + errors := []string{} + + if err := locale.IterateMessagesContent(localeContent, func(trKey, trValue string) error { + errors = append(errors, checkValue(trKey, trValue)...) + return nil + }); err != nil { + panic(err) + } + + return errors +} + +func checkLocaleNextContent(localeContent []byte) []string { + errors := []string{} + + if err := locale.IterateMessagesNextContent(localeContent, func(trKey, trValue string) error { + errors = append(errors, checkValue(trKey, trValue)...) + return nil + }); err != nil { + panic(err) + } + + return errors +} + +func main() { + initBlueMondayPolicy() + initRemoveTags() + + localeDir := filepath.Join("options", "locale") + localeFiles, err := os.ReadDir(localeDir) + if err != nil { + panic(err) + } + + // Safety check that we are not reading the wrong directory. + if !slices.ContainsFunc(localeFiles, func(e fs.DirEntry) bool { return strings.HasSuffix(e.Name(), ".ini") }) { + fmt.Println("No locale files found") + os.Exit(1) + } + + exitCode := 0 + for _, localeFile := range localeFiles { + if !strings.HasSuffix(localeFile.Name(), ".ini") { + continue + } + + localeContent, err := os.ReadFile(filepath.Join(localeDir, localeFile.Name())) + if err != nil { + fmt.Println(localeFile.Name()) + panic(err) + } + + if err := checkLocaleContent(localeContent); len(err) > 0 { + fmt.Println(localeFile.Name()) + fmt.Println(strings.Join(err, "\n")) + fmt.Println() + exitCode = 1 + } + } + + // Check the locale next. + localeDir = filepath.Join("options", "locale_next") + localeFiles, err = os.ReadDir(localeDir) + if err != nil { + panic(err) + } + + // Safety check that we are not reading the wrong directory. + if !slices.ContainsFunc(localeFiles, func(e fs.DirEntry) bool { return strings.HasSuffix(e.Name(), ".json") }) { + fmt.Println("No locale_next files found") + os.Exit(1) + } + + for _, localeFile := range localeFiles { + localeContent, err := os.ReadFile(filepath.Join(localeDir, localeFile.Name())) + if err != nil { + fmt.Println(localeFile.Name()) + panic(err) + } + + if err := checkLocaleNextContent(localeContent); len(err) > 0 { + fmt.Println(localeFile.Name()) + fmt.Println(strings.Join(err, "\n")) + fmt.Println() + exitCode = 1 + } + } + + os.Exit(exitCode) +} diff --git a/build/lint-locale/lint-locale_test.go b/build/lint-locale/lint-locale_test.go new file mode 100644 index 0000000000..791f5278bc --- /dev/null +++ b/build/lint-locale/lint-locale_test.go @@ -0,0 +1,94 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT +package main + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestLocalizationPolicy(t *testing.T) { + initBlueMondayPolicy() + initRemoveTags() + + t.Run("Remove tags", func(t *testing.T) { + assert.Empty(t, checkLocaleContent([]byte(`hidden_comment_types_description = Comment types checked here will not be shown inside issue pages. Checking "Label" for example removes all " added/removed %[2]s into %[3]s`))) + assert.Empty(t, checkLocaleContent([]byte(`editor.commit_directly_to_this_branch = Commit directly to the %[1]s branch.`))) + + assert.EqualValues(t, []string{"workflow.dispatch.trigger_found: This workflow has a \x1b[31m\x1b[0mworkflow_dispatch\x1b[31m\x1b[0m event trigger."}, checkLocaleContent([]byte(`workflow.dispatch.trigger_found = This workflow has a workflow_dispatch event trigger.`))) + assert.EqualValues(t, []string{"key: %[3]s"}, checkLocaleContent([]byte(`key = %[3]s`))) + assert.EqualValues(t, []string{"key: "}, checkLocaleContent([]byte(`key = `))) + assert.EqualValues(t, []string{"key: "}, checkLocaleContent([]byte(`key = `))) + assert.EqualValues(t, []string{"key: %[1]s"}, checkLocaleContent([]byte(`key = %[1]s`))) + }) + + t.Run("General safe tags", func(t *testing.T) { + assert.Empty(t, checkLocaleContent([]byte("error404 = The page you are trying to reach either does not exist or you are not authorized to view it."))) + assert.Empty(t, checkLocaleContent([]byte("teams.specific_repositories_helper = Members will only have access to repositories explicitly added to the team. Selecting this will not automatically remove repositories already added with All repositories."))) + assert.Empty(t, checkLocaleContent([]byte("sqlite_helper = File path for the SQLite3 database.
Enter an absolute path if you run Forgejo as a service."))) + assert.Empty(t, checkLocaleContent([]byte("hi_user_x = Hi %s,"))) + + assert.EqualValues(t, []string{"error404: The page you are trying to reach either does not exist or you are not authorized to view it."}, checkLocaleContent([]byte("error404 = The page you are trying to reach either does not exist or you are not authorized to view it."))) + }) + + t.Run("
", func(t *testing.T) { + assert.Empty(t, checkLocaleContent([]byte(`admin.new_user.text = Please click here to manage this user from the admin panel.`))) + assert.Empty(t, checkLocaleContent([]byte(`access_token_desc = Selected token permissions limit authorization only to the corresponding API routes. Read the documentation for more information.`))) + assert.Empty(t, checkLocaleContent([]byte(`webauthn_desc = Security keys are hardware devices containing cryptographic keys. They can be used for two-factor authentication. Security keys must support the WebAuthn Authenticator standard.`))) + assert.Empty(t, checkLocaleContent([]byte("issues.closed_at = `closed this issue %[2]s`"))) + + assert.EqualValues(t, []string{"key: \x1b[31m\x1b[0m"}, checkLocaleContent([]byte(`key = `))) + assert.EqualValues(t, []string{"key: \x1b[31m\x1b[0m"}, checkLocaleContent([]byte(`key = `))) + assert.EqualValues(t, []string{"key: "}, checkLocaleContent([]byte(`key = `))) + assert.EqualValues(t, []string{"key: "}, checkLocaleContent([]byte(`key = `))) + assert.EqualValues(t, []string{"key: \x1b[31m\x1b[0m"}, checkLocaleContent([]byte(`key = `))) + assert.EqualValues(t, []string{"key: \x1b[31m\x1b[0m"}, checkLocaleContent([]byte(`key = `))) + assert.EqualValues(t, []string{"key: \x1b[31m\x1b[0m"}, checkLocaleContent([]byte(`key = `))) + assert.EqualValues(t, []string{"key: \x1b[31m\x1b[0m"}, checkLocaleContent([]byte(`key = `))) + }) + + t.Run("Escaped HTML characters", func(t *testing.T) { + assert.Empty(t, checkLocaleContent([]byte("activity.git_stats_push_to_branch = `إلى %s Ùˆ\"`"))) + + assert.EqualValues(t, []string{"key: Ùˆ\x1b[31m \x1b[0m\x1b[32m\u00a0\x1b[0m"}, checkLocaleContent([]byte(`key = Ùˆ `))) + }) +} + +func TestNextLocalizationPolicy(t *testing.T) { + initBlueMondayPolicy() + initRemoveTags() + + t.Run("Nested locales", func(t *testing.T) { + assert.Empty(t, checkLocaleNextContent([]byte(`{ + "settings": { + "hidden_comment_types_description": "Comment types checked here will not be shown inside issue pages. Checking \"Label\" for example removes all \" added/removed

We share your User Personal Information, if you consent, after letting you know what information will be shared, with whom, and why. For example, if you allow third party applications to access your Account using OAuth2 providers, we share all information associated with your Account, including private repos and organizations. You may also direct us through your action on Your Gitea Instance to share your User Personal Information, such as when joining an Organization.

+

We share your User Personal Information, if you consent, after letting you know what information will be shared, with whom, and why. For example, if you allow third party applications to access your Account using OAuth2 providers, we share all information associated with your Account, including private repos and organizations. You may also direct us through your action on Your Forgejo Instance to share your User Personal Information, such as when joining an Organization.

With Service Providers

-

We share User Personal Information with a limited number of service providers who process it on our behalf to provide or improve our Service, and who have agreed to privacy restrictions similar to the ones in our Privacy Statement by signing data protection agreements or making similar commitments. Our service providers perform payment processing, customer support ticketing, network data transmission, security, and other similar services. While Your Gitea Instance processes all User Personal Information in the (country/state where Gitea is deployed), our service providers may process data outside of (country/state where Gitea is deployed), the United States or the European Union.

+

We share User Personal Information with a limited number of service providers who process it on our behalf to provide or improve our Service, and who have agreed to privacy restrictions similar to the ones in our Privacy Statement by signing data protection agreements or making similar commitments. Our service providers perform payment processing, customer support ticketing, network data transmission, security, and other similar services. While Your Forgejo Instance processes all User Personal Information in the (country/state where Forgejo is deployed), our service providers may process data outside of (country/state where Forgejo is deployed), the United States or the European Union.

For Security Purposes

-

If you are a member of an Organization, Your Gitea Instance may share your username, Usage Information, and Device Information associated with that Organization with an owner and/or administrator of the Organization who has agreed to the Corporate Terms of Service or applicable customer agreements, to the extent that such information is provided only to investigate or respond to a security incident that affects or compromises the security of that particular Organization.

+

If you are a member of an Organization, Your Forgejo Instance may share your username, Usage Information, and Device Information associated with that Organization with an owner and/or administrator of the Organization who has agreed to the Corporate Terms of Service or applicable customer agreements, to the extent that such information is provided only to investigate or respond to a security incident that affects or compromises the security of that particular Organization.

For Legal Disclosure

-

Your Gitea Instance strives for transparency in complying with legal process and legal obligations. Unless prevented from doing so by law or court order, or in rare, exigent circumstances, we make a reasonable effort to notify users of any legally compelled or required disclosure of their information. Your Gitea Instance may disclose User Personal Information or other information we collect about you to law enforcement if required in response to a valid subpoena, court order, search warrant, a similar government order, or when we believe in good faith that disclosure is necessary to comply with our legal obligations, to protect our property or rights, or those of third parties or the public at large.

+

Your Forgejo Instance strives for transparency in complying with legal process and legal obligations. Unless prevented from doing so by law or court order, or in rare, exigent circumstances, we make a reasonable effort to notify users of any legally compelled or required disclosure of their information. Your Forgejo Instance may disclose User Personal Information or other information we collect about you to law enforcement if required in response to a valid subpoena, court order, search warrant, a similar government order, or when we believe in good faith that disclosure is necessary to comply with our legal obligations, to protect our property or rights, or those of third parties or the public at large.

Change in Control or Sale

@@ -57,7 +57,7 @@

Aggregate, Non-Personally Identifying Information

-

We share certain aggregated, non-personally identifying information with others about how our users, collectively, use Your Gitea Instance, or how our users respond to our other offerings, such as our conferences or events. For example, we may compile statistics on the open source activity across Your Gitea Instance.

+

We share certain aggregated, non-personally identifying information with others about how our users, collectively, use Your Forgejo Instance, or how our users respond to our other offerings, such as our conferences or events. For example, we may compile statistics on the open source activity across Your Forgejo Instance.

We don't sell your User Personal Information for monetary or other consideration.

@@ -67,34 +67,34 @@
  1. We use your Registration Information to create your account, and to provide you the Service.
  2. -
  3. We use your User Personal Information, specifically your username, to identify you on Your Gitea Instance.
  4. +
  5. We use your User Personal Information, specifically your username, to identify you on Your Forgejo Instance.
  6. We use your Profile Information to fill out your Account profile and to share that profile with other users if you ask us to.
  7. We use your email address to communicate with you, if you've said that's okay, and only for the reasons you’ve said that’s okay.
  8. -
  9. We use User Personal Information and other data to make recommendations for you, such as to suggest projects you may want to follow or contribute to. We learn from your public behavior on Your Gitea Instance—such as the projects you star—to determine your coding interests, and we recommend similar projects. These recommendations are automated decisions, but they have no legal impact on your rights.
  10. -
  11. We use Usage Information and Device Information to better understand how our Users use Your Gitea Instance and to improve our Website and Service.
  12. -
  13. We may use your User Personal Information if it is necessary for security purposes or to investigate possible fraud or attempts to harm Your Gitea Instance or our Users.
  14. +
  15. We use User Personal Information and other data to make recommendations for you, such as to suggest projects you may want to follow or contribute to. We learn from your public behavior on Your Forgejo Instance—such as the projects you star—to determine your coding interests, and we recommend similar projects. These recommendations are automated decisions, but they have no legal impact on your rights.
  16. +
  17. We use Usage Information and Device Information to better understand how our Users use Your Forgejo Instance and to improve our Website and Service.
  18. +
  19. We may use your User Personal Information if it is necessary for security purposes or to investigate possible fraud or attempts to harm Your Forgejo Instance or our Users.
  20. We may use your User Personal Information to comply with our legal obligations, protect our intellectual property, and enforce our Terms of Service.
  21. We limit our use of your User Personal Information to the purposes listed in this Privacy Statement. If we need to use your User Personal Information for other purposes, we will ask your permission first. You can always see what information we have, how we're using it, and what permissions you have given us in your user profile.
-

How Your Gitea Instance Secures Your Information?

+

How Your Forgejo Instance Secures Your Information?

-

Your Gitea Instance takes all measures reasonably necessary to protect User Personal Information from unauthorized access, alteration, or destruction; maintain data accuracy; and help ensure the appropriate use of User Personal Information.

+

Your Forgejo Instance takes all measures reasonably necessary to protect User Personal Information from unauthorized access, alteration, or destruction; maintain data accuracy; and help ensure the appropriate use of User Personal Information.

To the extent above, we enforce a written security information program, which:

  • aligns with industry recognized frameworks;
  • includes security safeguards reasonably designed to protect the confidentiality, integrity, availability, and resilience of our Users' data;
  • -
  • is appropriate to the nature, size, and complexity of Your Gitea Instance’s business operations;
  • +
  • is appropriate to the nature, size, and complexity of Your Forgejo Instance’s business operations;
  • includes incident response and data breach notification processes; and
  • -
  • complies with applicable information security-related laws and regulations in the geographic regions where Your Gitea Instance does business.
  • +
  • complies with applicable information security-related laws and regulations in the geographic regions where Your Forgejo Instance does business.

In the event of a data breach that affects your User Personal Information, we will act promptly to mitigate the impact of a breach and notify any affected Users without undue delay.

-

Transmission of data on Your Gitea Instance is encrypted using SSH, HTTPS (TLS), and git repository content is encrypted at rest. We host Your Gitea Instance at our hosting partner, which they provide data centers with high level of physical and network security.

+

Transmission of data on Your Forgejo Instance is encrypted using SSH, HTTPS (TLS), and git repository content is encrypted at rest. We host Your Forgejo Instance at our hosting partner, which they provide data centers with high level of physical and network security.

Disclaimer: No method of transmission, or method of electronic storage, is 100% secure, therefore, we cannot guarantee absolute security.

@@ -102,13 +102,13 @@

Cookies

-

We uses cookies to make interactions with our service easy and meaningful. Cookies are small text files that websites often store on computer hard drives or mobile devices of visitors. We use cookies (and similar technologies, like HTML5 localStorage) to keep you logged in, remember your preferences, and provide information for future development of Your Gitea Instance. For security purposes, we use cookies to identify a device. By using our Website, you agree that we can place these types of cookies on your computer or device. If you disable your browser or device’s ability to accept these cookies, you will not be able to log in or use our services.

+

We uses cookies to make interactions with our service easy and meaningful. Cookies are small text files that websites often store on computer hard drives or mobile devices of visitors. We use cookies (and similar technologies, like HTML5 localStorage) to keep you logged in, remember your preferences, and provide information for future development of Your Forgejo Instance. For security purposes, we use cookies to identify a device. By using our Website, you agree that we can place these types of cookies on your computer or device. If you disable your browser or device’s ability to accept these cookies, you will not be able to log in or use our services.

Tracking and Analytics

-

Out of the box, Gitea doesn't use third-party analytics. In case when we opt in to their usage, we do that to help us evaluate our Users' use of Your Gitea Instance, compile statistical reports on activity, and improve our content and Website performance. We only use these third-party analytics providers on certain areas of our Website, and all of them have signed data protection agreements with us that limit the type of User Personal Information they can collect and the purpose for which they can process the information. In addition, we may also deploy internal analytics software to provide similar functionality.

+

Out of the box, Forgejo doesn't use third-party analytics. In case when we opt in to their usage, we do that to help us evaluate our Users' use of Your Forgejo Instance, compile statistical reports on activity, and improve our content and Website performance. We only use these third-party analytics providers on certain areas of our Website, and all of them have signed data protection agreements with us that limit the type of User Personal Information they can collect and the purpose for which they can process the information. In addition, we may also deploy internal analytics software to provide similar functionality.

-

Some browsers have incorporated "Do Not Track" (DNT) features that can send a signal to the websites you visit indicating you do not wish to be tracked. Your Gitea Instance responds to browser DNT signals and follows the W3C standard for responding to DNT signals. If you have not enabled DNT on a browser that supports it, cookies on some parts of our Website will track your online browsing activity on other online services over time, though we do not permit third parties other than our analytics and service providers to track Your Gitea Instance Users' activity over time on Your Gitea Instance.

+

Some browsers have incorporated "Do Not Track" (DNT) features that can send a signal to the websites you visit indicating you do not wish to be tracked. Your Forgejo Instance responds to browser DNT signals and follows the W3C standard for responding to DNT signals. If you have not enabled DNT on a browser that supports it, cookies on some parts of our Website will track your online browsing activity on other online services over time, though we do not permit third parties other than our analytics and service providers to track Your Forgejo Instance Users' activity over time on Your Forgejo Instance.

Repository Contents

@@ -118,19 +118,19 @@

Public Information

-

Many of our services and feature are public-facing. If your content is public-facing, third parties may access and use it in compliance with our Terms of Service, such as by viewing your profile or repositories or pulling data via our API. We do not sell that content; it is yours. However, we do allow third parties, such as research organizations or archives, to compile public-facing Your Gitea Instance information. Other third parties, such as data brokers, have been known to scrape Your Gitea Instance and compile data as well.

+

Many of our services and feature are public-facing. If your content is public-facing, third parties may access and use it in compliance with our Terms of Service, such as by viewing your profile or repositories or pulling data via our API. We do not sell that content; it is yours. However, we do allow third parties, such as research organizations or archives, to compile public-facing Your Forgejo Instance information. Other third parties, such as data brokers, have been known to scrape Your Forgejo Instance and compile data as well.

-

Your User Personal Information associated with your content could be gathered by third parties in these compilations of Your Gitea Instance data. If you do not want your User Personal Information to appear in third parties’ compilations of Your Gitea Instance data, please do not make your User Personal Information publicly available and be sure to configure your email address to be private in your user profile and in your git commit settings.

+

Your User Personal Information associated with your content could be gathered by third parties in these compilations of Your Forgejo Instance data. If you do not want your User Personal Information to appear in third parties’ compilations of Your Forgejo Instance data, please do not make your User Personal Information publicly available and be sure to configure your email address to be private in your user profile and in your git commit settings.

-

If you would like to compile Your Gitea Instance data, you must comply with our Terms of Service regarding scraping and privacy, and you may only use any public-facing User Personal Information you gather for the purpose for which our user authorized it. For example, where a Your Gitea Instance user has made an email address public-facing for the purpose of identification and attribution, do not use that email address for commercial advertising. We expect you to reasonably secure any User Personal Information you have gathered from Your Gitea Instance, and to respond promptly to complaints, removal requests, and "do not contact" requests from Your Gitea Instance or Your Gitea Instance users.

+

If you would like to compile Your Forgejo Instance data, you must comply with our Terms of Service regarding scraping and privacy, and you may only use any public-facing User Personal Information you gather for the purpose for which our user authorized it. For example, where a Your Forgejo Instance user has made an email address public-facing for the purpose of identification and attribution, do not use that email address for commercial advertising. We expect you to reasonably secure any User Personal Information you have gathered from Your Forgejo Instance, and to respond promptly to complaints, removal requests, and "do not contact" requests from Your Forgejo Instance or Your Forgejo Instance users.

-

In similar fashion, projects on Your Gitea Instance may include publicly available User Personal Information collected as part of the collaborative events.

+

In similar fashion, projects on Your Forgejo Instance may include publicly available User Personal Information collected as part of the collaborative events.

Organizations

If you collaborate on or become a member of an Organization, then its Account owners may receive your User Personal Information. When you accept an invitation to an Organization, you will be notified of the types of information owners may be able to see. If you accept an invitation to an Organization with a verified domain, then the owners of that Organization will be able to see your full email address(es) within that Organization's verified domain(s).

-

Please note, Your Gitea Instance may share your username, Usage Information, and Device Information with the owner of the Organization you are a member of, to the extent that your User Personal Information is provided only to investigate or respond to a security incident that affects or compromises the security of that particular Organization.

+

Please note, Your Forgejo Instance may share your username, Usage Information, and Device Information with the owner of the Organization you are a member of, to the extent that your User Personal Information is provided only to investigate or respond to a security incident that affects or compromises the security of that particular Organization.

If you collaborate with or become a member of an Account that has agreed to a Data Protection Addendum (DPA) to this Privacy Policy, then that DPA governs in the event of conflicts between this Privacy Policy and DPA with respect to your activity in the Account.

@@ -138,17 +138,17 @@

How You Can Access and Control the Information We Collect?

-

If you're already a Your Gitea Instance user, you may access, update, alter, or delete your basic user information by editing your user profile. You can control the information we collect about you by limiting what information is in your profile, or by keeping your information current.

+

If you're already a Your Forgejo Instance user, you may access, update, alter, or delete your basic user information by editing your user profile. You can control the information we collect about you by limiting what information is in your profile, or by keeping your information current.

-

If Your Gitea Instance processes information about you, such as information receives from third parties, and you do not have an account, then you may, subject to applicable law, access, update, alter, delete, or object to the processing of your personal information by contacting our support.

+

If Your Forgejo Instance processes information about you, such as information receives from third parties, and you do not have an account, then you may, subject to applicable law, access, update, alter, delete, or object to the processing of your personal information by contacting our support.

Data Portability

-

As a Your Gitea Instance User, you can always take your data with you. You can clone your repositories to your computer, or you can perform migrations using the provided interfaces, for example.

+

As a Your Forgejo Instance User, you can always take your data with you. You can clone your repositories to your computer, or you can perform migrations using the provided interfaces, for example.

Data Retention and Deletion of Data

-

In general, Your Gitea Instance retains User Personal Information for as long as your account is active, or as needed to provide you service.

+

In general, Your Forgejo Instance retains User Personal Information for as long as your account is active, or as needed to provide you service.

If you would like to cancel your account or delete your User Personal Information, you may do so in your user profile. We retain and use your information as necessary to comply with our legal obligations, resolve disputes, and enforce our agreements, but barring legal requirements, we will delete your full profile (within reason) within 90 days of your request. Feel free to contact our support to request erasure of the data we process on the basis of consent within 30 days.

@@ -158,14 +158,14 @@

Our Global Privacy Practices

-

We store and process the information that we collect in the (country/state where Gitea is deployed) in accordance with this Privacy Statement though our service providers may store and process data outside the (country/state where Gitea is deployed). However, we understand that we have Users from different countries and regions with different privacy expectations, and we try to meet those needs even when the (country/state where Gitea is deployed) does not have the same privacy framework as other countries.

+

We store and process the information that we collect in the (country/state where Forgejo is deployed) in accordance with this Privacy Statement though our service providers may store and process data outside the (country/state where Forgejo is deployed). However, we understand that we have Users from different countries and regions with different privacy expectations, and we try to meet those needs even when the (country/state where Forgejo is deployed) does not have the same privacy framework as other countries.

We provide a high standard of privacy protection—as described in this Privacy Statement—to all our users around the world, regardless of their country of origin or location, and we are proud of the levels of notice, choice, accountability, security, data integrity, access, and recourse we provide. We work hard to comply with the applicable data privacy laws wherever we do business, working with our Data Protection Officer as part of a cross-functional team that oversees our privacy compliance efforts. Additionally, if our vendors or affiliates have access to User Personal Information, they must sign agreements that require them to comply with our privacy policies and with applicable data privacy laws.

In particular:

    -
  • Your Gitea Instance provides clear methods of unambiguous, informed, specific, and freely given consent at the time of data collection, when we collect your User Personal Information using consent as a basis.
  • +
  • Your Forgejo Instance provides clear methods of unambiguous, informed, specific, and freely given consent at the time of data collection, when we collect your User Personal Information using consent as a basis.
  • We collect only the minimum amount of User Personal Information necessary for our purposes, unless you choose to provide more. We encourage you to only give us the amount of data you are comfortable sharing.
  • We offer you simple methods of accessing, altering, or deleting the User Personal Information we have collected, where legally permitted.
  • We provide our Users notice, choice, accountability, security, and access regarding their User Personal Information, and we limit the purpose for processing it. We also provide our Users a method of recourse and enforcement. These are the Privacy Shield Principles, but they are also just good practices.
  • @@ -173,21 +173,21 @@

    How We Communicate with You?

    -

    We use your email address to communicate with you, if you've said that's okay, and only for the reasons you’ve said that’s okay. For example, if you contact our support with a request, we respond to you via email. You have a lot of control over how your email address is used and shared on and through Your Gitea instance. You may manage your communication preferences in your user profile.

    +

    We use your email address to communicate with you, if you've said that's okay, and only for the reasons you’ve said that’s okay. For example, if you contact our support with a request, we respond to you via email. You have a lot of control over how your email address is used and shared on and through Your Forgejo instance. You may manage your communication preferences in your user profile.

    By design, the Git version control system associates many actions with a User's email address, such as commit messages. We are not able to change many aspects of the Git system. If you would like your email address to remain private, even when you’re commenting on public repositories, you can create a private email address in your user profile. You should also update your local Git configuration to use your private email address. This will not change how we contact you, but it will affect how others see you.

    -

    Depending on your email settings, Your Gitea instance may occasionally send notification emails about changes in a repository you’re watching, new features, requests for feedback, important policy changes, or to offer customer support. We also send marketing emails, based on your choices and in accordance with applicable laws and regulations. There's an “unsubscribe†link located at the bottom of each of the marketing emails we send you. Note that you can opt out of any communications with us, except the important ones (like from our support and system emails).

    +

    Depending on your email settings, Your Forgejo instance may occasionally send notification emails about changes in a repository you’re watching, new features, requests for feedback, important policy changes, or to offer customer support. We also send marketing emails, based on your choices and in accordance with applicable laws and regulations. There's an “unsubscribe†link located at the bottom of each of the marketing emails we send you. Note that you can opt out of any communications with us, except the important ones (like from our support and system emails).

    Our emails may contain a pixel tag, which is a small, clear image that can tell us whether or not you have opened an email and what your IP address is. We use this pixel tag to make our email more effective for you and to make sure we’re not sending you unwanted email.

    Changes to this Privacy Policy

    -

    Although most changes are likely to be minor, Your Gitea Instance may change our Privacy Statement from time to time. We will provide notification to Users of material changes to this Privacy Statement through our Website at least 30 days prior to the change taking effect by posting a notice on our home page or sending email to the primary email address specified in your account.

    +

    Although most changes are likely to be minor, Your Forgejo Instance may change our Privacy Statement from time to time. We will provide notification to Users of material changes to this Privacy Statement through our Website at least 30 days prior to the change taking effect by posting a notice on our home page or sending email to the primary email address specified in your account.

    Contact

    -

    If you have any concerns about privacy, please contact us at privacy@your-gitea-instance. We will respond promptly, within 45 days.

    +

    If you have any concerns about privacy, please contact us at privacy@your-forgejo-instance. We will respond promptly, within 45 days.

    COPYING

    diff --git a/contrib/legal/tos.html.sample b/contrib/legal/tos.html.sample index d39082909f..73ee0899ef 100644 --- a/contrib/legal/tos.html.sample +++ b/contrib/legal/tos.html.sample @@ -7,26 +7,26 @@

    Terms of Service

    -

    Last updated: January 29, 2020

    +

    Last updated: December 19, 2024

    -

    Thank you for choosing Your Gitea Instance! Before you use it, please read this Terms of Service agreement carefully, which contains important contract between us and our users.

    +

    Thank you for choosing Your Forgejo Instance! Before you use it, please read this Terms of Service agreement carefully, which contains important contract between us and our users.

    Definitions

      -
    1. An "Account" represents your legal relationship with Your Gitea Instance. A “User Account†represents an individual User’s authorization to log in to and use the Service and serves as a User’s identity on Your Gitea Instance. “Organizations†are shared workspaces that may be associated with a single entity or with one or more Users where multiple Users can collaborate across many projects at once. A User Account can be a member of any number of Organizations.
    2. +
    3. An "Account" represents your legal relationship with Your Forgejo Instance. A “User Account†represents an individual User’s authorization to log in to and use the Service and serves as a User’s identity on Your Forgejo Instance. “Organizations†are shared workspaces that may be associated with a single entity or with one or more Users where multiple Users can collaborate across many projects at once. A User Account can be a member of any number of Organizations.
    4. The "Agreement" collectively refers to all terms, conditions, and notices referenced or contained in this document and other operating rules, policies (including Privacy Policy) and procedures that we may publish from time to time on this Website.
    5. “Content†refers to content featured or displayed through the Website, including without limitation code, text, data, articles, images, photographs, graphics, software, applications, packages, designs, features, and other materials that are available on the Website or otherwise available through the Service. "Content" also includes Services. “User-Generated Content†is Content, written or otherwise, created or uploaded by our Users. "Your Content" is Content that you create or own.
    6. -
    7. "Your Gitea Instance", "We", and "Us" refers to Your Gitea Instance, as well as our affiliates, directors, subsidiaries, contractors, licensors, officers, agents, and employees.
    8. +
    9. "Your Forgejo Instance", "We", and "Us" refers to Your Forgejo Instance, as well as our affiliates, directors, subsidiaries, contractors, licensors, officers, agents, and employees.
    10. -
    11. The "Service" refers to applications/software, products, and services provided by Your Gitea Instance.
    12. +
    13. The "Service" refers to applications/software, products, and services provided by Your Forgejo Instance.
    14. The "User", "You", and "Your" refers to individual person or institution (organizations or company) that has visited or using the Service; that have access or use any part of the Account; or that directs to use the Account to perform its function. Please note that additional terms may apply for Accounts related to business or government.
    15. -
    16. The "Website" refers to Your Gitea Instance's website at your-gitea-instance, including its subdomains and other websites owned by Your Gitea Instance.
    17. +
    18. The "Website" refers to Your Forgejo Instance's website at your-forgejo-instance, including its subdomains and other websites owned by Your Forgejo Instance.

    Account Terms

    @@ -48,7 +48,7 @@
    • You must be a human to create an Account. Accounts registered by "bots" or other automated methods are not permitted. We do permit machine accounts:
    • A machine account is an Account set up by an individual human who accepts the Terms on behalf of the Account, provides a valid email address, and is responsible for its actions. A machine account is used exclusively for performing automated tasks. Multiple users may direct the actions of a machine account, but the owner of the Account is ultimately responsible for the machine's actions.
    • -
    • You must be age 13 or older. If we learn of any User under that age, we will immediately terminate that User's Account. Different countries may have different minimum age; in such cases you are responsible for complying with your country's regulation. By using Your Gitea Instance, you agree to comply with COPPA and/or similar law in your country.
    • +
    • You must be age 13 or older. If we learn of any User under that age, we will immediately terminate that User's Account. Different countries may have different minimum age; in such cases you are responsible for complying with your country's regulation. By using Your Forgejo Instance, you agree to comply with COPPA and/or similar law in your country.

    User Account Security

    @@ -57,7 +57,7 @@

    Additional Terms

    -

    In some situations, third parties' terms may apply to your use of Your Gitea Instance. For example, you may be a member of an organization on Your Gitea Instance with its own terms or license agreements; you may download an application that integrates with Your Gitea Instance; or you may use Your Gitea Instance to authenticate to another service. Please be aware that while these Terms are our full agreement with you, other parties' terms govern their relationships with you.

    +

    In some situations, third parties' terms may apply to your use of Your Forgejo Instance. For example, you may be a member of an organization on Your Forgejo Instance with its own terms or license agreements; you may download an application that integrates with Your Forgejo Instance; or you may use Your Forgejo Instance to authenticate to another service. Please be aware that while these Terms are our full agreement with you, other parties' terms govern their relationships with you.

    Acceptable Use

    @@ -73,19 +73,19 @@
  • You retain ownership of and responsibility for Your Content. If you're posting anything you did not create yourself or do not own the rights to, you agree that you are responsible for any Content you post; that you will only submit Content that you have the right to post; and that you will fully comply with any third party licenses relating to Content you post.

    -

    Because of above, we need you to grant us -- and other Your Gitea Instance users -- certain legal permissions, listed below in this section. If you upload Content that already comes with a license granting Your Gitea Instance the permissions we need to run our Service, no additional license is required. You understand that you will not receive any payment for any of the rights granted below. The licenses you grant to us will end when you remove Your Content from our servers, unless other Users have forked it.

    +

    Because of above, we need you to grant us -- and other Your Forgejo Instance users -- certain legal permissions, listed below in this section. If you upload Content that already comes with a license granting Your Forgejo Instance the permissions we need to run our Service, no additional license is required. You understand that you will not receive any payment for any of the rights granted below. The licenses you grant to us will end when you remove Your Content from our servers, unless other Users have forked it.

  • We need the legal right to do things like host Your Content, publish it, and share it. You grant us and our legal successors the right to store, parse, and display Your Content, and make incidental copies as necessary to render the Website and provide the Service. This includes the right to do things like copy it to our database and make backups; show it to you and other users; parse it into a search index or otherwise analyze it on our servers; share it with other users; and perform it, in case Your Content is something like music or video.

    -

    This license, however, doesn't grant Your Gitea Instance the right to sell Your Content or otherwise distribute or use it outside of our provision of the Service.

    +

    This license, however, doesn't grant Your Forgejo Instance the right to sell Your Content or otherwise distribute or use it outside of our provision of the Service.

  • Any User-Generated Content you post publicly, including issues, comments, and contributions to other Users' repositories, may be viewed by others. By setting your repositories to be viewed publicly, you agree to allow others to view and "fork" your repositories (this means that others may make their own copies of Content from your repositories in repositories they control).

    -

    If you set your pages and repositories to be viewed publicly, you grant each User of Your Gitea Instance a nonexclusive, worldwide license to use, display, and perform Your Content through the Your Gitea Instance Service and to reproduce Your Content solely on Your Gitea Instance as permitted through Your Gitea Instance's functionality (for example, through forking). You may grant further rights if you adopt a license. If you are uploading Content you did not create or own, you are responsible for ensuring that the Content you upload is licensed under terms that grant these permissions to other Your Gitea Instance Users.

    +

    If you set your pages and repositories to be viewed publicly, you grant each User of Your Forgejo Instance a nonexclusive, worldwide license to use, display, and perform Your Content through the Your Forgejo Instance Service and to reproduce Your Content solely on Your Forgejo Instance as permitted through Your Forgejo Instance's functionality (for example, through forking). You may grant further rights if you adopt a license. If you are uploading Content you did not create or own, you are responsible for ensuring that the Content you upload is licensed under terms that grant these permissions to other Your Forgejo Instance Users.

  • @@ -97,7 +97,7 @@
  • You retain all moral rights to Your Content that you upload, publish, or submit to any part of the Service, including the rights of integrity and attribution. However, you waive these rights and agree not to assert them against us, to enable us to reasonably exercise the rights granted above, but not otherwise.

    -

    To the extent this agreement is not enforceable by applicable law, you grant Your Gitea Instance the rights we need to use Your Content without attribution and to make reasonable adaptations of Your Content as necessary to render the Website and provide the Service.

    +

    To the extent this agreement is not enforceable by applicable law, you grant Your Forgejo Instance the rights we need to use Your Content without attribution and to make reasonable adaptations of Your Content as necessary to render the Website and provide the Service.

  • @@ -106,27 +106,27 @@
    1. Some Accounts may have private repositories, which allow the User to control access to Content.
    2. -
    3. Your Gitea Instance considers the contents of private repositories to be confidential to you. Your Gitea Instance will protect the contents of private repositories from unauthorized use, access, or disclosure in the same manner that we would use to protect our own confidential information of a similar nature and in no event with less than a reasonable degree of care.
    4. +
    5. Your Forgejo Instance considers the contents of private repositories to be confidential to you. Your Forgejo Instance will protect the contents of private repositories from unauthorized use, access, or disclosure in the same manner that we would use to protect our own confidential information of a similar nature and in no event with less than a reasonable degree of care.
    6. -

      Your Gitea Instance employees may only access the content of your private repositories in the following situations:

      +

      Your Forgejo Instance employees may only access the content of your private repositories in the following situations:

        -
      • With your consent and knowledge, for support reasons. If Your Gitea Instance accesses a private repository for support reasons, we will only do so with the owner’s consent and knowledge.
      • -
      • When access is required for security reasons, including when access is required to maintain ongoing confidentiality, integrity, availability and resilience of Your Gitea Instance's systems and Service.
      • +
      • With your consent and knowledge, for support reasons. If Your Forgejo Instance accesses a private repository for support reasons, we will only do so with the owner’s consent and knowledge.
      • +
      • When access is required for security reasons, including when access is required to maintain ongoing confidentiality, integrity, availability and resilience of Your Forgejo Instance's systems and Service.
    7. -
    8. You may choose to enable additional access to your private repositories. For example: You may enable various Your Gitea Instance services or features that require additional rights to Your Content in private repositories. These rights may vary depending on the service or feature, but Your Gitea Instance will continue to treat your private repository Content as confidential. If those services or features require rights in addition to those we need to provide the Your Gitea Instance Service, we will provide an explanation of those rights.
    9. +
    10. You may choose to enable additional access to your private repositories. For example: You may enable various Your Forgejo Instance services or features that require additional rights to Your Content in private repositories. These rights may vary depending on the service or feature, but Your Forgejo Instance will continue to treat your private repository Content as confidential. If those services or features require rights in addition to those we need to provide the Your Forgejo Instance Service, we will provide an explanation of those rights.

    Copyright Infringement and DMCA Policy

    -

    If you are copyright owner and believe that content on our website violates your copyright, please contact us at copyright@your-gitea-instance. Please note that before sending a takedown notice, consider legal uses (such as fair use and licensed use); and legal consequences for sending false notices.

    +

    If you are copyright owner and believe that content on our website violates your copyright, please contact us at copyright@your-forgejo-instance. Please note that before sending a takedown notice, consider legal uses (such as fair use and licensed use); and legal consequences for sending false notices.

    Intellectual Properties and COPYING

    -

    Your Gitea Instance and our licensors, vendors, agents, and/or our content providers retain ownership of all intellectual property rights of any kind related to the Website and Service. We reserve all rights that are not expressly granted to you under this Agreement or by law. The look and feel of the Website and Service is copyright © Your Gitea Instance. All rights reserved.

    +

    Your Forgejo Instance and our licensors, vendors, agents, and/or our content providers retain ownership of all intellectual property rights of any kind related to the Website and Service. We reserve all rights that are not expressly granted to you under this Agreement or by law. The look and feel of the Website and Service is copyright © Your Forgejo Instance. All rights reserved.

    If you'd like to use our trademarks, you must follow all of our trademark guidelines.

    @@ -134,13 +134,13 @@

    API Terms

    -

    Abuse or excessively frequent requests to Your Gitea Instance via the API may result in the temporary or permanent suspension of your Account's access to the API. Your Gitea Instance, in our sole discretion, will determine abuse or excessive usage of the API. We will make a reasonable attempt to warn you via email prior to suspension.

    +

    Abuse or excessively frequent requests to Your Forgejo Instance via the API may result in the temporary or permanent suspension of your Account's access to the API. Your Forgejo Instance, in our sole discretion, will determine abuse or excessive usage of the API. We will make a reasonable attempt to warn you via email prior to suspension.

    -

    You may not share API tokens to exceed Your Gitea Instance's rate limitations.

    +

    You may not share API tokens to exceed Your Forgejo Instance's rate limitations.

    -

    You may not use the API to download data or Content from Your Gitea Instance for spamming purposes, including for the purposes of selling Your Gitea Instance users' personal information, such as to recruiters, headhunters, and job boards.

    +

    You may not use the API to download data or Content from Your Forgejo Instance for spamming purposes, including for the purposes of selling Your Forgejo Instance users' personal information, such as to recruiters, headhunters, and job boards.

    -

    All use of the Your Gitea Instance API is subject to these Terms of Service and the Your Gitea Instance Privacy Statement.

    +

    All use of the Your Forgejo Instance API is subject to these Terms of Service and the Your Forgejo Instance Privacy Statement.

    However, we may provide subscription-based access to our API for Users who need high-throughput access or reselling our Service.

    @@ -149,7 +149,7 @@

    Account Cancellation

    -

    It is your responsibility to properly cancel your Account with Your Gitea Instance. You can cancel your Account at any time by going into your Settings in the global navigation bar at the top of the screen. The Account screen provides a simple, no questions asked cancellation link. We are not able to cancel Accounts in response to an email or phone request.

    +

    It is your responsibility to properly cancel your Account with Your Forgejo Instance. You can cancel your Account at any time by going into your Settings in the global navigation bar at the top of the screen. The Account screen provides a simple, no questions asked cancellation link. We are not able to cancel Accounts in response to an email or phone request.

    Upon Cancellation

    @@ -161,7 +161,7 @@

    We May Terminate

    -

    Your Gitea Instance has the right to suspend or terminate your access to all or any part of the Website at any time, with or without cause, with or without notice, effective immediately. Your Gitea Instance reserves the right to refuse service to anyone for any reason at any time.

    +

    Your Forgejo Instance has the right to suspend or terminate your access to all or any part of the Website at any time, with or without cause, with or without notice, effective immediately. Your Forgejo Instance reserves the right to refuse service to anyone for any reason at any time.

    Survival

    @@ -175,7 +175,7 @@

    Legal Notices to Us Must Be in Writing

    -

    Communications made through email or Your Gitea Instance Support's messaging system will not constitute legal notice to Your Gitea Instance or any of its officers, employees, agents or representatives in any situation where notice to Your Gitea Instance is required by contract or any law or regulation. Legal notice to Your Gitea Instance must be in writing and served on Your Gitea Instance's legal agent.

    +

    Communications made through email or Your Forgejo Instance Support's messaging system will not constitute legal notice to Your Forgejo Instance or any of its officers, employees, agents or representatives in any situation where notice to Your Forgejo Instance is required by contract or any law or regulation. Legal notice to Your Forgejo Instance must be in writing and served on Your Forgejo Instance's legal agent.

    No Phone Support

    @@ -183,9 +183,9 @@

    Disclaimer of Warranties

    -

    Your Gitea Instance provides the Website and the Service “as is†and “as available,†without warranty of any kind. Without limiting this, we expressly disclaim all warranties, whether express, implied or statutory, regarding the Website and the Service including without limitation any warranty of merchantability, fitness for a particular purpose, title, security, accuracy and non-infringement.

    +

    Your Forgejo Instance provides the Website and the Service “as is†and “as available,†without warranty of any kind. Without limiting this, we expressly disclaim all warranties, whether express, implied or statutory, regarding the Website and the Service including without limitation any warranty of merchantability, fitness for a particular purpose, title, security, accuracy and non-infringement.

    -

    Your Gitea Instance does not warrant that the Service will meet your requirements; that the Service will be uninterrupted, timely, secure, or error-free; that the information provided through the Service is accurate, reliable or correct; that any defects or errors will be corrected; that the Service will be available at any particular time or location; or that the Service is free of viruses or other harmful components. You assume full responsibility and risk of loss resulting from your downloading and/or use of files, information, content or other material obtained from the Service.

    +

    Your Forgejo Instance does not warrant that the Service will meet your requirements; that the Service will be uninterrupted, timely, secure, or error-free; that the information provided through the Service is accurate, reliable or correct; that any defects or errors will be corrected; that the Service will be available at any particular time or location; or that the Service is free of viruses or other harmful components. You assume full responsibility and risk of loss resulting from your downloading and/or use of files, information, content or other material obtained from the Service.

    Limitation of Liability

    @@ -212,9 +212,9 @@

    Release and Indemnification

    -

    If you have a dispute with one or more Users, you agree to release Your Gitea Instance from any and all claims, demands and damages (actual and consequential) of every kind and nature, known and unknown, arising out of or in any way connected with such disputes.

    +

    If you have a dispute with one or more Users, you agree to release Your Forgejo Instance from any and all claims, demands and damages (actual and consequential) of every kind and nature, known and unknown, arising out of or in any way connected with such disputes.

    -

    You agree to indemnify us, defend us, and hold us harmless from and against any and all claims, liabilities, and expenses, including attorneys’ fees, arising out of your use of the Website and the Service, including but not limited to your violation of this Agreement, provided that Your Gitea Instance (1) promptly gives you written notice of the claim, demand, suit or proceeding; (2) gives you sole control of the defense and settlement of the claim, demand, suit or proceeding (provided that you may not settle any claim, demand, suit or proceeding unless the settlement unconditionally releases Your Gitea Instance of all liability); and (3) provides to you all reasonable assistance, at your expense.

    +

    You agree to indemnify us, defend us, and hold us harmless from and against any and all claims, liabilities, and expenses, including attorneys’ fees, arising out of your use of the Website and the Service, including but not limited to your violation of this Agreement, provided that Your Forgejo Instance (1) promptly gives you written notice of the claim, demand, suit or proceeding; (2) gives you sole control of the defense and settlement of the claim, demand, suit or proceeding (provided that you may not settle any claim, demand, suit or proceeding unless the settlement unconditionally releases Your Forgejo Instance of all liability); and (3) provides to you all reasonable assistance, at your expense.

    Changes to These Terms

    @@ -224,22 +224,22 @@

    Governing Law

    -

    Except to the extent applicable law provides otherwise, this Agreement between you and us and any access to or use of the Website or the Service are governed by (national laws of country/state where Gitea is deployed) and (regional laws of locality where Gitea is deployed), without regard to conflict of law provisions. You and Your Gitea Instance agree to submit to the exclusive jurisdiction and venue of the courts located in (locality where Gitea is deployed).

    +

    Except to the extent applicable law provides otherwise, this Agreement between you and us and any access to or use of the Website or the Service are governed by (national laws of country/state where Forgejo is deployed) and (regional laws of locality where Forgejo is deployed), without regard to conflict of law provisions. You and Your Forgejo Instance agree to submit to the exclusive jurisdiction and venue of the courts located in (locality where Forgejo is deployed).

    Non-Assignability

    -

    Your Gitea Instance may assign or delegate these Terms of Service and/or our Privacy Policy in whole or in part, to any person or entity at any time with or without your consent, including the license granted in User-Generated Content. You may not assign or delegate any rights or obligations under the Terms of Service or Privacy Statement without our prior written consent, and any unauthorized assignment and delegation by you is void.

    +

    Your Forgejo Instance may assign or delegate these Terms of Service and/or our Privacy Policy in whole or in part, to any person or entity at any time with or without your consent, including the license granted in User-Generated Content. You may not assign or delegate any rights or obligations under the Terms of Service or Privacy Statement without our prior written consent, and any unauthorized assignment and delegation by you is void.

    Severablity, No Waiver, and Survival

    -

    If any part of this Agreement is held invalid or unenforceable, that portion of the Agreement will be construed to reflect the parties’ original intent. The remaining portions will remain in full force and effect. Any failure on the part of Your Gitea Instance to enforce any provision of this Agreement will not be considered a waiver of our right to enforce such provision. Our rights under this Agreement will survive any termination of this Agreement.

    +

    If any part of this Agreement is held invalid or unenforceable, that portion of the Agreement will be construed to reflect the parties’ original intent. The remaining portions will remain in full force and effect. Any failure on the part of Your Forgejo Instance to enforce any provision of this Agreement will not be considered a waiver of our right to enforce such provision. Our rights under this Agreement will survive any termination of this Agreement.

    Amendments and Complete Agreement

    -

    This Agreement may only be modified by a written amendment signed by an authorized representative of Your Gitea Instance, or by the posting by Your Gitea Instance of a revised version in accordance with Changes to These Terms. These Terms of Service, together with the Your Gitea Instance Privacy Policy, represent the complete and exclusive statement of the agreement between you and us. This Agreement supersedes any proposal or prior agreement oral or written, and any other communications between you and Your Gitea Instance relating to the subject matter of these terms including any confidentiality or nondisclosure agreements.

    +

    This Agreement may only be modified by a written amendment signed by an authorized representative of Your Forgejo Instance, or by the posting by Your Forgejo Instance of a revised version in accordance with Changes to These Terms. These Terms of Service, together with the Your Forgejo Instance Privacy Policy, represent the complete and exclusive statement of the agreement between you and us. This Agreement supersedes any proposal or prior agreement oral or written, and any other communications between you and Your Forgejo Instance relating to the subject matter of these terms including any confidentiality or nondisclosure agreements.

    Contact

    -

    If you have questions about these Terms of Service, you can contact our support.

    +

    If you have questions about these Terms of Service, you can contact our support.

    diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index 9cb5a67172..b76cf7df80 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -328,6 +328,10 @@ RUN_USER = ; git ;; Maximum number of locks returned per page ;LFS_LOCKS_PAGING_NUM = 50 ;; +;; When clients make lfs batch requests, reject them if there are more pointers than this number +;; zero means 'unlimited' +;LFS_MAX_BATCH_SIZE = 0 +;; ;; Allow graceful restarts using SIGHUP to fork ;ALLOW_GRACEFUL_RESTARTS = true ;; @@ -349,16 +353,25 @@ RUN_USER = ; git ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; -;; Database to use. Either "mysql", "postgres", "mssql" or "sqlite3". +;; Database to use. Either "sqlite3", "mySQL" or "postgres". +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; SQLite Configuration +;; +DB_TYPE = sqlite3 +;PATH= ; defaults to data/forgejo.db +;SQLITE_TIMEOUT = ; Query timeout defaults to: 500 +;SQLITE_JOURNAL_MODE = ; defaults to sqlite database default (often DELETE), can be used to enable WAL mode. https://www.sqlite.org/pragma.html#pragma_journal_mode ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; MySQL Configuration ;; -DB_TYPE = mysql -HOST = 127.0.0.1:3306 ; can use socket e.g. /var/run/mysqld/mysqld.sock -NAME = gitea -USER = root +;DB_TYPE = mysql +;HOST = 127.0.0.1:3306 ; can use socket e.g. /var/run/mysqld/mysqld.sock +;NAME = gitea +;USER = root ;PASSWD = ;Use PASSWD = `your password` for quoting if you use special characters in the password. ;SSL_MODE = false ; either "false" (default), "true", or "skip-verify" ;CHARSET_COLLATION = ; Empty as default, Gitea will try to find a case-sensitive collation. Don't change it unless you clearly know what you need. @@ -377,26 +390,6 @@ USER = root ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; -;; SQLite Configuration -;; -;DB_TYPE = sqlite3 -;PATH= ; defaults to data/forgejo.db -;SQLITE_TIMEOUT = ; Query timeout defaults to: 500 -;SQLITE_JOURNAL_MODE = ; defaults to sqlite database default (often DELETE), can be used to enable WAL mode. https://www.sqlite.org/pragma.html#pragma_journal_mode -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; MSSQL Configuration -;; -;DB_TYPE = mssql -;HOST = 172.17.0.2:1433 -;NAME = gitea -;USER = SA -;PASSWD = MwantsaSecurePassword1 -;CHARSET_COLLATION = ; Empty as default, Gitea will try to find a case-sensitive collation. Don't change it unless you clearly know what you need. -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; ;; Other settings ;; ;; For iterate buffer, default is 50 @@ -529,7 +522,8 @@ INTERNAL_TOKEN = ;; HMAC to encode urls with, it **is required** if camo is enabled. ;HMAC_KEY = ;; Set to true to use camo for https too lese only non https urls are proxyed -;ALLWAYS = false +;; ALLWAYS is deprecated and will be removed in the future +;ALWAYS = false ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -907,6 +901,9 @@ LEVEL = Info ;; Show Registration button ;SHOW_REGISTRATION_BUTTON = true ;; +;; Whether to allow internal signin +; ENABLE_INTERNAL_SIGNIN = true +;; ;; Show milestones dashboard page - a view of all the user's milestones ;SHOW_MILESTONES_DASHBOARD_PAGE = true ;; @@ -924,6 +921,24 @@ LEVEL = Info ;; Valid site url schemes for user profiles ;VALID_SITE_URL_SCHEMES=http,https +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;[service.explore] +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Only allow signed in users to view the explore pages. +;REQUIRE_SIGNIN_VIEW = false +;; +;; Disable the users explore page. +;DISABLE_USERS_PAGE = false +;; +;; Disable the organizations explore page. +;DISABLE_ORGANIZATIONS_PAGE = false +;; +;; Disable the code explore page. +;DISABLE_CODE_PAGE = false +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1926,7 +1941,7 @@ LEVEL = Info ;ENABLED = true ;; ;; Comma-separated list of allowed file extensions (`.zip`), mime types (`text/plain`) or wildcard type (`image/*`, `audio/*`, `video/*`). Empty value or `*/*` allows all types. -;ALLOWED_TYPES = .cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.xls,.xlsx,.zip +;ALLOWED_TYPES = .avif,.cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.webp,.xls,.xlsx,.zip ;; ;; Max size of each file. Defaults to 2048MB ;MAX_SIZE = 2048 @@ -1964,7 +1979,7 @@ LEVEL = Info ;; Url lookup for the minio bucket only available when STORAGE_TYPE is `minio` ;; Available values: auto, dns, path ;; If empty, it behaves the same as "auto" was set -;MINIO_BUCKET_LOOKUP = +;MINIO_BUCKET_LOOKUP = ;; ;; Minio location to create bucket only available when STORAGE_TYPE is `minio` ;MINIO_LOCATION = us-east-1 @@ -2295,7 +2310,7 @@ LEVEL = Info ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Delete all old actions from database +;; Delete all old activities from database ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;[cron.delete_old_actions] ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -2392,8 +2407,8 @@ LEVEL = Info ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; The first locale will be used as the default if user browser's language doesn't match any locale in the list. -;LANGS = en-US,zh-CN,zh-HK,zh-TW,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,uk-UA,ja-JP,es-ES,pt-BR,pt-PT,pl-PL,bg-BG,it-IT,fi-FI,tr-TR,cs-CZ,sv-SE,ko-KR,el-GR,fa-IR,hu-HU,id-ID,ml-IN -;NAMES = English,简体中文,ç¹é«”中文(香港),ç¹é«”中文(å°ç£ï¼‰,Deutsch,Français,Nederlands,LatvieÅ¡u,РуÑÑкий,УкраїнÑька,日本語,Español,Português do Brasil,Português de Portugal,Polski,БългарÑки,Italiano,Suomi,Türkçe,ÄŒeÅ¡tina,СрпÑки,Svenska,한국어,Ελληνικά,ÙØ§Ø±Ø³ÛŒ,Magyar nyelv,Bahasa Indonesia,മലയാളം +;LANGS = en-US,zh-CN,zh-HK,zh-TW,da,de-DE,nds,fr-FR,nl-NL,lv-LV,ru-RU,uk-UA,ja-JP,es-ES,pt-BR,pt-PT,pl-PL,bg,it-IT,fi-FI,fil,eo,tr-TR,cs-CZ,sl,sv-SE,ko-KR,el-GR,fa-IR,hu-HU,id-ID +;NAMES = English,简体中文,ç¹é«”中文(香港),ç¹é«”中文(å°ç£ï¼‰,Dansk,Deutsch,Plattdüütsch,Français,Nederlands,LatvieÅ¡u,РуÑÑкий,УкраїнÑька,日本語,Español,Português do Brasil,Português de Portugal,Polski,БългарÑки,Italiano,Suomi,Filipino,Esperanto,Türkçe,ÄŒeÅ¡tina,SlovenÅ¡Äina,Svenska,한국어,Ελληνικά,ÙØ§Ø±Ø³ÛŒ,Magyar nyelv,Bahasa Indonesia ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -2653,6 +2668,27 @@ LEVEL = Info ;; override the minio base path if storage type is minio ;MINIO_BASE_PATH = lfs/ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; settings for Gitea's LFS client (eg: mirroring an upstream lfs endpoint) +;; +;[lfs_client] +;; Limit the number of pointers in each batch request to this number +;BATCH_SIZE = 20 +;; Limit the number of concurrent upload/download operations within a batch +;BATCH_OPERATION_CONCURRENCY = 8 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;[annex] +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Whether git-annex is enabled; defaults to false +;ENABLED = false +;; Whether to disable p2phttp support; default is the same as repository.DISABLE_HTTP_GIT +;DISABLE_P2PHTTP = false + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; settings for packages, will override storage setting @@ -2687,7 +2723,7 @@ LEVEL = Info ;; Url lookup for the minio bucket only available when STORAGE_TYPE is `minio` ;; Available values: auto, dns, path ;; If empty, it behaves the same as "auto" was set -;MINIO_BUCKET_LOOKUP = +;MINIO_BUCKET_LOOKUP = ;; ;; Minio location to create bucket only available when STORAGE_TYPE is `minio` ;MINIO_LOCATION = us-east-1 diff --git a/docker/root/usr/bin/entrypoint b/docker/root/usr/bin/entrypoint index d9dbb3ebe0..08587fc4f4 100755 --- a/docker/root/usr/bin/entrypoint +++ b/docker/root/usr/bin/entrypoint @@ -37,5 +37,5 @@ done if [ $# -gt 0 ]; then exec "$@" else - exec /bin/s6-svscan /etc/s6 + exec /usr/bin/s6-svscan /etc/s6 fi diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000000..17f461a8f4 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,1174 @@ +import eslintCommunityEslintPluginEslintComments from '@eslint-community/eslint-plugin-eslint-comments'; +import stylisticEslintPluginJs from '@stylistic/eslint-plugin-js'; +import vitest from '@vitest/eslint-plugin'; +import arrayFunc from 'eslint-plugin-array-func'; +import eslintPluginImportX from 'eslint-plugin-import-x'; +import noJquery from 'eslint-plugin-no-jquery'; +import noUseExtendNative from 'eslint-plugin-no-use-extend-native'; +import regexp from 'eslint-plugin-regexp'; +import sonarjs from 'eslint-plugin-sonarjs'; +import unicorn from 'eslint-plugin-unicorn'; +import playwright from 'eslint-plugin-playwright'; +import vitestGlobals from 'eslint-plugin-vitest-globals'; +import wc from 'eslint-plugin-wc'; +import globals from 'globals'; +import vue from 'eslint-plugin-vue'; +import vueScopedCss from 'eslint-plugin-vue-scoped-css'; +import toml from 'eslint-plugin-toml'; +import tseslint from 'typescript-eslint'; + +export default tseslint.config( + ...tseslint.configs.recommended, + eslintPluginImportX.flatConfigs.typescript, + { + ignores: ['web_src/js/vendor', 'web_src/fomantic', 'public/assets/js', 'tests/e2e/reports/'], + }, + { + plugins: { + '@eslint-community/eslint-comments': eslintCommunityEslintPluginEslintComments, + '@stylistic/js': stylisticEslintPluginJs, + '@vitest': vitest, + 'array-func': arrayFunc, + 'no-jquery': noJquery, + 'no-use-extend-native': noUseExtendNative, + regexp, + sonarjs, + unicorn, + playwright, + toml, + 'vitest-globals': vitestGlobals, + vue, + 'vue-scoped-css': vueScopedCss, + wc, + }, + + linterOptions: { + reportUnusedDisableDirectives: true, + }, + + languageOptions: { + globals: { + ...globals.node, + }, + parserOptions: { + ecmaVersion: 'latest', + }, + + ecmaVersion: 'latest', + sourceType: 'module', + }, + rules: { + '@typescript-eslint/no-unused-vars': 'off', // TODO: enable this rule again + + '@eslint-community/eslint-comments/disable-enable-pair': [2], + '@eslint-community/eslint-comments/no-aggregating-enable': [2], + '@eslint-community/eslint-comments/no-duplicate-disable': [2], + '@eslint-community/eslint-comments/no-restricted-disable': [0], + '@eslint-community/eslint-comments/no-unlimited-disable': [2], + '@eslint-community/eslint-comments/no-unused-disable': [2], + '@eslint-community/eslint-comments/no-unused-enable': [2], + '@eslint-community/eslint-comments/no-use': [0], + '@eslint-community/eslint-comments/require-description': [0], + '@stylistic/js/array-bracket-newline': [0], + '@stylistic/js/array-bracket-spacing': [2, 'never'], + '@stylistic/js/array-element-newline': [0], + '@stylistic/js/arrow-parens': [2, 'always'], + + '@stylistic/js/arrow-spacing': [2, { + before: true, + after: true, + }], + + '@stylistic/js/block-spacing': [0], + + '@stylistic/js/brace-style': [2, '1tbs', { + allowSingleLine: true, + }], + + '@stylistic/js/comma-dangle': [2, 'always-multiline'], + + '@stylistic/js/comma-spacing': [2, { + before: false, + after: true, + }], + + '@stylistic/js/comma-style': [2, 'last'], + '@stylistic/js/computed-property-spacing': [2, 'never'], + '@stylistic/js/dot-location': [2, 'property'], + '@stylistic/js/eol-last': [2], + '@stylistic/js/function-call-spacing': [2, 'never'], + '@stylistic/js/function-call-argument-newline': [0], + '@stylistic/js/function-paren-newline': [0], + '@stylistic/js/generator-star-spacing': [0], + '@stylistic/js/implicit-arrow-linebreak': [0], + + '@stylistic/js/indent': [2, 2, { + ignoreComments: true, + SwitchCase: 1, + }], + + '@stylistic/js/key-spacing': [2], + '@stylistic/js/keyword-spacing': [2], + '@stylistic/js/linebreak-style': [2, 'unix'], + '@stylistic/js/lines-around-comment': [0], + '@stylistic/js/lines-between-class-members': [0], + '@stylistic/js/max-len': [0], + '@stylistic/js/max-statements-per-line': [0], + '@stylistic/js/multiline-ternary': [0], + '@stylistic/js/new-parens': [2], + '@stylistic/js/newline-per-chained-call': [0], + '@stylistic/js/no-confusing-arrow': [0], + '@stylistic/js/no-extra-parens': [0], + '@stylistic/js/no-extra-semi': [2], + '@stylistic/js/no-floating-decimal': [0], + '@stylistic/js/no-mixed-operators': [0], + '@stylistic/js/no-mixed-spaces-and-tabs': [2], + + '@stylistic/js/no-multi-spaces': [2, { + ignoreEOLComments: true, + + exceptions: { + Property: true, + }, + }], + + '@stylistic/js/no-multiple-empty-lines': [2, { + max: 1, + maxEOF: 0, + maxBOF: 0, + }], + + '@stylistic/js/no-tabs': [2], + '@stylistic/js/no-trailing-spaces': [2], + '@stylistic/js/no-whitespace-before-property': [2], + '@stylistic/js/nonblock-statement-body-position': [2], + '@stylistic/js/object-curly-newline': [0], + '@stylistic/js/object-curly-spacing': [2, 'never'], + '@stylistic/js/object-property-newline': [0], + '@stylistic/js/one-var-declaration-per-line': [0], + '@stylistic/js/operator-linebreak': [2, 'after'], + '@stylistic/js/padded-blocks': [2, 'never'], + '@stylistic/js/padding-line-between-statements': [0], + '@stylistic/js/quote-props': [0], + + '@stylistic/js/quotes': [2, 'single', { + avoidEscape: true, + allowTemplateLiterals: true, + }], + + '@stylistic/js/rest-spread-spacing': [2, 'never'], + + '@stylistic/js/semi': [2, 'always', { + omitLastInOneLineBlock: true, + }], + + '@stylistic/js/semi-spacing': [2, { + before: false, + after: true, + }], + + '@stylistic/js/semi-style': [2, 'last'], + '@stylistic/js/space-before-blocks': [2, 'always'], + + '@stylistic/js/space-before-function-paren': [2, { + anonymous: 'ignore', + named: 'never', + asyncArrow: 'always', + }], + + '@stylistic/js/space-in-parens': [2, 'never'], + '@stylistic/js/space-infix-ops': [2], + '@stylistic/js/space-unary-ops': [2], + '@stylistic/js/spaced-comment': [2, 'always'], + '@stylistic/js/switch-colon-spacing': [2], + '@stylistic/js/template-curly-spacing': [2, 'never'], + '@stylistic/js/template-tag-spacing': [2, 'never'], + '@stylistic/js/wrap-iife': [2, 'inside'], + '@stylistic/js/wrap-regex': [0], + '@stylistic/js/yield-star-spacing': [2, 'after'], + 'accessor-pairs': [2], + + 'array-callback-return': [2, { + checkForEach: true, + }], + + 'array-func/avoid-reverse': [2], + 'array-func/from-map': [2], + 'array-func/no-unnecessary-this-arg': [2], + 'array-func/prefer-array-from': [2], + 'array-func/prefer-flat-map': [0], + 'array-func/prefer-flat': [0], + 'arrow-body-style': [0], + 'block-scoped-var': [2], + camelcase: [0], + 'capitalized-comments': [0], + 'class-methods-use-this': [0], + complexity: [0], + 'consistent-return': [0], + 'consistent-this': [0], + 'constructor-super': [2], + curly: [0], + 'default-case-last': [2], + 'default-case': [0], + 'default-param-last': [0], + 'dot-notation': [0], + eqeqeq: [2], + 'for-direction': [2], + 'func-name-matching': [2], + 'func-names': [0], + 'func-style': [0], + 'getter-return': [2], + 'grouped-accessor-pairs': [2], + 'guard-for-in': [0], + 'id-blacklist': [0], + 'id-length': [0], + 'id-match': [0], + 'init-declarations': [0], + 'line-comment-position': [0], + 'logical-assignment-operators': [0], + 'max-classes-per-file': [0], + 'max-depth': [0], + 'max-lines-per-function': [0], + 'max-lines': [0], + 'max-nested-callbacks': [0], + 'max-params': [0], + 'max-statements': [0], + 'multiline-comment-style': [2, 'separate-lines'], + 'new-cap': [0], + 'no-alert': [0], + 'no-array-constructor': [2], + 'no-async-promise-executor': [0], + 'no-await-in-loop': [0], + 'no-bitwise': [0], + 'no-buffer-constructor': [0], + 'no-caller': [2], + 'no-case-declarations': [2], + 'no-class-assign': [2], + 'no-compare-neg-zero': [2], + 'no-cond-assign': [2, 'except-parens'], + + 'no-console': [1, { + allow: ['debug', 'info', 'warn', 'error'], + }], + + 'no-const-assign': [2], + 'no-constant-binary-expression': [2], + 'no-constant-condition': [0], + 'no-constructor-return': [2], + 'no-continue': [0], + 'no-control-regex': [0], + 'no-debugger': [1], + 'no-delete-var': [2], + 'no-div-regex': [0], + 'no-dupe-args': [2], + 'no-dupe-class-members': [2], + 'no-dupe-else-if': [2], + 'no-dupe-keys': [2], + 'no-duplicate-case': [2], + 'no-duplicate-imports': [2], + 'no-else-return': [2], + 'no-empty-character-class': [2], + 'no-empty-function': [0], + 'no-empty-pattern': [2], + 'no-empty-static-block': [2], + + 'no-empty': [2, { + allowEmptyCatch: true, + }], + + 'no-eq-null': [2], + 'no-eval': [2], + 'no-ex-assign': [2], + 'no-extend-native': [2], + 'no-extra-bind': [2], + 'no-extra-boolean-cast': [2], + 'no-extra-label': [0], + 'no-fallthrough': [2], + 'no-func-assign': [2], + 'no-global-assign': [2], + 'no-implicit-coercion': [2], + 'no-implicit-globals': [0], + 'no-implied-eval': [2], + 'no-import-assign': [2], + 'no-inline-comments': [0], + 'no-inner-declarations': [2], + 'no-invalid-regexp': [2], + 'no-invalid-this': [0], + 'no-irregular-whitespace': [2], + 'no-iterator': [2], + 'no-jquery/no-ajax-events': [2], + 'no-jquery/no-ajax': [2], + 'no-jquery/no-and-self': [2], + 'no-jquery/no-animate-toggle': [2], + 'no-jquery/no-animate': [2], + 'no-jquery/no-append-html': [2], + 'no-jquery/no-attr': [2], + 'no-jquery/no-bind': [2], + 'no-jquery/no-box-model': [2], + 'no-jquery/no-browser': [2], + 'no-jquery/no-camel-case': [2], + 'no-jquery/no-class-state': [2], + 'no-jquery/no-class': [0], + 'no-jquery/no-clone': [2], + 'no-jquery/no-closest': [0], + 'no-jquery/no-constructor-attributes': [2], + 'no-jquery/no-contains': [2], + 'no-jquery/no-context-prop': [2], + 'no-jquery/no-css': [2], + 'no-jquery/no-data': [0], + 'no-jquery/no-deferred': [2], + 'no-jquery/no-delegate': [2], + 'no-jquery/no-each-collection': [0], + 'no-jquery/no-each-util': [0], + 'no-jquery/no-each': [0], + 'no-jquery/no-error-shorthand': [2], + 'no-jquery/no-error': [2], + 'no-jquery/no-escape-selector': [2], + 'no-jquery/no-event-shorthand': [2], + 'no-jquery/no-extend': [2], + 'no-jquery/no-fade': [2], + 'no-jquery/no-filter': [0], + 'no-jquery/no-find-collection': [0], + 'no-jquery/no-find-util': [2], + 'no-jquery/no-find': [0], + 'no-jquery/no-fx-interval': [2], + 'no-jquery/no-global-eval': [2], + 'no-jquery/no-global-selector': [0], + 'no-jquery/no-grep': [2], + 'no-jquery/no-has': [2], + 'no-jquery/no-hold-ready': [2], + 'no-jquery/no-html': [0], + 'no-jquery/no-in-array': [2], + 'no-jquery/no-is-array': [2], + 'no-jquery/no-is-empty-object': [2], + 'no-jquery/no-is-function': [2], + 'no-jquery/no-is-numeric': [2], + 'no-jquery/no-is-plain-object': [2], + 'no-jquery/no-is-window': [2], + 'no-jquery/no-is': [2], + 'no-jquery/no-jquery-constructor': [0], + 'no-jquery/no-live': [2], + 'no-jquery/no-load-shorthand': [2], + 'no-jquery/no-load': [2], + 'no-jquery/no-map-collection': [0], + 'no-jquery/no-map-util': [2], + 'no-jquery/no-map': [2], + 'no-jquery/no-merge': [2], + 'no-jquery/no-node-name': [2], + 'no-jquery/no-noop': [2], + 'no-jquery/no-now': [2], + 'no-jquery/no-on-ready': [2], + 'no-jquery/no-other-methods': [0], + 'no-jquery/no-other-utils': [2], + 'no-jquery/no-param': [2], + 'no-jquery/no-parent': [0], + 'no-jquery/no-parents': [2], + 'no-jquery/no-parse-html-literal': [2], + 'no-jquery/no-parse-html': [2], + 'no-jquery/no-parse-json': [2], + 'no-jquery/no-parse-xml': [2], + 'no-jquery/no-prop': [2], + 'no-jquery/no-proxy': [2], + 'no-jquery/no-ready-shorthand': [2], + 'no-jquery/no-ready': [2], + 'no-jquery/no-selector-prop': [2], + 'no-jquery/no-serialize': [2], + 'no-jquery/no-size': [2], + 'no-jquery/no-sizzle': [0], + 'no-jquery/no-slide': [2], + 'no-jquery/no-sub': [2], + 'no-jquery/no-support': [2], + 'no-jquery/no-text': [0], + 'no-jquery/no-trigger': [0], + 'no-jquery/no-trim': [2], + 'no-jquery/no-type': [2], + 'no-jquery/no-unique': [2], + 'no-jquery/no-unload-shorthand': [2], + 'no-jquery/no-val': [0], + 'no-jquery/no-visibility': [2], + 'no-jquery/no-when': [2], + 'no-jquery/no-wrap': [2], + 'no-jquery/variable-pattern': [2], + 'no-label-var': [2], + 'no-labels': [0], + 'no-lone-blocks': [2], + 'no-lonely-if': [0], + 'no-loop-func': [0], + 'no-loss-of-precision': [2], + 'no-magic-numbers': [0], + 'no-misleading-character-class': [2], + 'no-multi-assign': [0], + 'no-multi-str': [2], + 'no-negated-condition': [0], + 'no-nested-ternary': [0], + 'no-new-func': [2], + 'no-new-native-nonconstructor': [2], + 'no-new-object': [2], + 'no-new-symbol': [2], + 'no-new-wrappers': [2], + 'no-new': [0], + 'no-nonoctal-decimal-escape': [2], + 'no-obj-calls': [2], + 'no-octal-escape': [2], + 'no-octal': [2], + 'no-param-reassign': [0], + 'no-plusplus': [0], + 'no-promise-executor-return': [0], + 'no-proto': [2], + 'no-prototype-builtins': [2], + 'no-redeclare': [2], + 'no-regex-spaces': [2], + 'no-restricted-exports': [0], + + 'no-restricted-globals': [ + 2, + 'addEventListener', + 'blur', + 'close', + 'closed', + 'confirm', + 'defaultStatus', + 'defaultstatus', + 'error', + 'event', + 'external', + 'find', + 'focus', + 'frameElement', + 'frames', + 'history', + 'innerHeight', + 'innerWidth', + 'isFinite', + 'isNaN', + 'length', + 'location', + 'locationbar', + 'menubar', + 'moveBy', + 'moveTo', + 'name', + 'onblur', + 'onerror', + 'onfocus', + 'onload', + 'onresize', + 'onunload', + 'open', + 'opener', + 'opera', + 'outerHeight', + 'outerWidth', + 'pageXOffset', + 'pageYOffset', + 'parent', + 'print', + 'removeEventListener', + 'resizeBy', + 'resizeTo', + 'screen', + 'screenLeft', + 'screenTop', + 'screenX', + 'screenY', + 'scroll', + 'scrollbars', + 'scrollBy', + 'scrollTo', + 'scrollX', + 'scrollY', + 'self', + 'status', + 'statusbar', + 'stop', + 'toolbar', + 'top', + '__dirname', + '__filename', + ], + + 'no-restricted-imports': [0], + + 'no-restricted-syntax': [ + 2, + 'WithStatement', + 'ForInStatement', + 'LabeledStatement', + 'SequenceExpression', + { + selector: "CallExpression[callee.name='fetch']", + message: 'use modules/fetch.js instead', + }, + ], + + 'no-return-assign': [0], + 'no-script-url': [2], + + 'no-self-assign': [2, { + props: true, + }], + + 'no-self-compare': [2], + 'no-sequences': [2], + 'no-setter-return': [2], + 'no-shadow-restricted-names': [2], + 'no-shadow': [0], + 'no-sparse-arrays': [2], + 'no-template-curly-in-string': [2], + 'no-ternary': [0], + 'no-this-before-super': [2], + 'no-throw-literal': [2], + 'no-undef-init': [2], + + 'no-undef': [2, { + typeof: true, + }], + + 'no-undefined': [0], + 'no-underscore-dangle': [0], + 'no-unexpected-multiline': [2], + 'no-unmodified-loop-condition': [2], + 'no-unneeded-ternary': [2], + 'no-unreachable-loop': [2], + 'no-unreachable': [2], + 'no-unsafe-finally': [2], + 'no-unsafe-negation': [2], + 'no-unused-expressions': [2], + 'no-unused-labels': [2], + 'no-unused-private-class-members': [2], + + 'no-unused-vars': [2, { + args: 'all', + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + destructuredArrayIgnorePattern: '^_', + ignoreRestSiblings: false, + }], + + 'no-use-before-define': [2, { + functions: false, + classes: true, + variables: true, + allowNamedExports: true, + }], + + 'no-use-extend-native/no-use-extend-native': [2], + 'no-useless-backreference': [2], + 'no-useless-call': [2], + 'no-useless-catch': [2], + 'no-useless-computed-key': [2], + 'no-useless-concat': [2], + 'no-useless-constructor': [2], + 'no-useless-escape': [2], + 'no-useless-rename': [2], + 'no-useless-return': [2], + 'no-var': [2], + 'no-void': [2], + 'no-warning-comments': [0], + 'no-with': [0], + 'object-shorthand': [2, 'always'], + 'one-var-declaration-per-line': [0], + 'one-var': [0], + 'operator-assignment': [2, 'always'], + 'operator-linebreak': [2, 'after'], + + 'prefer-arrow-callback': [2, { + allowNamedFunctions: true, + allowUnboundThis: true, + }], + + 'prefer-const': [2, { + destructuring: 'all', + ignoreReadBeforeAssign: true, + }], + + 'prefer-destructuring': [0], + 'prefer-exponentiation-operator': [2], + 'prefer-named-capture-group': [0], + 'prefer-numeric-literals': [2], + 'prefer-object-has-own': [2], + 'prefer-object-spread': [2], + + 'prefer-promise-reject-errors': [2, { + allowEmptyReject: false, + }], + + 'prefer-regex-literals': [2], + 'prefer-rest-params': [2], + 'prefer-spread': [2], + 'prefer-template': [2], + radix: [2, 'as-needed'], + 'regexp/confusing-quantifier': [2], + 'regexp/control-character-escape': [2], + 'regexp/hexadecimal-escape': [0], + 'regexp/letter-case': [0], + 'regexp/match-any': [2], + 'regexp/negation': [2], + 'regexp/no-contradiction-with-assertion': [0], + 'regexp/no-control-character': [0], + 'regexp/no-dupe-characters-character-class': [2], + 'regexp/no-dupe-disjunctions': [2], + 'regexp/no-empty-alternative': [2], + 'regexp/no-empty-capturing-group': [2], + 'regexp/no-empty-character-class': [0], + 'regexp/no-empty-group': [2], + 'regexp/no-empty-lookarounds-assertion': [2], + 'regexp/no-empty-string-literal': [2], + 'regexp/no-escape-backspace': [2], + 'regexp/no-extra-lookaround-assertions': [0], + 'regexp/no-invalid-regexp': [2], + 'regexp/no-invisible-character': [2], + 'regexp/no-lazy-ends': [2], + 'regexp/no-legacy-features': [2], + 'regexp/no-misleading-capturing-group': [0], + 'regexp/no-misleading-unicode-character': [0], + 'regexp/no-missing-g-flag': [2], + 'regexp/no-non-standard-flag': [2], + 'regexp/no-obscure-range': [2], + 'regexp/no-octal': [2], + 'regexp/no-optional-assertion': [2], + 'regexp/no-potentially-useless-backreference': [2], + 'regexp/no-standalone-backslash': [2], + 'regexp/no-super-linear-backtracking': [0], + 'regexp/no-super-linear-move': [0], + 'regexp/no-trivially-nested-assertion': [2], + 'regexp/no-trivially-nested-quantifier': [2], + 'regexp/no-unused-capturing-group': [0], + 'regexp/no-useless-assertions': [2], + 'regexp/no-useless-backreference': [2], + 'regexp/no-useless-character-class': [2], + 'regexp/no-useless-dollar-replacements': [2], + 'regexp/no-useless-escape': [2], + 'regexp/no-useless-flag': [2], + 'regexp/no-useless-lazy': [2], + 'regexp/no-useless-non-capturing-group': [2], + 'regexp/no-useless-quantifier': [2], + 'regexp/no-useless-range': [2], + 'regexp/no-useless-set-operand': [2], + 'regexp/no-useless-string-literal': [2], + 'regexp/no-useless-two-nums-quantifier': [2], + 'regexp/no-zero-quantifier': [2], + 'regexp/optimal-lookaround-quantifier': [2], + 'regexp/optimal-quantifier-concatenation': [0], + 'regexp/prefer-character-class': [0], + 'regexp/prefer-d': [0], + 'regexp/prefer-escape-replacement-dollar-char': [0], + 'regexp/prefer-lookaround': [0], + 'regexp/prefer-named-backreference': [0], + 'regexp/prefer-named-capture-group': [0], + 'regexp/prefer-named-replacement': [0], + 'regexp/prefer-plus-quantifier': [2], + 'regexp/prefer-predefined-assertion': [2], + 'regexp/prefer-quantifier': [0], + 'regexp/prefer-question-quantifier': [2], + 'regexp/prefer-range': [2], + 'regexp/prefer-regexp-exec': [2], + 'regexp/prefer-regexp-test': [2], + 'regexp/prefer-result-array-groups': [0], + 'regexp/prefer-set-operation': [2], + 'regexp/prefer-star-quantifier': [2], + 'regexp/prefer-unicode-codepoint-escapes': [2], + 'regexp/prefer-w': [0], + 'regexp/require-unicode-regexp': [0], + 'regexp/simplify-set-operations': [2], + 'regexp/sort-alternatives': [0], + 'regexp/sort-character-class-elements': [0], + 'regexp/sort-flags': [0], + 'regexp/strict': [2], + 'regexp/unicode-escape': [0], + 'regexp/use-ignore-case': [0], + 'require-atomic-updates': [0], + 'require-await': [0], + 'require-unicode-regexp': [0], + 'require-yield': [2], + 'sonarjs/cognitive-complexity': [0], + 'sonarjs/elseif-without-else': [0], + 'sonarjs/max-switch-cases': [0], + 'sonarjs/no-all-duplicated-branches': [2], + 'sonarjs/no-collapsible-if': [0], + 'sonarjs/no-collection-size-mischeck': [2], + 'sonarjs/no-duplicate-string': [0], + 'sonarjs/no-duplicated-branches': [0], + 'sonarjs/no-element-overwrite': [2], + 'sonarjs/no-empty-collection': [2], + 'sonarjs/no-extra-arguments': [2], + 'sonarjs/no-gratuitous-expressions': [2], + 'sonarjs/no-identical-conditions': [2], + 'sonarjs/no-identical-expressions': [2], + 'sonarjs/no-identical-functions': [2, 5], + 'sonarjs/no-ignored-return': [2], + 'sonarjs/no-inverted-boolean-check': [2], + 'sonarjs/no-nested-switch': [0], + 'sonarjs/no-nested-template-literals': [0], + 'sonarjs/no-one-iteration-loop': [2], + 'sonarjs/no-redundant-boolean': [2], + 'sonarjs/no-redundant-jump': [2], + 'sonarjs/no-same-line-conditional': [2], + 'sonarjs/no-small-switch': [0], + 'sonarjs/no-unused-collection': [2], + 'sonarjs/no-use-of-empty-return-value': [2], + 'sonarjs/no-useless-catch': [2], + 'sonarjs/non-existent-operator': [2], + 'sonarjs/prefer-immediate-return': [0], + 'sonarjs/prefer-object-literal': [0], + 'sonarjs/prefer-single-boolean-return': [0], + 'sonarjs/prefer-while': [2], + 'sort-imports': [0], + 'sort-keys': [0], + 'sort-vars': [0], + strict: [0], + 'symbol-description': [2], + 'unicode-bom': [2, 'never'], + 'unicorn/better-regex': [0], + 'unicorn/catch-error-name': [0], + 'unicorn/consistent-assert': [0], + 'unicorn/consistent-date-clone': [2], + 'unicorn/consistent-destructuring': [2], + 'unicorn/consistent-empty-array-spread': [2], + 'unicorn/consistent-existence-index-check': [2], + 'unicorn/consistent-function-scoping': [2], + 'unicorn/custom-error-definition': [0], + 'unicorn/empty-brace-spaces': [2], + 'unicorn/error-message': [0], + 'unicorn/escape-case': [0], + 'unicorn/expiring-todo-comments': [0], + 'unicorn/explicit-length-check': [0], + 'unicorn/filename-case': [0], + 'unicorn/import-index': [0], + 'unicorn/import-style': [0], + 'unicorn/new-for-builtins': [2], + 'unicorn/no-accessor-recursion': [2], + 'unicorn/no-abusive-eslint-disable': [0], + 'unicorn/no-anonymous-default-export': [0], + 'unicorn/no-array-callback-reference': [0], + 'unicorn/no-array-for-each': [2], + 'unicorn/no-array-method-this-argument': [2], + 'unicorn/no-array-push-push': [2], + 'unicorn/no-array-reduce': [2], + 'unicorn/no-await-expression-member': [0], + 'unicorn/no-await-in-promise-methods': [2], + 'unicorn/no-console-spaces': [0], + 'unicorn/no-document-cookie': [2], + 'unicorn/no-empty-file': [2], + 'unicorn/no-for-loop': [0], + 'unicorn/no-hex-escape': [0], + 'unicorn/no-instanceof-builtins': [0], + 'unicorn/no-invalid-fetch-options': [2], + 'unicorn/no-invalid-remove-event-listener': [2], + 'unicorn/no-keyword-prefix': [0], + 'unicorn/no-length-as-slice-end': [2], + 'unicorn/no-lonely-if': [2], + 'unicorn/no-magic-array-flat-depth': [0], + 'unicorn/no-named-default': [2], + 'unicorn/no-negated-condition': [0], + 'unicorn/no-negation-in-equality-check': [2], + 'unicorn/no-nested-ternary': [0], + 'unicorn/no-new-array': [0], + 'unicorn/no-new-buffer': [0], + 'unicorn/no-null': [0], + 'unicorn/no-object-as-default-parameter': [0], + 'unicorn/no-process-exit': [0], + 'unicorn/no-single-promise-in-promise-methods': [2], + 'unicorn/no-static-only-class': [2], + 'unicorn/no-thenable': [2], + 'unicorn/no-this-assignment': [2], + 'unicorn/no-typeof-undefined': [2], + 'unicorn/no-unnecessary-await': [2], + 'unicorn/no-unnecessary-polyfills': [2], + 'unicorn/no-unreadable-array-destructuring': [0], + 'unicorn/no-unreadable-iife': [2], + 'unicorn/no-unused-properties': [2], + 'unicorn/no-useless-fallback-in-spread': [2], + 'unicorn/no-useless-length-check': [2], + 'unicorn/no-useless-promise-resolve-reject': [2], + 'unicorn/no-useless-spread': [2], + 'unicorn/no-useless-switch-case': [2], + 'unicorn/no-useless-undefined': [0], + 'unicorn/no-zero-fractions': [2], + 'unicorn/number-literal-case': [0], + 'unicorn/numeric-separators-style': [0], + 'unicorn/prefer-add-event-listener': [2], + 'unicorn/prefer-array-find': [2], + 'unicorn/prefer-array-flat-map': [2], + 'unicorn/prefer-array-flat': [2], + 'unicorn/prefer-array-index-of': [2], + 'unicorn/prefer-array-some': [2], + 'unicorn/prefer-at': [0], + 'unicorn/prefer-blob-reading-methods': [2], + 'unicorn/prefer-code-point': [0], + 'unicorn/prefer-date-now': [2], + 'unicorn/prefer-default-parameters': [0], + 'unicorn/prefer-dom-node-append': [2], + 'unicorn/prefer-dom-node-dataset': [0], + 'unicorn/prefer-dom-node-remove': [2], + 'unicorn/prefer-dom-node-text-content': [2], + 'unicorn/prefer-event-target': [2], + 'unicorn/prefer-export-from': [0], + 'unicorn/prefer-global-this': [0], + 'unicorn/prefer-includes': [2], + 'unicorn/prefer-json-parse-buffer': [0], + 'unicorn/prefer-keyboard-event-key': [2], + 'unicorn/prefer-logical-operator-over-ternary': [2], + 'unicorn/prefer-math-min-max': [2], + 'unicorn/prefer-math-trunc': [2], + 'unicorn/prefer-modern-dom-apis': [0], + 'unicorn/prefer-modern-math-apis': [2], + 'unicorn/prefer-module': [2], + 'unicorn/prefer-native-coercion-functions': [2], + 'unicorn/prefer-negative-index': [2], + 'unicorn/prefer-node-protocol': [2], + 'unicorn/prefer-number-properties': [0], + 'unicorn/prefer-object-from-entries': [2], + 'unicorn/prefer-object-has-own': [0], + 'unicorn/prefer-optional-catch-binding': [2], + 'unicorn/prefer-prototype-methods': [0], + 'unicorn/prefer-query-selector': [0], + 'unicorn/prefer-reflect-apply': [0], + 'unicorn/prefer-regexp-test': [2], + 'unicorn/prefer-set-has': [0], + 'unicorn/prefer-set-size': [2], + 'unicorn/prefer-spread': [0], + 'unicorn/prefer-string-raw': [0], + 'unicorn/prefer-string-replace-all': [0], + 'unicorn/prefer-string-slice': [0], + 'unicorn/prefer-string-starts-ends-with': [2], + 'unicorn/prefer-string-trim-start-end': [2], + 'unicorn/prefer-structured-clone': [2], + 'unicorn/prefer-switch': [0], + 'unicorn/prefer-ternary': [0], + 'unicorn/prefer-top-level-await': [0], + 'unicorn/prefer-type-error': [0], + 'unicorn/prevent-abbreviations': [0], + 'unicorn/relative-url-style': [2], + 'unicorn/require-array-join-separator': [2], + 'unicorn/require-number-to-fixed-digits-argument': [2], + 'unicorn/require-post-message-target-origin': [0], + 'unicorn/string-content': [0], + 'unicorn/switch-case-braces': [0], + 'unicorn/template-indent': [2], + 'unicorn/text-encoding-identifier-case': [0], + 'unicorn/throw-new-error': [2], + 'use-isnan': [2], + + 'valid-typeof': [2, { + requireStringLiterals: true, + }], + + 'vars-on-top': [0], + 'wc/attach-shadow-constructor': [2], + 'wc/define-tag-after-class-definition': [0], + 'wc/expose-class-on-global': [0], + 'wc/file-name-matches-element': [2], + 'wc/guard-define-call': [0], + 'wc/guard-super-call': [2], + 'wc/max-elements-per-file': [0], + 'wc/no-child-traversal-in-attributechangedcallback': [2], + 'wc/no-child-traversal-in-connectedcallback': [2], + 'wc/no-closed-shadow-root': [2], + 'wc/no-constructor-attributes': [2], + 'wc/no-constructor-params': [2], + 'wc/no-constructor': [2], + 'wc/no-customized-built-in-elements': [2], + 'wc/no-exports-with-element': [0], + 'wc/no-invalid-element-name': [2], + 'wc/no-invalid-extends': [2], + 'wc/no-method-prefixed-with-on': [2], + 'wc/no-self-class': [2], + 'wc/no-typos': [2], + 'wc/require-listener-teardown': [2], + 'wc/tag-name-matches-class': [2], + yoda: [2, 'never'], + }, + }, + { + ignores: ['*.vue', '**/*.vue'], + rules: { + 'import-x/consistent-type-specifier-style': [0], + 'import-x/default': [0], + 'import-x/dynamic-import-chunkname': [0], + 'import-x/export': [2], + 'import-x/exports-last': [0], + + 'import-x/extensions': [2, 'always', { + ignorePackages: true, + }], + + 'import-x/first': [2], + 'import-x/group-exports': [0], + 'import-x/max-dependencies': [0], + 'import-x/named': [2], + 'import-x/namespace': [0], + 'import-x/newline-after-import': [0], + 'import-x/no-absolute-path': [0], + 'import-x/no-amd': [2], + 'import-x/no-anonymous-default-export': [0], + 'import-x/no-commonjs': [2], + + 'import-x/no-cycle': [2, { + ignoreExternal: true, + maxDepth: 1, + }], + + 'import-x/no-default-export': [0], + 'import-x/no-deprecated': [0], + 'import-x/no-dynamic-require': [0], + 'import-x/no-empty-named-blocks': [2], + 'import-x/no-extraneous-dependencies': [2], + 'import-x/no-import-module-exports': [0], + 'import-x/no-internal-modules': [0], + 'import-x/no-mutable-exports': [0], + 'import-x/no-named-as-default-member': [0], + 'import-x/no-named-as-default': [2], + 'import-x/no-named-default': [0], + 'import-x/no-named-export': [0], + 'import-x/no-namespace': [0], + 'import-x/no-nodejs-modules': [0], + 'import-x/no-relative-packages': [0], + 'import-x/no-relative-parent-imports': [0], + 'import-x/no-restricted-paths': [0], + 'import-x/no-self-import': [2], + 'import-x/no-unassigned-import': [0], + + 'import-x/no-unresolved': [2, { + commonjs: true, + ignore: ['\\?.+$', '^vitest/'], + }], + + 'import-x/no-useless-path-segments': [2, { + commonjs: true, + }], + + 'import-x/no-webpack-loader-syntax': [2], + 'import-x/order': [0], + 'import-x/prefer-default-export': [0], + 'import-x/unambiguous': [0], + }, + }, + { + files: ['web_src/**/*'], + languageOptions: { + globals: { + __webpack_public_path__: true, + process: false, + }, + }, + }, { + files: ['web_src/**/*', 'docs/**/*'], + + languageOptions: { + globals: { + ...globals.browser, + }, + }, + }, { + files: ['web_src/**/*worker.*'], + + languageOptions: { + globals: { + ...globals.worker, + }, + }, + + rules: { + 'no-restricted-globals': [ + 2, + 'addEventListener', + 'blur', + 'close', + 'closed', + 'confirm', + 'defaultStatus', + 'defaultstatus', + 'error', + 'event', + 'external', + 'find', + 'focus', + 'frameElement', + 'frames', + 'history', + 'innerHeight', + 'innerWidth', + 'isFinite', + 'isNaN', + 'length', + 'locationbar', + 'menubar', + 'moveBy', + 'moveTo', + 'name', + 'onblur', + 'onerror', + 'onfocus', + 'onload', + 'onresize', + 'onunload', + 'open', + 'opener', + 'opera', + 'outerHeight', + 'outerWidth', + 'pageXOffset', + 'pageYOffset', + 'parent', + 'print', + 'removeEventListener', + 'resizeBy', + 'resizeTo', + 'screen', + 'screenLeft', + 'screenTop', + 'screenX', + 'screenY', + 'scroll', + 'scrollbars', + 'scrollBy', + 'scrollTo', + 'scrollX', + 'scrollY', + 'status', + 'statusbar', + 'stop', + 'toolbar', + 'top', + ], + }, + }, { + files: ['**/*.config.*'], + languageOptions: { + ecmaVersion: 'latest', + }, + rules: { + 'import-x/no-unused-modules': [0], + 'import-x/no-unresolved': [0], + 'import-x/no-named-as-default': [0], + }, + }, { + files: ['**/*.test.*', 'web_src/js/test/setup.js'], + languageOptions: { + globals: { + ...vitestGlobals.environments.env.globals, + }, + }, + + rules: { + '@vitest/consistent-test-filename': [0], + '@vitest/consistent-test-it': [0], + '@vitest/expect-expect': [0], + '@vitest/max-expects': [0], + '@vitest/max-nested-describe': [0], + '@vitest/no-alias-methods': [0], + '@vitest/no-commented-out-tests': [0], + '@vitest/no-conditional-expect': [0], + '@vitest/no-conditional-in-test': [0], + '@vitest/no-conditional-tests': [0], + '@vitest/no-disabled-tests': [0], + '@vitest/no-done-callback': [0], + '@vitest/no-duplicate-hooks': [0], + '@vitest/no-focused-tests': [0], + '@vitest/no-hooks': [0], + '@vitest/no-identical-title': [2], + '@vitest/no-interpolation-in-snapshots': [0], + '@vitest/no-large-snapshots': [0], + '@vitest/no-mocks-import': [0], + '@vitest/no-restricted-matchers': [0], + '@vitest/no-restricted-vi-methods': [0], + '@vitest/no-standalone-expect': [0], + '@vitest/no-test-prefixes': [0], + '@vitest/no-test-return-statement': [0], + '@vitest/prefer-called-with': [0], + '@vitest/prefer-comparison-matcher': [0], + '@vitest/prefer-each': [0], + '@vitest/prefer-equality-matcher': [0], + '@vitest/prefer-expect-resolves': [0], + '@vitest/prefer-hooks-in-order': [0], + '@vitest/prefer-hooks-on-top': [2], + '@vitest/prefer-lowercase-title': [0], + '@vitest/prefer-mock-promise-shorthand': [0], + '@vitest/prefer-snapshot-hint': [0], + '@vitest/prefer-spy-on': [0], + '@vitest/prefer-strict-equal': [0], + '@vitest/prefer-to-be': [0], + '@vitest/prefer-to-be-falsy': [0], + '@vitest/prefer-to-be-object': [0], + '@vitest/prefer-to-be-truthy': [0], + '@vitest/prefer-to-contain': [0], + '@vitest/prefer-to-have-length': [0], + '@vitest/prefer-todo': [0], + '@vitest/require-hook': [0], + '@vitest/require-to-throw-message': [0], + '@vitest/require-top-level-describe': [0], + '@vitest/valid-describe-callback': [2], + '@vitest/valid-expect': [2], + '@vitest/valid-title': [2], + }, + }, { + files: ['web_src/js/modules/fetch.js', 'web_src/js/standalone/**/*'], + + rules: { + 'no-restricted-syntax': [ + 2, + 'WithStatement', + 'ForInStatement', + 'LabeledStatement', + 'SequenceExpression', + ], + }, + }, { + files: ['tests/e2e/**/*.ts'], + languageOptions: { + globals: { + ...globals.browser, + }, + + ecmaVersion: 'latest', + sourceType: 'module', + }, + rules: { + ...playwright.configs['flat/recommended'].rules, + 'playwright/no-conditional-in-test': [0], + 'playwright/no-conditional-expect': [0], + // allow grouping helper functions with tests + 'unicorn/consistent-function-scoping': [0], + + 'playwright/no-skipped-test': [ + 2, + { + allowConditional: true, + }, + ], + 'playwright/no-useless-await': [2], + + 'playwright/prefer-comparison-matcher': [2], + 'playwright/prefer-equality-matcher': [2], + 'playwright/prefer-native-locators': [2], + 'playwright/prefer-to-contain': [2], + 'playwright/prefer-to-have-length': [2], + 'playwright/require-to-throw-message': [2], + }, + }, + ...vue.configs['flat/recommended'], + { + files: ['web_src/js/components/*.vue'], + languageOptions: { + globals: { + ...globals.browser, + }, + + ecmaVersion: 'latest', + sourceType: 'module', + }, + rules: { + 'vue/attributes-order': [0], + 'vue/html-closing-bracket-spacing': [2, { + startTag: 'never', + endTag: 'never', + selfClosingTag: 'never', + }], + 'vue/max-attributes-per-line': [0], + 'vue-scoped-css/enforce-style-type': [0], + }, + }, + ...toml.configs['flat/recommended'], +); diff --git a/flake.lock b/flake.lock index 9eadad2b94..90672733d5 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1710146030, - "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", "owner": "numtide", "repo": "flake-utils", - "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", "type": "github" }, "original": { @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1720542800, - "narHash": "sha256-ZgnNHuKV6h2+fQ5LuqnUaqZey1Lqqt5dTUAiAnqH0QQ=", + "lastModified": 1733392399, + "narHash": "sha256-kEsTJTUQfQFIJOcLYFt/RvNxIK653ZkTBIs4DG+cBns=", "owner": "nixos", "repo": "nixpkgs", - "rev": "feb2849fdeb70028c70d73b848214b00d324a497", + "rev": "d0797a04b81caeae77bcff10a9dde78bc17f5661", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index e2f273e341..9f858541df 100644 --- a/flake.nix +++ b/flake.nix @@ -3,14 +3,15 @@ nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; }; - outputs = - { nixpkgs, flake-utils, ... }: + outputs = { + nixpkgs, + flake-utils, + ... + }: flake-utils.lib.eachDefaultSystem ( - system: - let + system: let pkgs = nixpkgs.legacyPackages.${system}; - in - { + in { devShells.default = pkgs.mkShell { buildInputs = with pkgs; [ # generic @@ -29,9 +30,10 @@ poetry # backend - go_1_22 gofumpt sqlite + go + gopls ]; }; } diff --git a/go.mod b/go.mod index 3f7bb9d7ce..cbeed64369 100644 --- a/go.mod +++ b/go.mod @@ -1,115 +1,113 @@ -module code.gitea.io/gitea +module forgejo.org -go 1.23.1 +go 1.24 + +toolchain go1.24.3 require ( - code.forgejo.org/f3/gof3/v3 v3.7.0 + code.forgejo.org/f3/gof3/v3 v3.10.6 code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251 + code.forgejo.org/forgejo/levelqueue v1.0.0 code.forgejo.org/forgejo/reply v1.0.2 - code.forgejo.org/go-chi/cache v0.0.0-20240912103640-dcb08fba860d - code.forgejo.org/go-chi/captcha v0.0.0-20240905153133-df43b9250ed5 - code.forgejo.org/go-chi/session v0.0.0-20240905153124-557e3de77cd2 + code.forgejo.org/go-chi/binding v1.0.0 + code.forgejo.org/go-chi/cache v1.0.0 + code.forgejo.org/go-chi/captcha v1.0.1 + code.forgejo.org/go-chi/session v1.0.1 code.gitea.io/actions-proto-go v0.4.0 - code.gitea.io/gitea-vet v0.2.3 - code.gitea.io/sdk/gitea v0.17.1 + code.gitea.io/sdk/gitea v0.20.0 codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570 connectrpc.com/connect v1.17.0 - gitea.com/go-chi/binding v0.0.0-20240430071103-39a851e106ed - gitea.com/lunny/levelqueue v0.4.2-0.20230414023320-3c0159fe0fe4 + github.com/42wim/httpsig v1.2.2 github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121 github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 - github.com/ProtonMail/go-crypto v1.0.0 - github.com/PuerkitoBio/goquery v1.10.0 + github.com/ProtonMail/go-crypto v1.1.6 + github.com/PuerkitoBio/goquery v1.10.2 github.com/SaveTheRbtz/zstd-seekable-format-go/pkg v0.7.2 - github.com/alecthomas/chroma/v2 v2.14.0 + github.com/alecthomas/chroma/v2 v2.15.0 github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb - github.com/blevesearch/bleve/v2 v2.4.2 - github.com/buildkite/terminal-to-html/v3 v3.16.2 - github.com/caddyserver/certmagic v0.21.0 + github.com/blevesearch/bleve/v2 v2.5.2 + github.com/buildkite/terminal-to-html/v3 v3.16.8 + github.com/caddyserver/certmagic v0.22.2 github.com/chi-middleware/proxy v1.1.1 github.com/djherbis/buffer v1.2.0 github.com/djherbis/nio/v3 v3.0.1 github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 github.com/dustin/go-humanize v1.0.1 - github.com/editorconfig/editorconfig-core-go/v2 v2.6.2 + github.com/editorconfig/editorconfig-core-go/v2 v2.6.3 github.com/emersion/go-imap v1.2.1 github.com/felixge/fgprof v0.9.5 - github.com/fsnotify/fsnotify v1.7.0 - github.com/gliderlabs/ssh v0.3.7 + github.com/fsnotify/fsnotify v1.8.0 + github.com/gliderlabs/ssh v0.3.8 github.com/go-ap/activitypub v0.0.0-20231114162308-e219254dc5c9 github.com/go-ap/jsonld v0.0.0-20221030091449-f2a191312c73 - github.com/go-chi/chi/v5 v5.1.0 + github.com/go-chi/chi/v5 v5.2.0 github.com/go-chi/cors v1.2.1 github.com/go-co-op/gocron v1.37.0 - github.com/go-enry/go-enry/v2 v2.8.9 - github.com/go-fed/httpsig v1.1.1-0.20201223112313-55836744818e - github.com/go-git/go-git/v5 v5.11.0 + github.com/go-enry/go-enry/v2 v2.9.2 + github.com/go-git/go-git/v5 v5.13.2 github.com/go-ldap/ldap/v3 v3.4.6 - github.com/go-sql-driver/mysql v1.8.1 - github.com/go-swagger/go-swagger v0.30.5 - github.com/go-testfixtures/testfixtures/v3 v3.12.0 - github.com/go-webauthn/webauthn v0.11.2 + github.com/go-openapi/spec v0.20.14 + github.com/go-sql-driver/mysql v1.9.1 + github.com/go-webauthn/webauthn v0.12.2 github.com/gobwas/glob v0.2.3 github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85 - github.com/golang-jwt/jwt/v5 v5.2.1 + github.com/golang-jwt/jwt/v5 v5.2.2 + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 github.com/google/go-github/v64 v64.0.0 - github.com/google/pprof v0.0.0-20240528025155-186aa0362fba + github.com/google/pprof v0.0.0-20241017200806-017d972448fc github.com/google/uuid v1.6.0 github.com/gorilla/feeds v1.2.0 - github.com/gorilla/sessions v1.2.2 - github.com/h2non/gock v1.2.0 - github.com/hashicorp/go-version v1.6.0 + github.com/gorilla/sessions v1.4.0 + github.com/hashicorp/go-version v1.7.0 github.com/hashicorp/golang-lru/v2 v2.0.7 github.com/huandu/xstrings v1.5.0 github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056 - github.com/jhillyerd/enmime v1.3.0 + github.com/jhillyerd/enmime/v2 v2.1.0 github.com/json-iterator/go v1.1.12 github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 - github.com/klauspost/compress v1.17.9 - github.com/klauspost/cpuid/v2 v2.2.8 + github.com/klauspost/compress v1.17.11 + github.com/klauspost/cpuid/v2 v2.2.10 github.com/lib/pq v1.10.9 github.com/markbates/goth v1.80.0 github.com/mattn/go-isatty v0.0.20 - github.com/mattn/go-sqlite3 v1.14.22 - github.com/meilisearch/meilisearch-go v0.28.0 + github.com/mattn/go-sqlite3 v1.14.28 + github.com/meilisearch/meilisearch-go v0.31.0 github.com/mholt/archiver/v3 v3.5.1 github.com/microcosm-cc/bluemonday v1.0.27 - github.com/minio/minio-go/v7 v7.0.74 - github.com/msteinert/pam v1.2.0 + github.com/minio/minio-go/v7 v7.0.88 + github.com/msteinert/pam/v2 v2.1.0 github.com/nektos/act v0.2.52 github.com/niklasfasching/go-org v1.7.0 github.com/olivere/elastic/v7 v7.0.32 github.com/opencontainers/go-digest v1.0.0 - github.com/opencontainers/image-spec v1.1.0 + github.com/opencontainers/image-spec v1.1.1 github.com/pquerna/otp v1.4.0 - github.com/prometheus/client_golang v1.18.0 - github.com/quasoft/websspi v1.1.2 - github.com/redis/go-redis/v9 v9.6.1 + github.com/prometheus/client_golang v1.21.1 + github.com/redis/go-redis/v9 v9.7.3 github.com/robfig/cron/v3 v3.0.1 github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 github.com/sassoftware/go-rpmutils v0.4.0 - github.com/sergi/go-diff v1.3.1 + github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 github.com/shurcooL/vfsgen v0.0.0-20230704071429-0000e147ea92 - github.com/stretchr/testify v1.9.0 + github.com/stretchr/testify v1.10.0 github.com/syndtr/goleveldb v1.0.0 github.com/ulikunitz/xz v0.5.12 - github.com/urfave/cli/v2 v2.27.4 + github.com/urfave/cli/v2 v2.27.6 github.com/valyala/fastjson v1.6.4 - github.com/xanzy/go-gitlab v0.109.0 github.com/yohcop/openid-go v1.0.1 - github.com/yuin/goldmark v1.7.4 + github.com/yuin/goldmark v1.7.8 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc - go.uber.org/mock v0.4.0 - golang.org/x/crypto v0.27.0 - golang.org/x/image v0.20.0 - golang.org/x/net v0.29.0 - golang.org/x/oauth2 v0.23.0 - golang.org/x/sys v0.25.0 - golang.org/x/text v0.18.0 - golang.org/x/tools v0.25.0 - google.golang.org/grpc v1.66.2 - google.golang.org/protobuf v1.34.2 + gitlab.com/gitlab-org/api/client-go v0.126.0 + go.uber.org/mock v0.5.0 + golang.org/x/crypto v0.36.0 + golang.org/x/image v0.25.0 + golang.org/x/net v0.38.0 + golang.org/x/oauth2 v0.28.0 + golang.org/x/sync v0.12.0 + golang.org/x/sys v0.31.0 + golang.org/x/text v0.23.0 + google.golang.org/protobuf v1.36.4 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df gopkg.in/ini.v1 v1.67.0 gopkg.in/yaml.v3 v3.0.1 @@ -119,180 +117,141 @@ require ( ) require ( - cloud.google.com/go/compute/metadata v0.3.0 // indirect + cloud.google.com/go/compute/metadata v0.6.0 // indirect dario.cat/mergo v1.0.0 // indirect filippo.io/edwards25519 v1.1.0 // indirect git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078 // indirect - github.com/ClickHouse/ch-go v0.61.5 // indirect - github.com/ClickHouse/clickhouse-go/v2 v2.26.0 // indirect github.com/DataDog/zstd v1.5.5 // indirect - github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver/v3 v3.2.1 // indirect - github.com/Masterminds/sprig/v3 v3.2.3 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/RoaringBitmap/roaring v1.9.3 // indirect - github.com/andybalholm/brotli v1.1.0 // indirect - github.com/andybalholm/cascadia v1.3.2 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/RoaringBitmap/roaring/v2 v2.4.5 // indirect + github.com/andybalholm/brotli v1.1.1 // indirect + github.com/andybalholm/cascadia v1.3.3 // indirect github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect - github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/aymerick/douceur v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.13.0 // indirect - github.com/blevesearch/bleve_index_api v1.1.10 // indirect - github.com/blevesearch/geo v0.1.20 // indirect - github.com/blevesearch/go-faiss v1.0.20 // indirect + github.com/bits-and-blooms/bitset v1.22.0 // indirect + github.com/blevesearch/bleve_index_api v1.2.8 // indirect + github.com/blevesearch/geo v0.2.3 // indirect + github.com/blevesearch/go-faiss v1.0.25 // indirect github.com/blevesearch/go-porterstemmer v1.0.3 // indirect github.com/blevesearch/gtreap v0.1.1 // indirect github.com/blevesearch/mmap-go v1.0.4 // indirect - github.com/blevesearch/scorch_segment_api/v2 v2.2.15 // indirect + github.com/blevesearch/scorch_segment_api/v2 v2.3.10 // indirect github.com/blevesearch/segment v0.9.1 // indirect github.com/blevesearch/snowballstem v0.9.0 // indirect github.com/blevesearch/upsidedown_store_api v1.0.2 // indirect - github.com/blevesearch/vellum v1.0.10 // indirect - github.com/blevesearch/zapx/v11 v11.3.10 // indirect - github.com/blevesearch/zapx/v12 v12.3.10 // indirect - github.com/blevesearch/zapx/v13 v13.3.10 // indirect - github.com/blevesearch/zapx/v14 v14.3.10 // indirect - github.com/blevesearch/zapx/v15 v15.3.13 // indirect - github.com/blevesearch/zapx/v16 v16.1.5 // indirect + github.com/blevesearch/vellum v1.1.0 // indirect + github.com/blevesearch/zapx/v11 v11.4.2 // indirect + github.com/blevesearch/zapx/v12 v12.4.2 // indirect + github.com/blevesearch/zapx/v13 v13.4.2 // indirect + github.com/blevesearch/zapx/v14 v14.4.2 // indirect + github.com/blevesearch/zapx/v15 v15.4.2 // indirect + github.com/blevesearch/zapx/v16 v16.2.4 // indirect github.com/boombuler/barcode v1.0.1 // indirect github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874 // indirect - github.com/caddyserver/zerossl v0.1.2 // indirect + github.com/caddyserver/zerossl v0.1.3 // indirect github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cloudflare/circl v1.3.8 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect - github.com/cyphar/filepath-securejoin v0.2.4 // indirect + github.com/cloudflare/circl v1.6.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect + github.com/cyphar/filepath-securejoin v0.3.6 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/davidmz/go-pageant v1.0.2 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/dlclark/regexp2 v1.11.0 // indirect + github.com/dlclark/regexp2 v1.11.4 // indirect github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/fatih/color v1.16.0 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/fxamacker/cbor/v2 v2.8.0 // indirect github.com/go-ap/errors v0.0.0-20231003111023-183eef4b31b7 // indirect github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect github.com/go-enry/go-oniguruma v1.2.1 // indirect - github.com/go-faster/city v1.0.1 // indirect - github.com/go-faster/errors v0.7.1 // indirect + github.com/go-fed/httpsig v1.1.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.5.0 // indirect + github.com/go-git/go-billy/v5 v5.6.2 // indirect github.com/go-ini/ini v1.67.0 // indirect - github.com/go-openapi/analysis v0.22.2 // indirect - github.com/go-openapi/errors v0.21.0 // indirect - github.com/go-openapi/inflect v0.19.0 // indirect github.com/go-openapi/jsonpointer v0.20.2 // indirect github.com/go-openapi/jsonreference v0.20.4 // indirect - github.com/go-openapi/loads v0.21.5 // indirect - github.com/go-openapi/runtime v0.26.2 // indirect - github.com/go-openapi/spec v0.20.14 // indirect - github.com/go-openapi/strfmt v0.22.0 // indirect github.com/go-openapi/swag v0.22.7 // indirect - github.com/go-openapi/validate v0.22.6 // indirect - github.com/go-webauthn/x v0.1.14 // indirect - github.com/goccy/go-json v0.10.3 // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/geo v0.0.0-20230421003525-6adc56603217 // indirect + github.com/go-webauthn/x v0.1.20 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/golang-jwt/jwt/v4 v4.5.1 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.1.2 // indirect - github.com/google/go-cmp v0.6.0 // indirect + github.com/google/go-cmp v0.7.0 // indirect github.com/google/go-querystring v1.1.0 // indirect - github.com/google/go-tpm v0.9.1 // indirect + github.com/google/go-tpm v0.9.3 // indirect github.com/gorilla/css v1.0.1 // indirect - github.com/gorilla/handlers v1.5.2 // indirect github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/securecookie v1.1.2 // indirect - github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-retryablehttp v0.7.7 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/imdario/mergo v0.3.16 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect - github.com/jessevdk/go-flags v1.5.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/klauspost/pgzip v1.2.6 // indirect - github.com/kr/pretty v0.3.1 // indirect - github.com/kr/text v0.2.0 // indirect - github.com/libdns/libdns v0.2.2 // indirect - github.com/magiconair/properties v1.8.7 // indirect - github.com/mailru/easyjson v0.7.7 // indirect + github.com/libdns/libdns v0.2.3 // indirect + github.com/mailru/easyjson v0.9.0 // indirect github.com/markbates/going v1.0.3 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/mholt/acmez/v2 v2.0.1 // indirect - github.com/miekg/dns v1.1.59 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mholt/acmez/v3 v3.1.1 // indirect + github.com/miekg/dns v1.1.63 // indirect + github.com/minio/crc64nvme v1.0.1 // indirect github.com/minio/md5-simd v1.1.2 // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mrjones/oauth v0.0.0-20190623134757-126b35219450 // indirect github.com/mschoch/smat v0.2.0 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nwaples/rardecode v1.1.3 // indirect - github.com/oklog/ulid v1.3.1 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/onsi/ginkgo v1.16.5 // indirect - github.com/paulmach/orb v0.11.1 // indirect - github.com/pelletier/go-toml/v2 v2.1.1 // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect - github.com/pjbgf/sha1cd v0.3.0 // indirect + github.com/pjbgf/sha1cd v0.3.2 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_model v0.5.0 // indirect - github.com/prometheus/common v0.46.0 // indirect - github.com/prometheus/procfs v0.12.0 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.62.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect github.com/rhysd/actionlint v1.6.27 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/rogpeppe/go-internal v1.12.0 // indirect - github.com/rs/xid v1.5.0 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect + github.com/rs/xid v1.6.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sagikazarmark/locafero v0.4.0 // indirect - github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/segmentio/asm v1.2.0 // indirect - github.com/shopspring/decimal v1.4.0 // indirect github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect github.com/sirupsen/logrus v1.9.3 // indirect - github.com/skeema/knownhosts v1.2.1 // indirect - github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.11.0 // indirect - github.com/spf13/cast v1.6.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.18.2 // indirect + github.com/skeema/knownhosts v1.3.0 // indirect github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect - github.com/subosito/gotenv v1.6.0 // indirect - github.com/toqueteos/webbrowser v1.2.0 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect - github.com/zeebo/blake3 v0.2.3 // indirect - go.etcd.io/bbolt v1.3.9 // indirect - go.mongodb.org/mongo-driver v1.13.1 // indirect - go.opentelemetry.io/otel v1.26.0 // indirect - go.opentelemetry.io/otel/trace v1.26.0 // indirect + github.com/zeebo/assert v1.3.0 // indirect + github.com/zeebo/blake3 v0.2.4 // indirect + go.etcd.io/bbolt v1.4.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/exp v0.0.0-20240119083558-1b970713d09a // indirect - golang.org/x/mod v0.21.0 // indirect - golang.org/x/sync v0.8.0 // indirect - golang.org/x/time v0.5.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect + go.uber.org/zap/exp v0.3.0 // indirect + golang.org/x/mod v0.24.0 // indirect + golang.org/x/time v0.10.0 // indirect + golang.org/x/tools v0.31.0 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/warnings.v0 v0.1.2 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect ) replace github.com/hashicorp/go-version => github.com/6543/go-version v1.3.1 replace github.com/shurcooL/vfsgen => github.com/lunny/vfsgen v0.0.0-20220105142115-2c99e1ffdfa0 -replace github.com/nektos/act => code.forgejo.org/forgejo/act v1.21.3 +replace github.com/nektos/act => code.forgejo.org/forgejo/act v1.25.1 replace github.com/mholt/archiver/v3 => code.forgejo.org/forgejo/archiver/v3 v3.5.1 + +replace github.com/gliderlabs/ssh => code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616 + +replace git.sr.ht/~mariusor/go-xsd-duration => code.forgejo.org/forgejo/go-xsd-duration v0.0.0-20220703122237-02e73435a078 diff --git a/go.sum b/go.sum index a8f4ff066f..1a285735a0 100644 --- a/go.sum +++ b/go.sum @@ -1,27 +1,33 @@ -cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= -cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -code.forgejo.org/f3/gof3/v3 v3.7.0 h1:ZfuCP8CGm8ZJbWmL+V0pUu3E0X4FCAA7GfRDy/y5/K4= -code.forgejo.org/f3/gof3/v3 v3.7.0/go.mod h1:oNhOeqD4DZYjVcNjQXIOdDX9b/1tqxi9ITLS8H9/Csw= +cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= +cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= +code.forgejo.org/f3/gof3/v3 v3.10.6 h1:Ru/Iz+pqM8IPi7atUHE7+q7v3O3DRbYgMFqrFTsO1m8= +code.forgejo.org/f3/gof3/v3 v3.10.6/go.mod h1:K6lQCWQIyN/5rjP/OJL9fMA6fd++satndE20w/I6Kss= code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251 h1:HTZl3CBk3ABNYtFI6TPLvJgGKFIhKT5CBk0sbOtkDKU= code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251/go.mod h1:PphB88CPbx601QrWPMZATeorACeVmQlyv3u+uUMbSaM= -code.forgejo.org/forgejo/act v1.21.3 h1:EeJbrz0aar2QhIcBlOW5gjK1rjrQxcAvQSPpG/R1h5w= -code.forgejo.org/forgejo/act v1.21.3/go.mod h1:+PcvJ9iv+NTFeJSh79ra9Jbk9l0vvyA9D9me5/dbxYM= +code.forgejo.org/forgejo/act v1.25.1 h1:T0CsN9iEWIyJzIbmMHMM9pl1KHzmI41q8mtepqVqdCc= +code.forgejo.org/forgejo/act v1.25.1/go.mod h1:tSg5CAHnXp4WLNkMa2e9AEDSujMxKzNM4bF2pvvRCYQ= code.forgejo.org/forgejo/archiver/v3 v3.5.1 h1:UmmbA7D5550uf71SQjarmrn6yKwOGxtEjb3jaYYtmSE= code.forgejo.org/forgejo/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4= +code.forgejo.org/forgejo/go-xsd-duration v0.0.0-20220703122237-02e73435a078 h1:RArF5AsF9LH4nEoJxqRxcP5r8hhRfWcId84G82YbqzA= +code.forgejo.org/forgejo/go-xsd-duration v0.0.0-20220703122237-02e73435a078/go.mod h1:g/V2Hjas6Z1UHUp4yIx6bATpNzJ7DYtD0FG3+xARWxs= +code.forgejo.org/forgejo/levelqueue v1.0.0 h1:9krYpU6BM+j/1Ntj6m+VCAIu0UNnne1/UfU/XgPpLuE= +code.forgejo.org/forgejo/levelqueue v1.0.0/go.mod h1:fmG6zhVuqim2rxSFOoasgXO8V2W/k9U31VVYqLIRLhQ= code.forgejo.org/forgejo/reply v1.0.2 h1:dMhQCHV6/O3L5CLWNTol+dNzDAuyCK88z4J/lCdgFuQ= code.forgejo.org/forgejo/reply v1.0.2/go.mod h1:RyZUfzQLc+fuLIGjTSQWDAJWPiL4WtKXB/FifT5fM7U= -code.forgejo.org/go-chi/cache v0.0.0-20240912103640-dcb08fba860d h1:nOu/2GX571t4intmtfvpctS148OqsBYrGUySVm93ifc= -code.forgejo.org/go-chi/cache v0.0.0-20240912103640-dcb08fba860d/go.mod h1:OVlZ/TqDYJ+RUJ+R+J+OLxtlyjo3pbjBeK7LAWAB+Vk= -code.forgejo.org/go-chi/captcha v0.0.0-20240905153133-df43b9250ed5 h1:A7P1liXCpJBHEJ5KIDsF0ujnQ8FQ/aX1UixTW0vGrDQ= -code.forgejo.org/go-chi/captcha v0.0.0-20240905153133-df43b9250ed5/go.mod h1:YLOsiln/arX3egGtxG4QNp49G2CIqP9pqD2VL56obLc= -code.forgejo.org/go-chi/session v0.0.0-20240905153124-557e3de77cd2 h1:Ht2myT1qf4YbLcO/W3pQaWTn6PPdKz0tM5tnqMOz/Cg= -code.forgejo.org/go-chi/session v0.0.0-20240905153124-557e3de77cd2/go.mod h1:oJs2Q5P5I7bzJGsgHt6fVzh2jlIr/9SLAvz/ZXb87BI= +code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616 h1:kEZL84+02jY9RxXM4zHBWZ3Fml0B09cmP1LGkDsCfIA= +code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= +code.forgejo.org/go-chi/binding v1.0.0 h1:EIDJtk9brK7WsT7rvS/D4cxX8XlnhY3LMy8ex1jeHu0= +code.forgejo.org/go-chi/binding v1.0.0/go.mod h1:fWwqaHj0H1/KeCpBqdvKunflq8pYfciEHI5v3UUeE2E= +code.forgejo.org/go-chi/cache v1.0.0 h1:akLfGxNlHcacmtutovNtYFSTMsbdcp5MGjAEsP4pxnE= +code.forgejo.org/go-chi/cache v1.0.0/go.mod h1:OVlZ/TqDYJ+RUJ+R+J+OLxtlyjo3pbjBeK7LAWAB+Vk= +code.forgejo.org/go-chi/captcha v1.0.1 h1:/oe1fvGOpdyyeGijg3oMYNOYLvEovNvp79Y3gLe3qbk= +code.forgejo.org/go-chi/captcha v1.0.1/go.mod h1:6EbjSVVa7WoZFENgwK/hLAJZq+HBXtgRsjnIngILC8Y= +code.forgejo.org/go-chi/session v1.0.1 h1:RNkcJQZJBqlvJoIFXSth87b3kMFZLDBA18VcitD+Z0Y= +code.forgejo.org/go-chi/session v1.0.1/go.mod h1:y69sjS984wc7k4xyu77yNE5HKeSlBoQW8VSGdsK7RAs= code.gitea.io/actions-proto-go v0.4.0 h1:OsPBPhodXuQnsspG1sQ4eRE1PeoZyofd7+i73zCwnsU= code.gitea.io/actions-proto-go v0.4.0/go.mod h1:mn7Wkqz6JbnTOHQpot3yDeHx+O5C9EGhMEE+htvHBas= -code.gitea.io/gitea-vet v0.2.3 h1:gdFmm6WOTM65rE8FUBTRzeQZYzXePKSSB1+r574hWwI= -code.gitea.io/gitea-vet v0.2.3/go.mod h1:zcNbT/aJEmivCAhfmkHOlT645KNOf9W2KnkLgFjGGfE= -code.gitea.io/sdk/gitea v0.17.1 h1:3jCPOG2ojbl8AcfaUCRYLT5MUcBMFwS0OSK2mA5Zok8= -code.gitea.io/sdk/gitea v0.17.1/go.mod h1:aCnBqhHpoEWA180gMbaCtdX9Pl6BWBAuuP2miadoTNM= +code.gitea.io/sdk/gitea v0.20.0 h1:Zm/QDwwZK1awoM4AxdjeAQbxolzx2rIP8dDfmKu+KoU= +code.gitea.io/sdk/gitea v0.20.0/go.mod h1:faouBHC/zyx5wLgjmRKR62ydyvMzwWf3QnU0bH7Cw6U= codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570 h1:TXbikPqa7YRtfU9vS6QJBg77pUvbEb6StRdZO8t1bEY= codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570/go.mod h1:IIAjsijsd8q1isWX8MACefDEgTQslQ4stk2AeeTt3kM= connectrpc.com/connect v1.17.0 h1:W0ZqMhtVzn9Zhn2yATuUokDLO5N+gIuBWMOnsQrfmZk= @@ -30,110 +36,93 @@ dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078 h1:cliQ4HHsCo6xi2oWZYKWW4bly/Ory9FuTpFPRxj/mAg= -git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078/go.mod h1:g/V2Hjas6Z1UHUp4yIx6bATpNzJ7DYtD0FG3+xARWxs= -gitea.com/go-chi/binding v0.0.0-20240430071103-39a851e106ed h1:EZZBtilMLSZNWtHHcgq2mt6NSGhJSZBuduAlinMEmso= -gitea.com/go-chi/binding v0.0.0-20240430071103-39a851e106ed/go.mod h1:E3i3cgB04dDx0v3CytCgRTTn9Z/9x891aet3r456RVw= -gitea.com/lunny/levelqueue v0.4.2-0.20230414023320-3c0159fe0fe4 h1:IFT+hup2xejHqdhS7keYWioqfmxdnfblFDTGoOwcZ+o= -gitea.com/lunny/levelqueue v0.4.2-0.20230414023320-3c0159fe0fe4/go.mod h1:HBqmLbz56JWpfEGG0prskAV97ATNRoj5LDmPicD22hU= gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s= gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU= +github.com/42wim/httpsig v1.2.2 h1:ofAYoHUNs/MJOLqQ8hIxeyz2QxOz8qdSVvp3PX/oPgA= +github.com/42wim/httpsig v1.2.2/go.mod h1:P/UYo7ytNBFwc+dg35IubuAUIs8zj5zzFIgUCEl55WY= github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121 h1:r3qt8PCHnfjOv9PN3H+XXKmDA1dfFMIN1AislhlA/ps= github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121/go.mod h1:Ock8XgA7pvULhIaHGAk/cDnRfNrF9Jey81nPcc403iU= github.com/6543/go-version v1.3.1 h1:HvOp+Telns7HWJ2Xo/05YXQSB2bE0WmVgbHqwMPZT4U= github.com/6543/go-version v1.3.1/go.mod h1:oqFAHCwtLVUTLdhQmVZWYvaHXTdsbB4SY85at64SQEo= github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8= github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= -github.com/ClickHouse/ch-go v0.61.5 h1:zwR8QbYI0tsMiEcze/uIMK+Tz1D3XZXLdNrlaOpeEI4= -github.com/ClickHouse/ch-go v0.61.5/go.mod h1:s1LJW/F/LcFs5HJnuogFMta50kKDO0lf9zzfrbl0RQg= -github.com/ClickHouse/clickhouse-go/v2 v2.26.0 h1:j4/y6NYaCcFkJwN/TU700ebW+nmsIy34RmUAAcZKy9w= -github.com/ClickHouse/clickhouse-go/v2 v2.26.0/go.mod h1:iDTViXk2Fgvf1jn2dbJd1ys+fBkdD1UMRnXlwmhijhQ= github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= -github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= -github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= -github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= -github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= -github.com/PuerkitoBio/goquery v1.10.0 h1:6fiXdLuUvYs2OJSvNRqlNPoBm6YABE226xrbavY5Wv4= -github.com/PuerkitoBio/goquery v1.10.0/go.mod h1:TjZZl68Q3eGHNBA8CWaxAN7rOU1EbDz3CWuolcO5Yu4= -github.com/RoaringBitmap/roaring v1.9.3 h1:t4EbC5qQwnisr5PrP9nt0IRhRTb9gMUgQF4t4S2OByM= -github.com/RoaringBitmap/roaring v1.9.3/go.mod h1:6AXUsoIEzDTFFQCe1RbGA6uFONMhvejWj5rqITANK90= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNxpLfdw= +github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= +github.com/PuerkitoBio/goquery v1.10.2 h1:7fh2BdHcG6VFZsK7toXBT/Bh1z5Wmy8Q9MV9HqT2AM8= +github.com/PuerkitoBio/goquery v1.10.2/go.mod h1:0guWGjcLu9AYC7C1GHnpysHy056u9aEkUHwhdnePMCU= +github.com/RoaringBitmap/roaring/v2 v2.4.5 h1:uGrrMreGjvAtTBobc0g5IrW1D5ldxDQYe2JW2gggRdg= +github.com/RoaringBitmap/roaring/v2 v2.4.5/go.mod h1:FiJcsfkGje/nZBZgCu0ZxCPOKD/hVXDS2dXi7/eUFE0= github.com/SaveTheRbtz/zstd-seekable-format-go/pkg v0.7.2 h1:cSXom2MoKJ9KPPw29RoZtHvUETY4F4n/kXl8m9btnQ0= github.com/SaveTheRbtz/zstd-seekable-format-go/pkg v0.7.2/go.mod h1:JitQWJ8JuV4Y87l8VsHiiwhb3cgdyn68mX40s7NT6PA= -github.com/alecthomas/assert/v2 v2.7.0 h1:QtqSACNS3tF7oasA8CU6A6sXZSBDqnm7RfpLl9bZqbE= -github.com/alecthomas/assert/v2 v2.7.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= +github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= +github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs= -github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E= -github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I= +github.com/alecthomas/chroma/v2 v2.15.0 h1:LxXTQHFoYrstG2nnV9y2X5O94sOBzf0CIUpSTbpxvMc= +github.com/alecthomas/chroma/v2 v2.15.0/go.mod h1:gUhVLrPDXPtp/f+L1jo9xepo9gL4eLwRuGAunSZMkio= github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 h1:Kk6a4nehpJ3UuJRqlA3JxYxBZEqCeOmATOvrbT4p9RA= github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= -github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= -github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss= -github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= +github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM= +github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= -github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.12.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= -github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.22.0 h1:Tquv9S8+SGaS3EhyA+up3FXzmkhxPGjQQCkcs2uw7w4= +github.com/bits-and-blooms/bitset v1.22.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb h1:m935MPodAbYS46DG4pJSv7WO+VECIWUQ7OJYSoTrMh4= github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= -github.com/blevesearch/bleve/v2 v2.4.2 h1:NooYP1mb3c0StkiY9/xviiq2LGSaE8BQBCc/pirMx0U= -github.com/blevesearch/bleve/v2 v2.4.2/go.mod h1:ATNKj7Yl2oJv/lGuF4kx39bST2dveX6w0th2FFYLkc8= -github.com/blevesearch/bleve_index_api v1.1.10 h1:PDLFhVjrjQWr6jCuU7TwlmByQVCSEURADHdCqVS9+g0= -github.com/blevesearch/bleve_index_api v1.1.10/go.mod h1:PbcwjIcRmjhGbkS/lJCpfgVSMROV6TRubGGAODaK1W8= -github.com/blevesearch/geo v0.1.20 h1:paaSpu2Ewh/tn5DKn/FB5SzvH0EWupxHEIwbCk/QPqM= -github.com/blevesearch/geo v0.1.20/go.mod h1:DVG2QjwHNMFmjo+ZgzrIq2sfCh6rIHzy9d9d0B59I6w= -github.com/blevesearch/go-faiss v1.0.20 h1:AIkdTQFWuZ5LQmKQSebgMR4RynGNw8ZseJXaan5kvtI= -github.com/blevesearch/go-faiss v1.0.20/go.mod h1:jrxHrbl42X/RnDPI+wBoZU8joxxuRwedrxqswQ3xfU8= +github.com/blevesearch/bleve/v2 v2.5.2 h1:Ab0r0MODV2C5A6BEL87GqLBySqp/s9xFgceCju6BQk8= +github.com/blevesearch/bleve/v2 v2.5.2/go.mod h1:5Dj6dUQxZM6aqYT3eutTD/GpWKGFSsV8f7LDidFbwXo= +github.com/blevesearch/bleve_index_api v1.2.8 h1:Y98Pu5/MdlkRyLM0qDHostYo7i+Vv1cDNhqTeR4Sy6Y= +github.com/blevesearch/bleve_index_api v1.2.8/go.mod h1:rKQDl4u51uwafZxFrPD1R7xFOwKnzZW7s/LSeK4lgo0= +github.com/blevesearch/geo v0.2.3 h1:K9/vbGI9ehlXdxjxDRJtoAMt7zGAsMIzc6n8zWcwnhg= +github.com/blevesearch/geo v0.2.3/go.mod h1:K56Q33AzXt2YExVHGObtmRSFYZKYGv0JEN5mdacJJR8= +github.com/blevesearch/go-faiss v1.0.25 h1:lel1rkOUGbT1CJ0YgzKwC7k+XH0XVBHnCVWahdCXk4U= +github.com/blevesearch/go-faiss v1.0.25/go.mod h1:OMGQwOaRRYxrmeNdMrXJPvVx8gBnvE5RYrr0BahNnkk= github.com/blevesearch/go-porterstemmer v1.0.3 h1:GtmsqID0aZdCSNiY8SkuPJ12pD4jI+DdXTAn4YRcHCo= github.com/blevesearch/go-porterstemmer v1.0.3/go.mod h1:angGc5Ht+k2xhJdZi511LtmxuEf0OVpvUUNrwmM1P7M= github.com/blevesearch/gtreap v0.1.1 h1:2JWigFrzDMR+42WGIN/V2p0cUvn4UP3C4Q5nmaZGW8Y= github.com/blevesearch/gtreap v0.1.1/go.mod h1:QaQyDRAT51sotthUWAH4Sj08awFSSWzgYICSZ3w0tYk= github.com/blevesearch/mmap-go v1.0.4 h1:OVhDhT5B/M1HNPpYPBKIEJaD0F3Si+CrEKULGCDPWmc= github.com/blevesearch/mmap-go v1.0.4/go.mod h1:EWmEAOmdAS9z/pi/+Toxu99DnsbhG1TIxUoRmJw/pSs= -github.com/blevesearch/scorch_segment_api/v2 v2.2.15 h1:prV17iU/o+A8FiZi9MXmqbagd8I0bCqM7OKUYPbnb5Y= -github.com/blevesearch/scorch_segment_api/v2 v2.2.15/go.mod h1:db0cmP03bPNadXrCDuVkKLV6ywFSiRgPFT1YVrestBc= +github.com/blevesearch/scorch_segment_api/v2 v2.3.10 h1:Yqk0XD1mE0fDZAJXTjawJ8If/85JxnLd8v5vG/jWE/s= +github.com/blevesearch/scorch_segment_api/v2 v2.3.10/go.mod h1:Z3e6ChN3qyN35yaQpl00MfI5s8AxUJbpTR/DL8QOQ+8= github.com/blevesearch/segment v0.9.1 h1:+dThDy+Lvgj5JMxhmOVlgFfkUtZV2kw49xax4+jTfSU= github.com/blevesearch/segment v0.9.1/go.mod h1:zN21iLm7+GnBHWTao9I+Au/7MBiL8pPFtJBJTsk6kQw= github.com/blevesearch/snowballstem v0.9.0 h1:lMQ189YspGP6sXvZQ4WZ+MLawfV8wOmPoD/iWeNXm8s= github.com/blevesearch/snowballstem v0.9.0/go.mod h1:PivSj3JMc8WuaFkTSRDW2SlrulNWPl4ABg1tC/hlgLs= github.com/blevesearch/upsidedown_store_api v1.0.2 h1:U53Q6YoWEARVLd1OYNc9kvhBMGZzVrdmaozG2MfoB+A= github.com/blevesearch/upsidedown_store_api v1.0.2/go.mod h1:M01mh3Gpfy56Ps/UXHjEO/knbqyQ1Oamg8If49gRwrQ= -github.com/blevesearch/vellum v1.0.10 h1:HGPJDT2bTva12hrHepVT3rOyIKFFF4t7Gf6yMxyMIPI= -github.com/blevesearch/vellum v1.0.10/go.mod h1:ul1oT0FhSMDIExNjIxHqJoGpVrBpKCdgDQNxfqgJt7k= -github.com/blevesearch/zapx/v11 v11.3.10 h1:hvjgj9tZ9DeIqBCxKhi70TtSZYMdcFn7gDb71Xo/fvk= -github.com/blevesearch/zapx/v11 v11.3.10/go.mod h1:0+gW+FaE48fNxoVtMY5ugtNHHof/PxCqh7CnhYdnMzQ= -github.com/blevesearch/zapx/v12 v12.3.10 h1:yHfj3vXLSYmmsBleJFROXuO08mS3L1qDCdDK81jDl8s= -github.com/blevesearch/zapx/v12 v12.3.10/go.mod h1:0yeZg6JhaGxITlsS5co73aqPtM04+ycnI6D1v0mhbCs= -github.com/blevesearch/zapx/v13 v13.3.10 h1:0KY9tuxg06rXxOZHg3DwPJBjniSlqEgVpxIqMGahDE8= -github.com/blevesearch/zapx/v13 v13.3.10/go.mod h1:w2wjSDQ/WBVeEIvP0fvMJZAzDwqwIEzVPnCPrz93yAk= -github.com/blevesearch/zapx/v14 v14.3.10 h1:SG6xlsL+W6YjhX5N3aEiL/2tcWh3DO75Bnz77pSwwKU= -github.com/blevesearch/zapx/v14 v14.3.10/go.mod h1:qqyuR0u230jN1yMmE4FIAuCxmahRQEOehF78m6oTgns= -github.com/blevesearch/zapx/v15 v15.3.13 h1:6EkfaZiPlAxqXz0neniq35my6S48QI94W/wyhnpDHHQ= -github.com/blevesearch/zapx/v15 v15.3.13/go.mod h1:Turk/TNRKj9es7ZpKK95PS7f6D44Y7fAFy8F4LXQtGg= -github.com/blevesearch/zapx/v16 v16.1.5 h1:b0sMcarqNFxuXvjoXsF8WtwVahnxyhEvBSRJi/AUHjU= -github.com/blevesearch/zapx/v16 v16.1.5/go.mod h1:J4mSF39w1QELc11EWRSBFkPeZuO7r/NPKkHzDCoiaI8= +github.com/blevesearch/vellum v1.1.0 h1:CinkGyIsgVlYf8Y2LUQHvdelgXr6PYuvoDIajq6yR9w= +github.com/blevesearch/vellum v1.1.0/go.mod h1:QgwWryE8ThtNPxtgWJof5ndPfx0/YMBh+W2weHKPw8Y= +github.com/blevesearch/zapx/v11 v11.4.2 h1:l46SV+b0gFN+Rw3wUI1YdMWdSAVhskYuvxlcgpQFljs= +github.com/blevesearch/zapx/v11 v11.4.2/go.mod h1:4gdeyy9oGa/lLa6D34R9daXNUvfMPZqUYjPwiLmekwc= +github.com/blevesearch/zapx/v12 v12.4.2 h1:fzRbhllQmEMUuAQ7zBuMvKRlcPA5ESTgWlDEoB9uQNE= +github.com/blevesearch/zapx/v12 v12.4.2/go.mod h1:TdFmr7afSz1hFh/SIBCCZvcLfzYvievIH6aEISCte58= +github.com/blevesearch/zapx/v13 v13.4.2 h1:46PIZCO/ZuKZYgxI8Y7lOJqX3Irkc3N8W82QTK3MVks= +github.com/blevesearch/zapx/v13 v13.4.2/go.mod h1:knK8z2NdQHlb5ot/uj8wuvOq5PhDGjNYQQy0QDnopZk= +github.com/blevesearch/zapx/v14 v14.4.2 h1:2SGHakVKd+TrtEqpfeq8X+So5PShQ5nW6GNxT7fWYz0= +github.com/blevesearch/zapx/v14 v14.4.2/go.mod h1:rz0XNb/OZSMjNorufDGSpFpjoFKhXmppH9Hi7a877D8= +github.com/blevesearch/zapx/v15 v15.4.2 h1:sWxpDE0QQOTjyxYbAVjt3+0ieu8NCE0fDRaFxEsp31k= +github.com/blevesearch/zapx/v15 v15.4.2/go.mod h1:1pssev/59FsuWcgSnTa0OeEpOzmhtmr/0/11H0Z8+Nw= +github.com/blevesearch/zapx/v16 v16.2.4 h1:tGgfvleXTAkwsD5mEzgM3zCS/7pgocTCnO1oyAUjlww= +github.com/blevesearch/zapx/v16 v16.2.4/go.mod h1:Rti/REtuuMmzwsI8/C/qIzRaEoSK/wiFYw5e5ctUKKs= github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= @@ -143,13 +132,12 @@ github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= -github.com/buildkite/terminal-to-html/v3 v3.16.2 h1:ueVE+BUqKOK3O4p+oul1y4Lo0sq7Qoj2Fb6/DJOrxYM= -github.com/buildkite/terminal-to-html/v3 v3.16.2/go.mod h1:tdi6+MA4AjV5udS5cm8PVxLHsbJWLGsr5W/tHFzPgbY= -github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/caddyserver/certmagic v0.21.0 h1:yDoifClc4hIxhHer3AxUj4buhF+NzRR6torw/AOnuUE= -github.com/caddyserver/certmagic v0.21.0/go.mod h1:OgUZNXYV/ylYoFJNmoYVR5nntydLNMQISePPgqZTyhc= -github.com/caddyserver/zerossl v0.1.2 h1:tlEu1VzWGoqcCpivs9liKAKhfpJWYJkHEMmlxRbVAxE= -github.com/caddyserver/zerossl v0.1.2/go.mod h1:wtiJEHbdvunr40ZzhXlnIkOB8Xj4eKtBKizCcZitJiQ= +github.com/buildkite/terminal-to-html/v3 v3.16.8 h1:QN/daUob6cmK8GcdKnwn9+YTlPr1vNj+oeAIiJK6fPc= +github.com/buildkite/terminal-to-html/v3 v3.16.8/go.mod h1:+k1KVKROZocrTLsEQ9PEf9A+8+X8uaVV5iO1ZIOwKYM= +github.com/caddyserver/certmagic v0.22.2 h1:qzZURXlrxwR5m25/jpvVeEyJHeJJMvAwe5zlMufOTQk= +github.com/caddyserver/certmagic v0.22.2/go.mod h1:hbqE7BnkjhX5IJiFslPmrSeobSeZvI6ux8tyxhsd6qs= +github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA= +github.com/caddyserver/zerossl v0.1.3/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/XofZnrYwGqG4= github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a h1:MISbI8sU/PSK/ztvmWKFcI7UGb5/HQT7B+i3a2myKgI= github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a/go.mod h1:2GxOXOlEPAMFPfp014mK1SWq8G8BN8o7/dfYqJrVGn8= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= @@ -162,22 +150,19 @@ github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moA github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= -github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= -github.com/cloudflare/circl v1.3.8 h1:j+V8jJt09PoeMFIu2uh5JUyEaIHTXVOHslFoLNAKqwI= -github.com/cloudflare/circl v1.3.8/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU= -github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= +github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= +github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc= +github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= -github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/cyphar/filepath-securejoin v0.3.6 h1:4d9N5ykBnSp5Xn2JkhocYDkOpURL/18CYMpo6xB9uWM= +github.com/cyphar/filepath-securejoin v0.3.6/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davidmz/go-pageant v1.0.2 h1:bPblRCh5jGU+Uptpz6LgMZGD5hJoOt7otgT454WvHn0= github.com/davidmz/go-pageant v1.0.2/go.mod h1:P2EDDnMqIwG5Rrp05dTRITj9z2zpGcD9efWSkTNKLIE= -github.com/denisenkom/go-mssqldb v0.12.3 h1:pBSGx9Tq67pBOTLmxNuirNTeB8Vjmf886Kx+8Y+8shw= -github.com/denisenkom/go-mssqldb v0.12.3/go.mod h1:k0mtMFOnU+AihqFxPMiF05rtiDrorD1Vrm1KEz5hxDo= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/djherbis/buffer v1.1.0/go.mod h1:VwN8VdFkMY0DCALdY8o00d3IZ6Amz/UNVMWcSaJT44o= @@ -188,18 +173,18 @@ github.com/djherbis/nio/v3 v3.0.1/go.mod h1:Ng4h80pbZFMla1yKzm61cF0tqqilXZYrogmW github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= -github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo= +github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s= github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 h1:2tV76y6Q9BB+NEBasnqvs7e49aEBFI8ejC89PSnWH+4= github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s= github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/editorconfig/editorconfig-core-go/v2 v2.6.2 h1:dKG8sc7n321deIVRcQtwlMNoBEra7j0qQ8RwxO8RN0w= -github.com/editorconfig/editorconfig-core-go/v2 v2.6.2/go.mod h1:7dvD3GCm7eBw53xZ/lsiq72LqobdMg3ITbMBxnmJmqY= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/editorconfig/editorconfig-core-go/v2 v2.6.3 h1:XVUp6qW3BIkmM3/1EkrHpa6bL56APOynfXcZEmIgOhs= +github.com/editorconfig/editorconfig-core-go/v2 v2.6.3/go.mod h1:ThHVc+hqbUsmE1wmK/MASpQEhCleWu1JDJDNhUOMy0c= +github.com/elazarl/goproxy v1.4.0 h1:4GyuSbFa+s26+3rmYNSuUVsx+HgPrV1bk1jXI0l9wjM= +github.com/elazarl/goproxy v1.4.0/go.mod h1:X/5W/t+gzDyLfHW4DrMdpjqYjpXsURlBt9lpBDxZZZQ= github.com/emersion/go-imap v1.2.1 h1:+s9ZjMEjOB8NzZMVTM3cCenz2JrQIGGo5j1df19WjTA= github.com/emersion/go-imap v1.2.1/go.mod h1:Qlx1FSx2FTxjnjWpIlVNEuX+ylerZQNFE5NsmKFSejY= github.com/emersion/go-message v0.15.0/go.mod h1:wQUEfE+38+7EW8p8aZ96ptg6bAb1iwdgej19uXASlE4= @@ -213,20 +198,14 @@ github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/felixge/fgprof v0.9.5 h1:8+vR6yu2vvSKn08urWyEuxx75NWPEvybbkBirEpsbVY= github.com/felixge/fgprof v0.9.5/go.mod h1:yKl+ERSa++RYOs32d8K6WEXCB4uXdLls4ZaZPpayhMM= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= -github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= -github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= -github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= -github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU= +github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/go-ap/activitypub v0.0.0-20231114162308-e219254dc5c9 h1:j2TrkUG/NATGi/EQS+MvEoF79CxiRUmT16ErFroNcKI= github.com/go-ap/activitypub v0.0.0-20231114162308-e219254dc5c9/go.mod h1:cJ9Ye0ZNSMN7RzZDBRY3E+8M3Bpf/R1JX22Ir9yX6WI= github.com/go-ap/errors v0.0.0-20231003111023-183eef4b31b7 h1:I2nuhyVI/48VXoRCCZR2hYBgnSXa+EuDJf/VyX06TC0= @@ -236,94 +215,64 @@ github.com/go-ap/jsonld v0.0.0-20221030091449-f2a191312c73/go.mod h1:jyveZeGw5La github.com/go-asn1-ber/asn1-ber v1.5.5 h1:MNHlNMBDgEKD4TcKr36vQN68BA00aDfjIt3/bD50WnA= github.com/go-asn1-ber/asn1-ber v1.5.5/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-chi/chi/v5 v5.0.1/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= -github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-chi/chi/v5 v5.2.0 h1:Aj1EtB0qR2Rdo2dG4O94RIU35w2lvQSj6BRA4+qwFL0= +github.com/go-chi/chi/v5 v5.2.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-chi/cors v1.2.1 h1:xEC8UT3Rlp2QuWNEr4Fs/c2EAGVKBwy/1vHx3bppil4= github.com/go-chi/cors v1.2.1/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58= github.com/go-co-op/gocron v1.37.0 h1:ZYDJGtQ4OMhTLKOKMIch+/CY70Brbb1dGdooLEhh7b0= github.com/go-co-op/gocron v1.37.0/go.mod h1:3L/n6BkO7ABj+TrfSVXLRzsP26zmikL4ISkLQ0O8iNY= -github.com/go-enry/go-enry/v2 v2.8.9 h1:vskZIABoxInDd5sHY49t+C/VgF8RWxRdRMoH5AdLqQU= -github.com/go-enry/go-enry/v2 v2.8.9/go.mod h1:9yrj4ES1YrbNb1Wb7/PWYr2bpaCXUGRt0uafN0ISyG8= +github.com/go-enry/go-enry/v2 v2.9.2 h1:giOQAtCgBX08kosrX818DCQJTCNtKwoPBGu0qb6nKTY= +github.com/go-enry/go-enry/v2 v2.9.2/go.mod h1:9yrj4ES1YrbNb1Wb7/PWYr2bpaCXUGRt0uafN0ISyG8= github.com/go-enry/go-oniguruma v1.2.1 h1:k8aAMuJfMrqm/56SG2lV9Cfti6tC4x8673aHCcBk+eo= github.com/go-enry/go-oniguruma v1.2.1/go.mod h1:bWDhYP+S6xZQgiRL7wlTScFYBe023B6ilRZbCAD5Hf4= -github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= -github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw= -github.com/go-faster/errors v0.7.1 h1:MkJTnDoEdi9pDabt1dpWf7AA8/BaSYZqibYyhZ20AYg= -github.com/go-faster/errors v0.7.1/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7FPGZP2quo= +github.com/go-fed/httpsig v1.1.0 h1:9M+hb0jkEICD8/cAiNqEB66R87tTINszBRTjwjQzWcI= github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM= -github.com/go-fed/httpsig v1.1.1-0.20201223112313-55836744818e h1:oRq/fiirun5HqlEWMLIcDmLpIELlG4iGbd0s8iqgPi8= -github.com/go-fed/httpsig v1.1.1-0.20201223112313-55836744818e/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= -github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= +github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= -github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= +github.com/go-git/go-git/v5 v5.13.2 h1:7O7xvsK7K+rZPKW6AQR1YyNhfywkv7B8/FsP3ki6Zv0= +github.com/go-git/go-git/v5 v5.13.2/go.mod h1:hWdW5P4YZRjmpGHwRH2v3zkWcNl6HeXaXQEMGb3NJ9A= github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-ldap/ldap/v3 v3.4.6 h1:ert95MdbiG7aWo/oPYp9btL3KJlMPKnP58r09rI8T+A= github.com/go-ldap/ldap/v3 v3.4.6/go.mod h1:IGMQANNtxpsOzj7uUAMjpGBaOVTC4DYyIy8VsTdxmtc= -github.com/go-openapi/analysis v0.22.2 h1:ZBmNoP2h5omLKr/srIC9bfqrUGzT6g6gNv03HE9Vpj0= -github.com/go-openapi/analysis v0.22.2/go.mod h1:pDF4UbZsQTo/oNuRfAWWd4dAh4yuYf//LYorPTjrpvo= -github.com/go-openapi/errors v0.21.0 h1:FhChC/duCnfoLj1gZ0BgaBmzhJC2SL/sJr8a2vAobSY= -github.com/go-openapi/errors v0.21.0/go.mod h1:jxNTMUxRCKj65yb/okJGEtahVd7uvWnuWfj53bse4ho= -github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= -github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= -github.com/go-openapi/loads v0.21.5 h1:jDzF4dSoHw6ZFADCGltDb2lE4F6De7aWSpe+IcsRzT0= -github.com/go-openapi/loads v0.21.5/go.mod h1:PxTsnFBoBe+z89riT+wYt3prmSBP6GDAQh2l9H1Flz8= -github.com/go-openapi/runtime v0.26.2 h1:elWyB9MacRzvIVgAZCBJmqTi7hBzU0hlKD4IvfX0Zl0= -github.com/go-openapi/runtime v0.26.2/go.mod h1:O034jyRZ557uJKzngbMDJXkcKJVzXJiymdSfgejrcRw= github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do= github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= -github.com/go-openapi/strfmt v0.22.0 h1:Ew9PnEYc246TwrEspvBdDHS4BVKXy/AOVsfqGDgAcaI= -github.com/go-openapi/strfmt v0.22.0/go.mod h1:HzJ9kokGIju3/K6ap8jL+OlGAbjpSv27135Yr9OivU4= github.com/go-openapi/swag v0.22.7 h1:JWrc1uc/P9cSomxfnsFSVWoE1FW6bNbrVPmpQYpCcR8= github.com/go-openapi/swag v0.22.7/go.mod h1:Gl91UqO+btAM0plGGxHqJcQZ1ZTy6jbmridBTsDy8A0= -github.com/go-openapi/validate v0.22.6 h1:+NhuwcEYpWdO5Nm4bmvhGLW0rt1Fcc532Mu3wpypXfo= -github.com/go-openapi/validate v0.22.6/go.mod h1:eaddXSqKeTg5XpSmj1dYyFTK/95n/XHwcOY+BMxKMyM= -github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= -github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= -github.com/go-swagger/go-swagger v0.30.5 h1:SQ2+xSonWjjoEMOV5tcOnZJVlfyUfCBhGQGArS1b9+U= -github.com/go-swagger/go-swagger v0.30.5/go.mod h1:cWUhSyCNqV7J1wkkxfr5QmbcnCewetCdvEXqgPvbc/Q= -github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013 h1:l9rI6sNaZgNC0LnF3MiE+qTmyBA/tZAg1rtyrGbUMK0= -github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013/go.mod h1:b65mBPzqzZWxOZGxSWrqs4GInLIn+u99Q9q7p+GKni0= +github.com/go-sql-driver/mysql v1.9.1 h1:FrjNGn/BsJQjVRuSa8CBrM5BWA9BWoXXat3KrtSb/iI= +github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= -github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/go-testfixtures/testfixtures/v3 v3.12.0 h1:Ew0+c2o1mXSUqMwjuNup3MK/vw1HkLS3ILljX5C6lVE= -github.com/go-testfixtures/testfixtures/v3 v3.12.0/go.mod h1:13F0m6/DtqqSDso9IAVuhbZ4I7AiRAHrolmDMu9v5vY= -github.com/go-webauthn/webauthn v0.11.2 h1:Fgx0/wlmkClTKlnOsdOQ+K5HcHDsDcYIvtYmfhEOSUc= -github.com/go-webauthn/webauthn v0.11.2/go.mod h1:aOtudaF94pM71g3jRwTYYwQTG1KyTILTcZqN1srkmD0= -github.com/go-webauthn/x v0.1.14 h1:1wrB8jzXAofojJPAaRxnZhRgagvLGnLjhCAwg3kTpT0= -github.com/go-webauthn/x v0.1.14/go.mod h1:UuVvFZ8/NbOnkDz3y1NaxtUN87pmtpC1PQ+/5BBQRdc= +github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= +github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/go-webauthn/webauthn v0.12.2 h1:yLaNPgBUEXDQtWnOjhsGhMMCEWbXwjg/aNkC8riJQI8= +github.com/go-webauthn/webauthn v0.12.2/go.mod h1:Q8SZPPj4sZ469fNTcQXxRpzJOdb30jQrn/36FX8jilA= +github.com/go-webauthn/x v0.1.20 h1:brEBDqfiPtNNCdS/peu8gARtq8fIPsHz0VzpPjGvgiw= +github.com/go-webauthn/x v0.1.20/go.mod h1:n/gAc8ssZJGATM0qThE+W+vfgXiMedsWi3wf/C4lld0= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= -github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= -github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f h1:3BSP1Tbs2djlpprl7wCLuiqMaUh5SJkkzI2gDs+FgLs= github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f/go.mod h1:Pcatq5tYkCW2Q6yrR2VRHlbHpZ/R4/7qyL1TCF7vl14= github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85 h1:UjoPNDAQ5JPCjlxoJd6K8ALZqSDDhk2ymieAZOVaDg0= github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85/go.mod h1:fR6z1Ie6rtF7kl/vBYMfgD5/G5B1blui7z426/sj2DU= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= -github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= -github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= -github.com/golang/geo v0.0.0-20230421003525-6adc56603217 h1:HKlyj6in2JV6wVkmQ4XmG/EIm+SCYlPZ+V4GWit7Z+I= -github.com/golang/geo v0.0.0-20230421003525-6adc56603217/go.mod h1:8wI0hitZ3a1IxZfeH3/5I97CI8i5cLGsYe7xNhQGs9U= +github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= +github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -333,11 +282,9 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -348,21 +295,21 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-github/v64 v64.0.0 h1:4G61sozmY3eiPAjjoOHponXDBONm+utovTKbyUb2Qdg= github.com/google/go-github/v64 v64.0.0/go.mod h1:xB3vqMQNdHzilXBiO2I+M7iEFtHf+DP/omBOv6tQzVo= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/go-tpm v0.9.1 h1:0pGc4X//bAlmZzMKf8iz6IsDo1nYTbYJ6FZN/rg4zdM= -github.com/google/go-tpm v0.9.1/go.mod h1:h9jEsEECg7gtLis0upRBQU+GhYVH6jMjrFxI8u6bVUY= +github.com/google/go-tpm v0.9.3 h1:+yx0/anQuGzi+ssRqeD6WpXjW2L/V0dItUayO0i9sRc= +github.com/google/go-tpm v0.9.3/go.mod h1:h9jEsEECg7gtLis0upRBQU+GhYVH6jMjrFxI8u6bVUY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -github.com/google/pprof v0.0.0-20240528025155-186aa0362fba h1:ql1qNgCyOB7iAEk8JTNM+zJrgIbnyCKX/wdlyPufP5g= -github.com/google/pprof v0.0.0-20240528025155-186aa0362fba/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/pprof v0.0.0-20241017200806-017d972448fc h1:NGyrhhFhwvRAZg02jnYVg3GBQy0qGBKmFQJwaPmpmxs= +github.com/google/pprof v0.0.0-20241017200806-017d972448fc/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -373,22 +320,14 @@ github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= github.com/gorilla/feeds v1.2.0 h1:O6pBiXJ5JHhPvqy53NsjKOThq+dNFm8+DFrxBEdzSCc= github.com/gorilla/feeds v1.2.0/go.mod h1:WMib8uJP3BbY+X8Szd1rA5Pzhdfh+HCCAYT2z7Fza6Y= -github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= -github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/pat v0.0.0-20180118222023-199c85a7f6d1 h1:LqbZZ9sNMWVjeXS4NN5oVvhMjDyLhmA1LG86oSo+IqY= github.com/gorilla/pat v0.0.0-20180118222023-199c85a7f6d1/go.mod h1:YeAe0gNeiNT5hoiZRI4yiOky6jVdNvfO2N6Kav/HmxY= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= -github.com/gorilla/sessions v1.2.0/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY= -github.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8LRvBeoNcQ= -github.com/h2non/gock v1.2.0 h1:K6ol8rfrRkUOefooBC8elXoaNGYkpp7y2qcxGG6BzUE= -github.com/h2non/gock v1.2.0/go.mod h1:tNhoxHYW2W42cYkYb1WqzdbYIieALC99kpYr7rH/BQk= -github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw= -github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= +github.com/gorilla/sessions v1.4.0 h1:kpIYOp/oi6MG/p5PgxApU8srsSw9tuFbt46Lt7auzqQ= +github.com/gorilla/sessions v1.4.0/go.mod h1:FLWm50oby91+hl7p/wRxDth9bWSuk0qVL2emc7lT5ik= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= @@ -397,44 +336,18 @@ github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISH github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= -github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= -github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= -github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= -github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= -github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= -github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= -github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgtype v1.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= -github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= -github.com/jackc/pgx/v4 v4.18.3 h1:dE2/TrEsGX3RBprb3qryqSV9Y60iZN1C6i8IrmW9/BA= -github.com/jackc/pgx/v4 v4.18.3/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056 h1:iCHtR9CQyktQ5+f3dMVZfwD2KWJUgm7M0gdL9NGr8KA= github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= -github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= -github.com/jhillyerd/enmime v1.3.0 h1:LV5kzfLidiOr8qRGIpYYmUZCnhrPbcFAnAFUnWn99rw= -github.com/jhillyerd/enmime v1.3.0/go.mod h1:6c6jg5HdRRV2FtvVL69LjiX1M8oE0xDX9VEhV3oy4gs= -github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= -github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/jhillyerd/enmime/v2 v2.1.0 h1:c8Qwi5Xq5EdtMN6byQWoZ/8I2RMTo6OJ7Xay+s1oPO0= +github.com/jhillyerd/enmime/v2 v2.1.0/go.mod h1:EJ74dcRbBcqHSP2TBu08XRoy6y3Yx0cevwb1YkGMEmQ= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -443,18 +356,14 @@ github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNU github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= -github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= -github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= -github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= +github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= @@ -467,17 +376,18 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/libdns/libdns v0.2.2 h1:O6ws7bAfRPaBsgAYt8MDe2HcNBGC29hkZ9MX2eUSX3s= -github.com/libdns/libdns v0.2.2/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ= +github.com/libdns/libdns v0.2.3 h1:ba30K4ObwMGB/QTmqUxf3H4/GmUrCAIkMWejeGl12v8= +github.com/libdns/libdns v0.2.3/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ= github.com/lunny/vfsgen v0.0.0-20220105142115-2c99e1ffdfa0 h1:F/3FfGmKdiKFa8kL3YrpZ7pe9H4l4AzA1pbaOUnRvPI= github.com/lunny/vfsgen v0.0.0-20220105142115-2c99e1ffdfa0/go.mod h1:JEfTc3+2DF9Z4PXhLLvXL42zexJyh8rIq3OzUj/0rAk= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/markbates/going v1.0.3 h1:mY45T5TvW+Xz5A6jY7lf4+NLg9D8+iuStIHyR7M8qsE= github.com/markbates/going v1.0.3/go.mod h1:fQiT6v6yQar9UD6bd/D4Z5Afbk9J6BBVBtLiyY4gp2o= github.com/markbates/goth v1.80.0 h1:NnvatczZDzOs1hn9Ug+dVYf2Viwwkp/ZDX5K+GLjan8= @@ -488,44 +398,39 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= -github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/meilisearch/meilisearch-go v0.28.0 h1:f3XJ66ZM+R8bANAOLqsjvoq/HhQNpVJPYoNt6QgNzME= -github.com/meilisearch/meilisearch-go v0.28.0/go.mod h1:Szcc9CaDiKIfjdgdt49jlmDKpEzjD+x+b6Y6heMdlQ0= -github.com/mholt/acmez/v2 v2.0.1 h1:3/3N0u1pLjMK4sNEAFSI+bcvzbPhRpY383sy1kLHJ6k= -github.com/mholt/acmez/v2 v2.0.1/go.mod h1:fX4c9r5jYwMyMsC+7tkYRxHibkOTgta5DIFGoe67e1U= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEum7A= +github.com/mattn/go-sqlite3 v1.14.28/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/meilisearch/meilisearch-go v0.31.0 h1:yZRhY1qJqdH8h6GFZALGtkDLyj8f9v5aJpsNMyrUmnY= +github.com/meilisearch/meilisearch-go v0.31.0/go.mod h1:aNtyuwurDg/ggxQIcKqWH6G9g2ptc8GyY7PLY4zMn/g= +github.com/mholt/acmez/v3 v3.1.1 h1:Jh+9uKHkPxUJdxM16q5mOr+G2V0aqkuFtNA28ihCxhQ= +github.com/mholt/acmez/v3 v3.1.1/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= -github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs= -github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk= +github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY= +github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs= +github.com/minio/crc64nvme v1.0.1 h1:DHQPrYPdqK7jQG/Ls5CTBZWeex/2FMS3G5XGkycuFrY= +github.com/minio/crc64nvme v1.0.1/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.74 h1:fTo/XlPBTSpo3BAMshlwKL5RspXRv9us5UeHEGYCFe0= -github.com/minio/minio-go/v7 v7.0.74/go.mod h1:qydcVzV8Hqtj1VtEocfxbmVFa2siu6HGa+LDEPogjD8= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/minio/minio-go/v7 v7.0.88 h1:v8MoIJjwYxOkehp+eiLIuvXk87P2raUtoU5klrAAshs= +github.com/minio/minio-go/v7 v7.0.88/go.mod h1:33+O8h0tO7pCeCWwBVa07RhVVfB/3vS4kEX7rwYKmIg= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/mrjones/oauth v0.0.0-20190623134757-126b35219450 h1:j2kD3MT1z4PXCiUllUJF9mWUESr9TWKS7iEKsQ/IipM= github.com/mrjones/oauth v0.0.0-20190623134757-126b35219450/go.mod h1:skjdDftzkFALcuGzYSklqYd8gvat6F1gZJ4YPVbkZpM= github.com/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM= github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw= -github.com/msteinert/pam v1.2.0 h1:mYfjlvN2KYs2Pb9G6nb/1f/nPfAttT/Jee5Sq9r3bGE= -github.com/msteinert/pam v1.2.0/go.mod h1:d2n0DCUK8rGecChV3JzvmsDjOY4R7AYbsNxAT+ftQl0= -github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32 h1:W6apQkHrMkS0Muv8G/TipAy/FJl/rCYT0+EuS8+Z0z4= -github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= +github.com/msteinert/pam/v2 v2.1.0 h1:er5F9TKV5nGFuTt12ubtqPHEUdeBwReP7vd3wovidGY= +github.com/msteinert/pam/v2 v2.1.0/go.mod h1:KT28NNIcDFf3PcBmNI2mIGO4zZJ+9RSs/At2PB3IDVc= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/niklasfasching/go-org v1.7.0 h1:vyMdcMWWTe/XmANk19F4k8XGBYg0GQ/gJGMimOjGMek= github.com/niklasfasching/go-org v1.7.0/go.mod h1:WuVm4d45oePiE0eX25GqTDQIt/qPW1T9DGkRscqLW5o= github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= @@ -534,8 +439,6 @@ github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWk github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/olivere/elastic/v7 v7.0.32 h1:R7CXvbu8Eq+WlsLgxmKVKPox0oOwAE/2T9Si5BnvK6E= @@ -548,23 +451,18 @@ github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042 github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= +github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= -github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= +github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= -github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU= -github.com/paulmach/orb v0.11.1/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= -github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= -github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= -github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= -github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= +github.com/pjbgf/sha1cd v0.3.2 h1:a9wb0bp1oC2TGwStyn0Umc/IGKQnEgF0vVaZ8QF8eo4= +github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -573,18 +471,16 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pquerna/otp v1.4.0 h1:wZvl1TIVxKRThZIBiwOOHOGP/1+nZyWBil9Y2XNEDzg= github.com/pquerna/otp v1.4.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= -github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= -github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= -github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= -github.com/prometheus/common v0.46.0 h1:doXzt5ybi1HBKpsZOL0sSkaNHJJqkyfEWZGGqqScV0Y= -github.com/prometheus/common v0.46.0/go.mod h1:Tp0qkxpb9Jsg54QMe+EAmqXkSV7Evdy1BTn+g2pa/hQ= -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= -github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= -github.com/quasoft/websspi v1.1.2 h1:/mA4w0LxWlE3novvsoEL6BBA1WnjJATbjkh1kFrTidw= -github.com/quasoft/websspi v1.1.2/go.mod h1:HmVdl939dQ0WIXZhyik+ARdI03M6bQzaSEKcgpFmewk= -github.com/redis/go-redis/v9 v9.6.1 h1:HHDteefn6ZkTtY5fGUE8tj8uy85AHk6zP7CpzIAM0y4= -github.com/redis/go-redis/v9 v9.6.1/go.mod h1:0C0c6ycQsdpVNQpxb1njEQIqkx5UcsM8FJCQLgE9+RA= +github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk= +github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM= +github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rhysd/actionlint v1.6.27 h1:xxwe8YmveBcC8lydW6GoHMGmB6H/MTqUU60F2p10wjw= @@ -596,47 +492,26 @@ github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= -github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= -github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= -github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 h1:PKK9DyHxif4LZo+uQSgXNqs0jj5+xZwwfKHgph2lxBw= github.com/santhosh-tekuri/jsonschema/v6 v6.0.1/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= github.com/sassoftware/go-rpmutils v0.4.0 h1:ojND82NYBxgwrV+mX1CWsd5QJvvEZTKddtCdFLPWhpg= github.com/sassoftware/go-rpmutils v0.4.0/go.mod h1:3goNWi7PGAT3/dlql2lv3+MSN5jNYPjT5mVcQcIsYzI= -github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= -github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516/go.mod h1:Yow6lPLSAXx2ifx470yD/nUe22Dv5vBvxK/UK9UUTVs= -github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= -github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= -github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c h1:aqg5Vm5dwtvL+YgDpBcK1ITf3o96N/K7/wsRXQnUTEs= github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c/go.mod h1:owqhoLW1qZoYLZzLnBw+QkPP9WZnjlSWihhxAJC1+/M= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= -github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= -github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= -github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= -github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= -github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= +github.com/skeema/knownhosts v1.3.0 h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY= +github.com/skeema/knownhosts v1.3.0/go.mod h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M= github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf h1:pvbZ0lM0XWPBqUKqFU8cmavspvIl9nulOYwdy6IFRRo= github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf/go.mod h1:RJID2RhlZKId02nZ62WenDCkgHFerpIOmW0iT7GKmXM= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -646,140 +521,124 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= -github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/toqueteos/webbrowser v1.2.0 h1:tVP/gpK69Fx+qMJKsLE7TD8LuGWPnEV71wBN9rrstGQ= -github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJMir8RTqb4ayM= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc= github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/urfave/cli/v2 v2.27.4 h1:o1owoI+02Eb+K107p27wEX9Bb8eqIoZCfLXloLUSWJ8= -github.com/urfave/cli/v2 v2.27.4/go.mod h1:m4QzxcD2qpra4z7WhzEGn74WZLViBnMpb1ToCAKdGRQ= +github.com/urfave/cli/v2 v2.27.6 h1:VdRdS98FNhKZ8/Az8B7MTyGQmpIr36O1EHybx/LaZ4g= +github.com/urfave/cli/v2 v2.27.6/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ= github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= -github.com/xanzy/go-gitlab v0.109.0 h1:RcRme5w8VpLXTSTTMZdVoQWY37qTJWg+gwdQl4aAttE= -github.com/xanzy/go-gitlab v0.109.0/go.mod h1:wKNKh3GkYDMOsGmnfuX+ITCmDuSDWFO0G+C4AygL9RY= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= -github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= -github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= -github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yohcop/openid-go v1.0.1 h1:DPRd3iPO5F6O5zX2e62XpVAbPT6wV51cuucH0z9g3js= github.com/yohcop/openid-go v1.0.1/go.mod h1:b/AvD03P0KHj4yuihb+VtLD6bYYgsy0zqBzPCRjkCNs= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark v1.4.15/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/goldmark v1.7.4 h1:BDXOHExt+A7gwPCJgPIIq7ENvceR7we7rOS9TNoLZeg= -github.com/yuin/goldmark v1.7.4/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= +github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic= +github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc h1:+IAOyRda+RLrxa1WC7umKOZRsGq4QrFFMYApOeHzQwQ= github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc/go.mod h1:ovIvrum6DQJA4QsJSovrkC4saKHQVs7TvcaeO8AIl5I= -github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY= -github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/blake3 v0.2.3 h1:TFoLXsjeXqRNFxSbk35Dk4YtszE/MQQGK10BH4ptoTg= -github.com/zeebo/blake3 v0.2.3/go.mod h1:mjJjZpnsyIVtVgTOSpJ9vmRE4wgDeyt2HU3qXvvKCaQ= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/blake3 v0.2.4 h1:KYQPkhpRtcqh0ssGYcKLG1JYvddkEA8QwCM/yBqhaZI= +github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCRUjcE= github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= -go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= -go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= -go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= -go.mongodb.org/mongo-driver v1.13.1 h1:YIc7HTYsKndGK4RFzJ3covLz1byri52x0IoMB0Pt/vk= -go.mongodb.org/mongo-driver v1.13.1/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwDtFu/Z9+eo= -go.opentelemetry.io/otel v1.26.0 h1:LQwgL5s/1W7YiiRwxf03QGnWLb2HW4pLiAhaA5cZXBs= -go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4= -go.opentelemetry.io/otel/trace v1.26.0 h1:1ieeAUb4y0TE26jUFrCIXKpTuVK7uJGN9/Z/2LP5sQA= -go.opentelemetry.io/otel/trace v1.26.0/go.mod h1:4iDxvGDQuUkHve82hJJ8UqrwswHYsZuWCBllGV2U2y0= +gitlab.com/gitlab-org/api/client-go v0.126.0 h1:VV5TdkF6pMbEdFGvbR2CwEgJwg6qdg1u3bj5eD2tiWk= +gitlab.com/gitlab-org/api/client-go v0.126.0/go.mod h1:bYC6fPORKSmtuPRyD9Z2rtbAjE7UeNatu2VWHRf4/LE= +go.etcd.io/bbolt v1.4.0 h1:TU77id3TnN/zKr7CO/uk+fBCwF2jGcMuw2B/FMAzYIk= +go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= -go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= +go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.uber.org/zap/exp v0.3.0 h1:6JYzdifzYkGmTdRR59oYH+Ng7k49H9qVpWwNSsGJj3U= +go.uber.org/zap/exp v0.3.0/go.mod h1:5I384qq7XGxYyByIhHm6jg5CHkGY0nsTfbDLgDDlgJQ= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= -golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= -golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA= -golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= -golang.org/x/image v0.20.0 h1:7cVCUjQwfL18gyBJOmYvptfSHS8Fb3YUDtfLIZ7Nbpw= -golang.org/x/image v0.20.0/go.mod h1:0a88To4CYVBAHp5FXJm8o7QbUl37Vd85ply1vyD8auM= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= +golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= +golang.org/x/image v0.25.0 h1:Y6uW6rH1y5y/LK1J8BPWZtr6yZ7hrsy6hFrXjgsc2fQ= +golang.org/x/image v0.25.0/go.mod h1:tCAmOEGthTtkalusGp1g3xa2gke8J6c2N565dTyl9Rs= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= -golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= +golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= -golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= +golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -787,7 +646,6 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -795,70 +653,61 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= -golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= -golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= -golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= +golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= -golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= +golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE= -golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU= +golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 h1:1GBuWVLM/KMVUv1t1En5Gs+gFZCNd360GGb4sSxtrhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.66.2 h1:3QdXkuq3Bkh7w+ywLdLvM56cmGvQHUMZpiCzt6Rqaoo= -google.golang.org/grpc v1.66.2/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM= +google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -881,9 +730,9 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI= diff --git a/main.go b/main.go index b8cc5668e1..3f0283db7f 100644 --- a/main.go +++ b/main.go @@ -10,16 +10,16 @@ import ( "strings" "time" - "code.gitea.io/gitea/cmd" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/cmd" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" // register supported doc types - _ "code.gitea.io/gitea/modules/markup/asciicast" - _ "code.gitea.io/gitea/modules/markup/console" - _ "code.gitea.io/gitea/modules/markup/csv" - _ "code.gitea.io/gitea/modules/markup/markdown" - _ "code.gitea.io/gitea/modules/markup/orgmode" + _ "forgejo.org/modules/markup/asciicast" + _ "forgejo.org/modules/markup/console" + _ "forgejo.org/modules/markup/csv" + _ "forgejo.org/modules/markup/markdown" + _ "forgejo.org/modules/markup/orgmode" "github.com/urfave/cli/v2" ) diff --git a/models/actions/artifact.go b/models/actions/artifact.go index 3d0a288e62..10cd3868a1 100644 --- a/models/actions/artifact.go +++ b/models/actions/artifact.go @@ -11,9 +11,9 @@ import ( "errors" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) @@ -69,7 +69,7 @@ func CreateArtifact(ctx context.Context, t *ActionTask, artifactName, artifactPa OwnerID: t.OwnerID, CommitSHA: t.CommitSHA, Status: int64(ArtifactStatusUploadPending), - ExpiredUnix: timeutil.TimeStamp(time.Now().Unix() + 3600*24*expiredDays), + ExpiredUnix: timeutil.TimeStamp(time.Now().Unix() + timeutil.Day*expiredDays), } if _, err := db.GetEngine(ctx).Insert(artifact); err != nil { return nil, err @@ -78,6 +78,13 @@ func CreateArtifact(ctx context.Context, t *ActionTask, artifactName, artifactPa } else if err != nil { return nil, err } + + if _, err := db.GetEngine(ctx).ID(artifact.ID).Cols("expired_unix").Update(&ActionArtifact{ + ExpiredUnix: timeutil.TimeStamp(time.Now().Unix() + timeutil.Day*expiredDays), + }); err != nil { + return nil, err + } + return artifact, nil } diff --git a/models/actions/forgejo.go b/models/actions/forgejo.go index 5ea77f4473..ce3f8b0c8b 100644 --- a/models/actions/forgejo.go +++ b/models/actions/forgejo.go @@ -7,9 +7,9 @@ import ( "crypto/subtle" "fmt" - auth_model "code.gitea.io/gitea/models/auth" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/util" + auth_model "forgejo.org/models/auth" + "forgejo.org/models/db" + "forgejo.org/modules/util" gouuid "github.com/google/uuid" ) diff --git a/models/actions/forgejo_test.go b/models/actions/forgejo_test.go index 9295fc698e..fc4ccfa628 100644 --- a/models/actions/forgejo_test.go +++ b/models/actions/forgejo_test.go @@ -6,9 +6,9 @@ import ( "crypto/subtle" "testing" - auth_model "code.gitea.io/gitea/models/auth" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" + auth_model "forgejo.org/models/auth" + "forgejo.org/models/db" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/actions/main_test.go b/models/actions/main_test.go index 3cfb395e62..27916f29ac 100644 --- a/models/actions/main_test.go +++ b/models/actions/main_test.go @@ -6,7 +6,7 @@ package actions import ( "testing" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/unittest" ) func TestMain(m *testing.M) { diff --git a/models/actions/run.go b/models/actions/run.go index 8b40cb7ba8..671177a892 100644 --- a/models/actions/run.go +++ b/models/actions/run.go @@ -10,15 +10,15 @@ import ( "strings" "time" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/json" - api "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" - webhook_module "code.gitea.io/gitea/modules/webhook" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/git" + "forgejo.org/modules/json" + api "forgejo.org/modules/structs" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" + webhook_module "forgejo.org/modules/webhook" "github.com/nektos/act/pkg/jobparser" "xorm.io/builder" @@ -37,6 +37,7 @@ type ActionRun struct { TriggerUser *user_model.User `xorm:"-"` ScheduleID int64 Ref string `xorm:"index"` // the commit/tag/… that caused the run + IsRefDeleted bool `xorm:"-"` CommitSHA string IsForkPullRequest bool // If this is triggered by a PR from a forked repository or an untrusted user, we need to check if it is approved and limit permissions when running the workflow. NeedApproval bool // may need approval if it's a fork pull request @@ -146,7 +147,11 @@ func (run *ActionRun) GetPushEventPayload() (*api.PushPayload, error) { } func (run *ActionRun) GetPullRequestEventPayload() (*api.PullRequestPayload, error) { - if run.Event == webhook_module.HookEventPullRequest || run.Event == webhook_module.HookEventPullRequestSync { + if run.Event == webhook_module.HookEventPullRequest || + run.Event == webhook_module.HookEventPullRequestSync || + run.Event == webhook_module.HookEventPullRequestAssign || + run.Event == webhook_module.HookEventPullRequestMilestone || + run.Event == webhook_module.HookEventPullRequestLabel { var payload api.PullRequestPayload if err := json.Unmarshal([]byte(run.EventPayload), &payload); err != nil { return nil, err @@ -250,6 +255,7 @@ func CancelPreviousJobs(ctx context.Context, repoID int64, ref, workflowID strin } // InsertRun inserts a run +// The title will be cut off at 255 characters if it's longer than 255 characters. func InsertRun(ctx context.Context, run *ActionRun, jobs []*jobparser.SingleWorkflow) error { ctx, commiter, err := db.TxContext(ctx) if err != nil { @@ -262,6 +268,7 @@ func InsertRun(ctx context.Context, run *ActionRun, jobs []*jobparser.SingleWork return err } run.Index = index + run.Title, _ = util.SplitStringAtByteN(run.Title, 255) if err := db.Insert(ctx, run); err != nil { return err @@ -387,6 +394,7 @@ func UpdateRun(ctx context.Context, run *ActionRun, cols ...string) error { if len(cols) > 0 { sess.Cols(cols...) } + run.Title, _ = util.SplitStringAtByteN(run.Title, 255) affected, err := sess.Update(run) if err != nil { return err diff --git a/models/actions/run_job.go b/models/actions/run_job.go index 4b8664077d..fffbb6670b 100644 --- a/models/actions/run_job.go +++ b/models/actions/run_job.go @@ -9,9 +9,10 @@ import ( "slices" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/container" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) @@ -71,6 +72,15 @@ func (job *ActionRunJob) LoadAttributes(ctx context.Context) error { return job.Run.LoadAttributes(ctx) } +func (job *ActionRunJob) ItRunsOn(labels []string) bool { + if len(labels) == 0 || len(job.RunsOn) == 0 { + return false + } + labelSet := make(container.Set[string]) + labelSet.AddMultiple(labels...) + return labelSet.IsSubset(job.RunsOn) +} + func GetRunJobByID(ctx context.Context, id int64) (*ActionRunJob, error) { var job ActionRunJob has, err := db.GetEngine(ctx).Where("id=?", id).Get(&job) @@ -137,7 +147,7 @@ func UpdateRunJob(ctx context.Context, job *ActionRunJob, cond builder.Cond, col if err != nil { return 0, err } - run.Status = aggregateJobStatus(jobs) + run.Status = AggregateJobStatus(jobs) if run.Started.IsZero() && run.Status.IsRunning() { run.Started = timeutil.TimeStampNow() } @@ -152,29 +162,35 @@ func UpdateRunJob(ctx context.Context, job *ActionRunJob, cond builder.Cond, col return affected, nil } -func aggregateJobStatus(jobs []*ActionRunJob) Status { - allDone := true - allWaiting := true - hasFailure := false +func AggregateJobStatus(jobs []*ActionRunJob) Status { + allSuccessOrSkipped := len(jobs) != 0 + allSkipped := len(jobs) != 0 + var hasFailure, hasCancelled, hasWaiting, hasRunning, hasBlocked bool for _, job := range jobs { - if !job.Status.IsDone() { - allDone = false - } - if job.Status != StatusWaiting && !job.Status.IsDone() { - allWaiting = false - } - if job.Status == StatusFailure || job.Status == StatusCancelled { - hasFailure = true - } + allSuccessOrSkipped = allSuccessOrSkipped && (job.Status == StatusSuccess || job.Status == StatusSkipped) + allSkipped = allSkipped && job.Status == StatusSkipped + hasFailure = hasFailure || job.Status == StatusFailure + hasCancelled = hasCancelled || job.Status == StatusCancelled + hasWaiting = hasWaiting || job.Status == StatusWaiting + hasRunning = hasRunning || job.Status == StatusRunning + hasBlocked = hasBlocked || job.Status == StatusBlocked } - if allDone { - if hasFailure { - return StatusFailure - } + switch { + case allSkipped: + return StatusSkipped + case allSuccessOrSkipped: return StatusSuccess - } - if allWaiting { + case hasCancelled: + return StatusCancelled + case hasFailure: + return StatusFailure + case hasRunning: + return StatusRunning + case hasWaiting: return StatusWaiting + case hasBlocked: + return StatusBlocked + default: + return StatusUnknown // it shouldn't happen } - return StatusRunning } diff --git a/models/actions/run_job_list.go b/models/actions/run_job_list.go index 6c5d3b3252..cbcb4beb8e 100644 --- a/models/actions/run_job_list.go +++ b/models/actions/run_job_list.go @@ -6,9 +6,9 @@ package actions import ( "context" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/modules/container" + "forgejo.org/modules/timeutil" "xorm.io/builder" ) diff --git a/models/actions/run_job_status_test.go b/models/actions/run_job_status_test.go new file mode 100644 index 0000000000..04fd9ceba7 --- /dev/null +++ b/models/actions/run_job_status_test.go @@ -0,0 +1,85 @@ +// Copyright 2024 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package actions + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestAggregateJobStatus(t *testing.T) { + testStatuses := func(expected Status, statuses []Status) { + t.Helper() + var jobs []*ActionRunJob + for _, v := range statuses { + jobs = append(jobs, &ActionRunJob{Status: v}) + } + actual := AggregateJobStatus(jobs) + if !assert.Equal(t, expected, actual) { + var statusStrings []string + for _, s := range statuses { + statusStrings = append(statusStrings, s.String()) + } + t.Errorf("AggregateJobStatus(%v) = %v, want %v", statusStrings, statusNames[actual], statusNames[expected]) + } + } + + cases := []struct { + statuses []Status + expected Status + }{ + // unknown cases, maybe it shouldn't happen in real world + {[]Status{}, StatusUnknown}, + {[]Status{StatusUnknown, StatusSuccess}, StatusUnknown}, + {[]Status{StatusUnknown, StatusSkipped}, StatusUnknown}, + {[]Status{StatusUnknown, StatusFailure}, StatusFailure}, + {[]Status{StatusUnknown, StatusCancelled}, StatusCancelled}, + {[]Status{StatusUnknown, StatusWaiting}, StatusWaiting}, + {[]Status{StatusUnknown, StatusRunning}, StatusRunning}, + {[]Status{StatusUnknown, StatusBlocked}, StatusBlocked}, + + // success with other status + {[]Status{StatusSuccess}, StatusSuccess}, + {[]Status{StatusSuccess, StatusSkipped}, StatusSuccess}, // skipped doesn't affect success + {[]Status{StatusSuccess, StatusFailure}, StatusFailure}, + {[]Status{StatusSuccess, StatusCancelled}, StatusCancelled}, + {[]Status{StatusSuccess, StatusWaiting}, StatusWaiting}, + {[]Status{StatusSuccess, StatusRunning}, StatusRunning}, + {[]Status{StatusSuccess, StatusBlocked}, StatusBlocked}, + + // any cancelled, then cancelled + {[]Status{StatusCancelled}, StatusCancelled}, + {[]Status{StatusCancelled, StatusSuccess}, StatusCancelled}, + {[]Status{StatusCancelled, StatusSkipped}, StatusCancelled}, + {[]Status{StatusCancelled, StatusFailure}, StatusCancelled}, + {[]Status{StatusCancelled, StatusWaiting}, StatusCancelled}, + {[]Status{StatusCancelled, StatusRunning}, StatusCancelled}, + {[]Status{StatusCancelled, StatusBlocked}, StatusCancelled}, + + // failure with other status, fail fast + // Should "running" win? Maybe no: old code does make "running" win, but GitHub does fail fast. + {[]Status{StatusFailure}, StatusFailure}, + {[]Status{StatusFailure, StatusSuccess}, StatusFailure}, + {[]Status{StatusFailure, StatusSkipped}, StatusFailure}, + {[]Status{StatusFailure, StatusCancelled}, StatusCancelled}, + {[]Status{StatusFailure, StatusWaiting}, StatusFailure}, + {[]Status{StatusFailure, StatusRunning}, StatusFailure}, + {[]Status{StatusFailure, StatusBlocked}, StatusFailure}, + + // skipped with other status + // TODO: need to clarify whether a PR with "skipped" job status is considered as "mergeable" or not. + {[]Status{StatusSkipped}, StatusSkipped}, + {[]Status{StatusSkipped, StatusSuccess}, StatusSuccess}, + {[]Status{StatusSkipped, StatusFailure}, StatusFailure}, + {[]Status{StatusSkipped, StatusCancelled}, StatusCancelled}, + {[]Status{StatusSkipped, StatusWaiting}, StatusWaiting}, + {[]Status{StatusSkipped, StatusRunning}, StatusRunning}, + {[]Status{StatusSkipped, StatusBlocked}, StatusBlocked}, + } + + for _, c := range cases { + testStatuses(c.expected, c.statuses) + } +} diff --git a/models/actions/run_job_test.go b/models/actions/run_job_test.go new file mode 100644 index 0000000000..50a4ba10d8 --- /dev/null +++ b/models/actions/run_job_test.go @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT + +package actions + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestActionRunJob_ItRunsOn(t *testing.T) { + actionJob := ActionRunJob{RunsOn: []string{"ubuntu"}} + agentLabels := []string{"ubuntu", "node-20"} + + assert.True(t, actionJob.ItRunsOn(agentLabels)) + assert.False(t, actionJob.ItRunsOn([]string{})) + + actionJob.RunsOn = append(actionJob.RunsOn, "node-20") + + assert.True(t, actionJob.ItRunsOn(agentLabels)) + + agentLabels = []string{"ubuntu"} + + assert.False(t, actionJob.ItRunsOn(agentLabels)) + + actionJob.RunsOn = []string{} + + assert.False(t, actionJob.ItRunsOn(agentLabels)) +} diff --git a/models/actions/run_list.go b/models/actions/run_list.go index 4046c7d369..92be510569 100644 --- a/models/actions/run_list.go +++ b/models/actions/run_list.go @@ -6,11 +6,12 @@ package actions import ( "context" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/container" - webhook_module "code.gitea.io/gitea/modules/webhook" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/container" + "forgejo.org/modules/translation" + webhook_module "forgejo.org/modules/webhook" "xorm.io/builder" ) @@ -112,14 +113,14 @@ type StatusInfo struct { } // GetStatusInfoList returns a slice of StatusInfo -func GetStatusInfoList(ctx context.Context) []StatusInfo { +func GetStatusInfoList(ctx context.Context, lang translation.Locale) []StatusInfo { // same as those in aggregateJobStatus allStatus := []Status{StatusSuccess, StatusFailure, StatusWaiting, StatusRunning} statusInfoList := make([]StatusInfo, 0, 4) for _, s := range allStatus { statusInfoList = append(statusInfoList, StatusInfo{ Status: int(s), - DisplayedStatus: s.String(), + DisplayedStatus: s.LocaleString(lang), }) } return statusInfoList diff --git a/models/actions/runner.go b/models/actions/runner.go index 175f211c72..99173000fb 100644 --- a/models/actions/runner.go +++ b/models/actions/runner.go @@ -11,15 +11,15 @@ import ( "strings" "time" - auth_model "code.gitea.io/gitea/models/auth" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/shared/types" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/translation" - "code.gitea.io/gitea/modules/util" + auth_model "forgejo.org/models/auth" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/shared/types" + user_model "forgejo.org/models/user" + "forgejo.org/modules/optional" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/translation" + "forgejo.org/modules/util" runnerv1 "code.gitea.io/actions-proto-go/runner/v1" "xorm.io/builder" @@ -271,6 +271,7 @@ func GetRunnerByID(ctx context.Context, id int64) (*ActionRunner, error) { // UpdateRunner updates runner's information. func UpdateRunner(ctx context.Context, r *ActionRunner, cols ...string) error { e := db.GetEngine(ctx) + r.Name, _ = util.SplitStringAtByteN(r.Name, 255) var err error if len(cols) == 0 { _, err = e.ID(r.ID).AllCols().Update(r) @@ -281,27 +282,22 @@ func UpdateRunner(ctx context.Context, r *ActionRunner, cols ...string) error { } // DeleteRunner deletes a runner by given ID. -func DeleteRunner(ctx context.Context, id int64) error { - runner, err := GetRunnerByID(ctx, id) - if err != nil { - return err - } - +func DeleteRunner(ctx context.Context, r *ActionRunner) error { // Replace the UUID, which was either based on the secret's first 16 bytes or an UUIDv4, // with a sequence of 8 0xff bytes followed by the little-endian version of the record's // identifier. This will prevent the deleted record's identifier from colliding with any // new record. b := make([]byte, 8) - binary.LittleEndian.PutUint64(b, uint64(id)) - runner.UUID = fmt.Sprintf("ffffffff-ffff-ffff-%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x", + binary.LittleEndian.PutUint64(b, uint64(r.ID)) + r.UUID = fmt.Sprintf("ffffffff-ffff-ffff-%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x", b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]) - err = UpdateRunner(ctx, runner, "UUID") + err := UpdateRunner(ctx, r, "UUID") if err != nil { return err } - _, err = db.DeleteByID[ActionRunner](ctx, id) + _, err = db.DeleteByID[ActionRunner](ctx, r.ID) return err } @@ -312,6 +308,7 @@ func CreateRunner(ctx context.Context, t *ActionRunner) error { // Remove OwnerID to avoid confusion; it's not worth returning an error here. t.OwnerID = 0 } + t.Name, _ = util.SplitStringAtByteN(t.Name, 255) return db.Insert(ctx, t) } diff --git a/models/actions/runner_list.go b/models/actions/runner_list.go index 3ef8ebb254..6a64c46596 100644 --- a/models/actions/runner_list.go +++ b/models/actions/runner_list.go @@ -6,10 +6,10 @@ package actions import ( "context" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/container" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/container" ) type RunnerList []*ActionRunner diff --git a/models/actions/runner_test.go b/models/actions/runner_test.go index 26ef4c44c6..0623e66046 100644 --- a/models/actions/runner_test.go +++ b/models/actions/runner_test.go @@ -7,9 +7,9 @@ import ( "fmt" "testing" - auth_model "code.gitea.io/gitea/models/auth" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" + auth_model "forgejo.org/models/auth" + "forgejo.org/models/db" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -34,7 +34,7 @@ func TestDeleteRunner(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) before := unittest.AssertExistsAndLoadBean(t, &ActionRunner{ID: recordID}) - err := DeleteRunner(db.DefaultContext, recordID) + err := DeleteRunner(db.DefaultContext, &ActionRunner{ID: recordID}) require.NoError(t, err) var after ActionRunner diff --git a/models/actions/runner_token.go b/models/actions/runner_token.go index fd6ba7ecad..a59304d8e8 100644 --- a/models/actions/runner_token.go +++ b/models/actions/runner_token.go @@ -7,11 +7,11 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" ) // ActionRunnerToken represents runner tokens diff --git a/models/actions/runner_token_test.go b/models/actions/runner_token_test.go index 35c9a9d3c3..65d83a8fd0 100644 --- a/models/actions/runner_token_test.go +++ b/models/actions/runner_token_test.go @@ -6,8 +6,8 @@ package actions import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/actions/schedule.go b/models/actions/schedule.go index c751ef51ca..633582e017 100644 --- a/models/actions/schedule.go +++ b/models/actions/schedule.go @@ -8,11 +8,14 @@ import ( "fmt" "time" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/timeutil" - webhook_module "code.gitea.io/gitea/modules/webhook" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" + webhook_module "forgejo.org/modules/webhook" + + "xorm.io/builder" ) // ActionSchedule represents a schedule of a workflow file @@ -42,15 +45,12 @@ func init() { // GetSchedulesMapByIDs returns the schedules by given id slice. func GetSchedulesMapByIDs(ctx context.Context, ids []int64) (map[int64]*ActionSchedule, error) { schedules := make(map[int64]*ActionSchedule, len(ids)) + if len(ids) == 0 { + return schedules, nil + } return schedules, db.GetEngine(ctx).In("id", ids).Find(&schedules) } -// GetReposMapByIDs returns the repos by given id slice. -func GetReposMapByIDs(ctx context.Context, ids []int64) (map[int64]*repo_model.Repository, error) { - repos := make(map[int64]*repo_model.Repository, len(ids)) - return repos, db.GetEngine(ctx).In("id", ids).Find(&repos) -} - // CreateScheduleTask creates new schedule task. func CreateScheduleTask(ctx context.Context, rows []*ActionSchedule) error { // Return early if there are no rows to insert @@ -67,6 +67,7 @@ func CreateScheduleTask(ctx context.Context, rows []*ActionSchedule) error { // Loop through each schedule row for _, row := range rows { + row.Title, _ = util.SplitStringAtByteN(row.Title, 255) // Create new schedule row if err = db.Insert(ctx, row); err != nil { return err @@ -118,21 +119,45 @@ func DeleteScheduleTaskByRepo(ctx context.Context, id int64) error { return committer.Commit() } -func CleanRepoScheduleTasks(ctx context.Context, repo *repo_model.Repository) error { +func CleanRepoScheduleTasks(ctx context.Context, repo *repo_model.Repository, cancelPreviousJobs bool) error { // If actions disabled when there is schedule task, this will remove the outdated schedule tasks // There is no other place we can do this because the app.ini will be changed manually if err := DeleteScheduleTaskByRepo(ctx, repo.ID); err != nil { return fmt.Errorf("DeleteCronTaskByRepo: %v", err) } - // cancel running cron jobs of this repository and delete old schedules - if err := CancelPreviousJobs( - ctx, - repo.ID, - repo.DefaultBranch, - "", - webhook_module.HookEventSchedule, - ); err != nil { - return fmt.Errorf("CancelPreviousJobs: %v", err) + if cancelPreviousJobs { + // cancel running cron jobs of this repository and delete old schedules + if err := CancelPreviousJobs( + ctx, + repo.ID, + repo.DefaultBranch, + "", + webhook_module.HookEventSchedule, + ); err != nil { + return fmt.Errorf("CancelPreviousJobs: %v", err) + } } return nil } + +type FindScheduleOptions struct { + db.ListOptions + RepoID int64 + OwnerID int64 +} + +func (opts FindScheduleOptions) ToConds() builder.Cond { + cond := builder.NewCond() + if opts.RepoID > 0 { + cond = cond.And(builder.Eq{"repo_id": opts.RepoID}) + } + if opts.OwnerID > 0 { + cond = cond.And(builder.Eq{"owner_id": opts.OwnerID}) + } + + return cond +} + +func (opts FindScheduleOptions) ToOrders() string { + return "`id` DESC" +} diff --git a/models/actions/schedule_list.go b/models/actions/schedule_list.go deleted file mode 100644 index 5361b94801..0000000000 --- a/models/actions/schedule_list.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2023 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package actions - -import ( - "context" - - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/container" - - "xorm.io/builder" -) - -type ScheduleList []*ActionSchedule - -// GetUserIDs returns a slice of user's id -func (schedules ScheduleList) GetUserIDs() []int64 { - return container.FilterSlice(schedules, func(schedule *ActionSchedule) (int64, bool) { - return schedule.TriggerUserID, true - }) -} - -func (schedules ScheduleList) GetRepoIDs() []int64 { - return container.FilterSlice(schedules, func(schedule *ActionSchedule) (int64, bool) { - return schedule.RepoID, true - }) -} - -func (schedules ScheduleList) LoadTriggerUser(ctx context.Context) error { - userIDs := schedules.GetUserIDs() - users := make(map[int64]*user_model.User, len(userIDs)) - if err := db.GetEngine(ctx).In("id", userIDs).Find(&users); err != nil { - return err - } - for _, schedule := range schedules { - if schedule.TriggerUserID == user_model.ActionsUserID { - schedule.TriggerUser = user_model.NewActionsUser() - } else { - schedule.TriggerUser = users[schedule.TriggerUserID] - if schedule.TriggerUser == nil { - schedule.TriggerUser = user_model.NewGhostUser() - } - } - } - return nil -} - -func (schedules ScheduleList) LoadRepos(ctx context.Context) error { - repoIDs := schedules.GetRepoIDs() - repos, err := repo_model.GetRepositoriesMapByIDs(ctx, repoIDs) - if err != nil { - return err - } - for _, schedule := range schedules { - schedule.Repo = repos[schedule.RepoID] - } - return nil -} - -type FindScheduleOptions struct { - db.ListOptions - RepoID int64 - OwnerID int64 -} - -func (opts FindScheduleOptions) ToConds() builder.Cond { - cond := builder.NewCond() - if opts.RepoID > 0 { - cond = cond.And(builder.Eq{"repo_id": opts.RepoID}) - } - if opts.OwnerID > 0 { - cond = cond.And(builder.Eq{"owner_id": opts.OwnerID}) - } - - return cond -} - -func (opts FindScheduleOptions) ToOrders() string { - return "`id` DESC" -} diff --git a/models/actions/schedule_spec.go b/models/actions/schedule_spec.go index 923e5f7807..83bdceb850 100644 --- a/models/actions/schedule_spec.go +++ b/models/actions/schedule_spec.go @@ -8,9 +8,9 @@ import ( "strings" "time" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/modules/timeutil" "github.com/robfig/cron/v3" ) diff --git a/models/actions/schedule_spec_list.go b/models/actions/schedule_spec_list.go index 4dc43f975b..0a09a60acb 100644 --- a/models/actions/schedule_spec_list.go +++ b/models/actions/schedule_spec_list.go @@ -6,9 +6,9 @@ package actions import ( "context" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/modules/container" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/modules/container" "xorm.io/builder" ) @@ -36,7 +36,7 @@ func (specs SpecList) LoadSchedules(ctx context.Context) error { } repoIDs := specs.GetRepoIDs() - repos, err := GetReposMapByIDs(ctx, repoIDs) + repos, err := repo_model.GetRepositoriesMapByIDs(ctx, repoIDs) if err != nil { return err } diff --git a/models/actions/status.go b/models/actions/status.go index eda2234137..f4357af731 100644 --- a/models/actions/status.go +++ b/models/actions/status.go @@ -4,7 +4,7 @@ package actions import ( - "code.gitea.io/gitea/modules/translation" + "forgejo.org/modules/translation" runnerv1 "code.gitea.io/actions-proto-go/runner/v1" ) diff --git a/models/actions/task.go b/models/actions/task.go index 8d41a631aa..63cbc6e586 100644 --- a/models/actions/task.go +++ b/models/actions/task.go @@ -9,14 +9,13 @@ import ( "fmt" "time" - auth_model "code.gitea.io/gitea/models/auth" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unit" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + auth_model "forgejo.org/models/auth" + "forgejo.org/models/db" + "forgejo.org/models/unit" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" runnerv1 "code.gitea.io/actions-proto-go/runner/v1" lru "github.com/hashicorp/golang-lru/v2" @@ -245,7 +244,7 @@ func CreateTaskForRunner(ctx context.Context, runner *ActionRunner) (*ActionTask var job *ActionRunJob log.Trace("runner labels: %v", runner.AgentLabels) for _, v := range jobs { - if isSubset(runner.AgentLabels, v.RunsOn) { + if v.ItRunsOn(runner.AgentLabels) { job = v break } @@ -341,7 +340,7 @@ func UpdateTask(ctx context.Context, task *ActionTask, cols ...string) error { // UpdateTaskByState updates the task by the state. // It will always update the task if the state is not final, even there is no change. // So it will update ActionTask.Updated to avoid the task being judged as a zombie task. -func UpdateTaskByState(ctx context.Context, state *runnerv1.TaskState) (*ActionTask, error) { +func UpdateTaskByState(ctx context.Context, runnerID int64, state *runnerv1.TaskState) (*ActionTask, error) { stepStates := map[int64]*runnerv1.StepState{} for _, v := range state.Steps { stepStates[v.Id] = v @@ -360,6 +359,8 @@ func UpdateTaskByState(ctx context.Context, state *runnerv1.TaskState) (*ActionT return nil, err } else if !has { return nil, util.ErrNotExist + } else if runnerID != task.RunnerID { + return nil, fmt.Errorf("invalid runner for task") } if task.Status.IsDone() { @@ -480,20 +481,6 @@ func FindOldTasksToExpire(ctx context.Context, olderThan timeutil.TimeStamp, lim Find(&tasks) } -func isSubset(set, subset []string) bool { - m := make(container.Set[string], len(set)) - for _, v := range set { - m.Add(v) - } - - for _, v := range subset { - if !m.Contains(v) { - return false - } - } - return true -} - func convertTimestamp(timestamp *timestamppb.Timestamp) timeutil.TimeStamp { if timestamp.GetSeconds() == 0 && timestamp.GetNanos() == 0 { return timeutil.TimeStamp(0) diff --git a/models/actions/task_list.go b/models/actions/task_list.go index df4b43c5ef..fe4c028c2c 100644 --- a/models/actions/task_list.go +++ b/models/actions/task_list.go @@ -6,9 +6,9 @@ package actions import ( "context" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/modules/container" + "forgejo.org/modules/timeutil" "xorm.io/builder" ) @@ -50,7 +50,7 @@ type FindTaskOptions struct { RepoID int64 OwnerID int64 CommitSHA string - Status Status + Status []Status UpdatedBefore timeutil.TimeStamp StartedBefore timeutil.TimeStamp RunnerID int64 @@ -67,8 +67,8 @@ func (opts FindTaskOptions) ToConds() builder.Cond { if opts.CommitSHA != "" { cond = cond.And(builder.Eq{"commit_sha": opts.CommitSHA}) } - if opts.Status > StatusUnknown { - cond = cond.And(builder.Eq{"status": opts.Status}) + if opts.Status != nil { + cond = cond.And(builder.In("status", opts.Status)) } if opts.UpdatedBefore > 0 { cond = cond.And(builder.Lt{"updated": opts.UpdatedBefore}) diff --git a/models/actions/task_output.go b/models/actions/task_output.go index eab5b93118..fa13cadd53 100644 --- a/models/actions/task_output.go +++ b/models/actions/task_output.go @@ -6,7 +6,7 @@ package actions import ( "context" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" ) // ActionTaskOutput represents an output of ActionTask. diff --git a/models/actions/task_step.go b/models/actions/task_step.go index 3af1fe3f5a..1f20157271 100644 --- a/models/actions/task_step.go +++ b/models/actions/task_step.go @@ -7,8 +7,8 @@ import ( "context" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/modules/timeutil" ) // ActionTaskStep represents a step of ActionTask diff --git a/models/actions/tasks_version.go b/models/actions/tasks_version.go index d8df353593..a5c357888f 100644 --- a/models/actions/tasks_version.go +++ b/models/actions/tasks_version.go @@ -6,9 +6,9 @@ package actions import ( "context" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/modules/log" + "forgejo.org/modules/timeutil" ) // ActionTasksVersion diff --git a/models/actions/utils.go b/models/actions/utils.go index 12657942fc..7dd3f7ec12 100644 --- a/models/actions/utils.go +++ b/models/actions/utils.go @@ -12,9 +12,9 @@ import ( "io" "time" - auth_model "code.gitea.io/gitea/models/auth" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + auth_model "forgejo.org/models/auth" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" ) func generateSaltedToken() (string, string, string, string, error) { diff --git a/models/actions/utils_test.go b/models/actions/utils_test.go index 98c048d4ef..af6fd04a6a 100644 --- a/models/actions/utils_test.go +++ b/models/actions/utils_test.go @@ -8,7 +8,7 @@ import ( "testing" "time" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/actions/variable.go b/models/actions/variable.go index d0f917d923..203065487c 100644 --- a/models/actions/variable.go +++ b/models/actions/variable.go @@ -7,9 +7,9 @@ import ( "context" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/modules/log" + "forgejo.org/modules/timeutil" "xorm.io/builder" ) @@ -86,7 +86,7 @@ func FindVariables(ctx context.Context, opts FindVariablesOpts) ([]*ActionVariab } func UpdateVariable(ctx context.Context, variable *ActionVariable) (bool, error) { - count, err := db.GetEngine(ctx).ID(variable.ID).Cols("name", "data"). + count, err := db.GetEngine(ctx).ID(variable.ID).Where("owner_id = ? AND repo_id = ?", variable.OwnerID, variable.RepoID).Cols("name", "data"). Update(&ActionVariable{ Name: variable.Name, Data: variable.Data, @@ -94,11 +94,9 @@ func UpdateVariable(ctx context.Context, variable *ActionVariable) (bool, error) return count != 0, err } -func DeleteVariable(ctx context.Context, id int64) error { - if _, err := db.DeleteByID[ActionVariable](ctx, id); err != nil { - return err - } - return nil +func DeleteVariable(ctx context.Context, variableID, ownerID, repoID int64) (bool, error) { + count, err := db.GetEngine(ctx).Table("action_variable").Where("id = ? AND owner_id = ? AND repo_id = ?", variableID, ownerID, repoID).Delete() + return count != 0, err } func GetVariablesOfRun(ctx context.Context, run *ActionRun) (map[string]string, error) { diff --git a/models/activities/action.go b/models/activities/action.go index b6c816f096..ef99132e6c 100644 --- a/models/activities/action.go +++ b/models/activities/action.go @@ -14,20 +14,20 @@ import ( "strings" "time" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/models/organization" - access_model "code.gitea.io/gitea/models/perm/access" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unit" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/base" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + "forgejo.org/models/organization" + access_model "forgejo.org/models/perm/access" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unit" + user_model "forgejo.org/models/user" + "forgejo.org/modules/base" + "forgejo.org/modules/container" + "forgejo.org/modules/git" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/structs" + "forgejo.org/modules/timeutil" "xorm.io/builder" "xorm.io/xorm/schemas" @@ -250,6 +250,9 @@ func (a *Action) GetActDisplayNameTitle(ctx context.Context) string { // GetRepoUserName returns the name of the action repository owner. func (a *Action) GetRepoUserName(ctx context.Context) string { a.loadRepo(ctx) + if a.Repo == nil { + return "(non-existing-repo)" + } return a.Repo.OwnerName } @@ -262,6 +265,9 @@ func (a *Action) ShortRepoUserName(ctx context.Context) string { // GetRepoName returns the name of the action repository. func (a *Action) GetRepoName(ctx context.Context) string { a.loadRepo(ctx) + if a.Repo == nil { + return "(non-existing-repo)" + } return a.Repo.Name } diff --git a/models/activities/action_list.go b/models/activities/action_list.go index aafb7f8a26..64b92bbda1 100644 --- a/models/activities/action_list.go +++ b/models/activities/action_list.go @@ -8,12 +8,12 @@ import ( "fmt" "strconv" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/container" + "forgejo.org/modules/util" "xorm.io/builder" ) diff --git a/models/activities/action_test.go b/models/activities/action_test.go index 4ce030dd48..ebc40cffa5 100644 --- a/models/activities/action_test.go +++ b/models/activities/action_test.go @@ -8,13 +8,13 @@ import ( "path" "testing" - activities_model "code.gitea.io/gitea/models/activities" - "code.gitea.io/gitea/models/db" - issue_model "code.gitea.io/gitea/models/issues" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/setting" + activities_model "forgejo.org/models/activities" + "forgejo.org/models/db" + issue_model "forgejo.org/models/issues" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/activities/main_test.go b/models/activities/main_test.go index 43afb84ef1..a5245ab1d3 100644 --- a/models/activities/main_test.go +++ b/models/activities/main_test.go @@ -6,10 +6,11 @@ package activities_test import ( "testing" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/unittest" - _ "code.gitea.io/gitea/models" - _ "code.gitea.io/gitea/models/actions" + _ "forgejo.org/models" + _ "forgejo.org/models/actions" + _ "forgejo.org/models/forgefed" ) func TestMain(m *testing.M) { diff --git a/models/activities/notification.go b/models/activities/notification.go index 09cc640224..4d13900459 100644 --- a/models/activities/notification.go +++ b/models/activities/notification.go @@ -9,14 +9,14 @@ import ( "net/url" "strconv" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/models/organization" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + "forgejo.org/models/organization" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) diff --git a/models/activities/notification_list.go b/models/activities/notification_list.go index 32d2a5c051..9b09dde7ab 100644 --- a/models/activities/notification_list.go +++ b/models/activities/notification_list.go @@ -6,14 +6,14 @@ package activities import ( "context" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - access_model "code.gitea.io/gitea/models/perm/access" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unit" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/log" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + access_model "forgejo.org/models/perm/access" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unit" + user_model "forgejo.org/models/user" + "forgejo.org/modules/container" + "forgejo.org/modules/log" "xorm.io/builder" ) diff --git a/models/activities/notification_test.go b/models/activities/notification_test.go index 3ff223d870..305a2ae430 100644 --- a/models/activities/notification_test.go +++ b/models/activities/notification_test.go @@ -7,11 +7,11 @@ import ( "context" "testing" - activities_model "code.gitea.io/gitea/models/activities" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" + activities_model "forgejo.org/models/activities" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/activities/repo_activity.go b/models/activities/repo_activity.go index ba5e4959f0..3d15c22e19 100644 --- a/models/activities/repo_activity.go +++ b/models/activities/repo_activity.go @@ -9,12 +9,12 @@ import ( "sort" "time" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/gitrepo" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/git" + "forgejo.org/modules/gitrepo" "xorm.io/xorm" ) @@ -34,6 +34,7 @@ type ActivityStats struct { OpenedPRAuthorCount int64 MergedPRs issues_model.PullRequestList MergedPRAuthorCount int64 + ActiveIssues issues_model.IssueList OpenedIssues issues_model.IssueList OpenedIssueAuthorCount int64 ClosedIssues issues_model.IssueList @@ -172,7 +173,7 @@ func (stats *ActivityStats) MergedPRPerc() int { // ActiveIssueCount returns total active issue count func (stats *ActivityStats) ActiveIssueCount() int { - return stats.OpenedIssueCount() + stats.ClosedIssueCount() + return len(stats.ActiveIssues) } // OpenedIssueCount returns open issue count @@ -285,13 +286,21 @@ func (stats *ActivityStats) FillIssues(ctx context.Context, repoID int64, fromTi stats.ClosedIssueAuthorCount = count // New issues - sess = issuesForActivityStatement(ctx, repoID, fromTime, false, false) + sess = newlyCreatedIssues(ctx, repoID, fromTime) sess.OrderBy("issue.created_unix ASC") stats.OpenedIssues = make(issues_model.IssueList, 0) if err = sess.Find(&stats.OpenedIssues); err != nil { return err } + // Active issues + sess = activeIssues(ctx, repoID, fromTime) + sess.OrderBy("issue.created_unix ASC") + stats.ActiveIssues = make(issues_model.IssueList, 0) + if err = sess.Find(&stats.ActiveIssues); err != nil { + return err + } + // Opened issue authors sess = issuesForActivityStatement(ctx, repoID, fromTime, false, false) if _, err = sess.Select("count(distinct issue.poster_id) as `count`").Table("issue").Get(&count); err != nil { @@ -317,6 +326,22 @@ func (stats *ActivityStats) FillUnresolvedIssues(ctx context.Context, repoID int return sess.Find(&stats.UnresolvedIssues) } +func newlyCreatedIssues(ctx context.Context, repoID int64, fromTime time.Time) *xorm.Session { + sess := db.GetEngine(ctx).Where("issue.repo_id = ?", repoID). + And("issue.is_pull = ?", false). // Retain the is_pull check to exclude pull requests + And("issue.created_unix >= ?", fromTime.Unix()) // Include all issues created after fromTime + + return sess +} + +func activeIssues(ctx context.Context, repoID int64, fromTime time.Time) *xorm.Session { + sess := db.GetEngine(ctx).Where("issue.repo_id = ?", repoID). + And("issue.is_pull = ?", false). + And("issue.created_unix >= ? OR issue.closed_unix >= ?", fromTime.Unix(), fromTime.Unix()) + + return sess +} + func issuesForActivityStatement(ctx context.Context, repoID int64, fromTime time.Time, closed, unresolved bool) *xorm.Session { sess := db.GetEngine(ctx).Where("issue.repo_id = ?", repoID). And("issue.is_closed = ?", closed) diff --git a/models/activities/repo_activity_test.go b/models/activities/repo_activity_test.go new file mode 100644 index 0000000000..c111c50208 --- /dev/null +++ b/models/activities/repo_activity_test.go @@ -0,0 +1,30 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package activities + +import ( + "testing" + "time" + + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestGetActivityStats(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + + stats, err := GetActivityStats(db.DefaultContext, repo, time.Unix(0, 0), true, true, true, true) + require.NoError(t, err) + + assert.EqualValues(t, 2, stats.ActiveIssueCount()) + assert.EqualValues(t, 2, stats.OpenedIssueCount()) + assert.EqualValues(t, 0, stats.ClosedIssueCount()) + assert.EqualValues(t, 3, stats.ActivePRCount()) +} diff --git a/models/activities/statistic.go b/models/activities/statistic.go index ff81ad78a1..4c15cb2898 100644 --- a/models/activities/statistic.go +++ b/models/activities/statistic.go @@ -6,18 +6,18 @@ package activities import ( "context" - asymkey_model "code.gitea.io/gitea/models/asymkey" - "code.gitea.io/gitea/models/auth" - "code.gitea.io/gitea/models/db" - git_model "code.gitea.io/gitea/models/git" - issues_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/models/organization" - access_model "code.gitea.io/gitea/models/perm/access" - project_model "code.gitea.io/gitea/models/project" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/models/webhook" - "code.gitea.io/gitea/modules/setting" + asymkey_model "forgejo.org/models/asymkey" + "forgejo.org/models/auth" + "forgejo.org/models/db" + git_model "forgejo.org/models/git" + issues_model "forgejo.org/models/issues" + "forgejo.org/models/organization" + access_model "forgejo.org/models/perm/access" + project_model "forgejo.org/models/project" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/models/webhook" + "forgejo.org/modules/setting" ) // Statistic contains the database statistics diff --git a/models/activities/user_heatmap.go b/models/activities/user_heatmap.go index 080075d793..0cc3f759c6 100644 --- a/models/activities/user_heatmap.go +++ b/models/activities/user_heatmap.go @@ -6,11 +6,11 @@ package activities import ( "context" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/organization" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/models/organization" + user_model "forgejo.org/models/user" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" ) // UserHeatmapData represents the data needed to create a heatmap diff --git a/models/activities/user_heatmap_test.go b/models/activities/user_heatmap_test.go index 316ea7d76e..d922f9a78b 100644 --- a/models/activities/user_heatmap_test.go +++ b/models/activities/user_heatmap_test.go @@ -7,12 +7,12 @@ import ( "testing" "time" - activities_model "code.gitea.io/gitea/models/activities" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/timeutil" + activities_model "forgejo.org/models/activities" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/json" + "forgejo.org/modules/timeutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -96,6 +96,6 @@ func TestGetUserHeatmapDataByUser(t *testing.T) { // Test JSON rendering jsonData, err := json.Marshal(heatmap) require.NoError(t, err) - assert.Equal(t, tc.JSONResult, string(jsonData)) + assert.JSONEq(t, tc.JSONResult, string(jsonData)) } } diff --git a/models/admin/task.go b/models/admin/task.go index c8bc95f981..b4e1ac0134 100644 --- a/models/admin/task.go +++ b/models/admin/task.go @@ -7,16 +7,16 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/migration" - "code.gitea.io/gitea/modules/secret" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/json" + "forgejo.org/modules/migration" + "forgejo.org/modules/secret" + "forgejo.org/modules/setting" + "forgejo.org/modules/structs" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" ) // Task represents a task @@ -44,7 +44,7 @@ func init() { // TranslatableMessage represents JSON struct that can be translated with a Locale type TranslatableMessage struct { Format string - Args []any `json:"omitempty"` + Args []any `json:",omitempty"` } // LoadRepo loads repository of the task diff --git a/models/asymkey/error.go b/models/asymkey/error.go index 03bc82302f..fc0dd88232 100644 --- a/models/asymkey/error.go +++ b/models/asymkey/error.go @@ -6,7 +6,7 @@ package asymkey import ( "fmt" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/util" ) // ErrKeyUnableVerify represents a "KeyUnableVerify" kind of error. @@ -192,28 +192,6 @@ func (err ErrGPGKeyIDAlreadyUsed) Unwrap() error { return util.ErrAlreadyExist } -// ErrGPGKeyAccessDenied represents a "GPGKeyAccessDenied" kind of Error. -type ErrGPGKeyAccessDenied struct { - UserID int64 - KeyID int64 -} - -// IsErrGPGKeyAccessDenied checks if an error is a ErrGPGKeyAccessDenied. -func IsErrGPGKeyAccessDenied(err error) bool { - _, ok := err.(ErrGPGKeyAccessDenied) - return ok -} - -// Error pretty-prints an error of type ErrGPGKeyAccessDenied. -func (err ErrGPGKeyAccessDenied) Error() string { - return fmt.Sprintf("user does not have access to the key [user_id: %d, key_id: %d]", - err.UserID, err.KeyID) -} - -func (err ErrGPGKeyAccessDenied) Unwrap() error { - return util.ErrPermissionDenied -} - // ErrKeyAccessDenied represents a "KeyAccessDenied" kind of error. type ErrKeyAccessDenied struct { UserID int64 diff --git a/models/asymkey/gpg_key.go b/models/asymkey/gpg_key.go index 6e2914e476..b7e10ce85c 100644 --- a/models/asymkey/gpg_key.go +++ b/models/asymkey/gpg_key.go @@ -9,9 +9,9 @@ import ( "strings" "time" - "code.gitea.io/gitea/models/db" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + user_model "forgejo.org/models/user" + "forgejo.org/modules/timeutil" "github.com/ProtonMail/go-crypto/openpgp" "github.com/ProtonMail/go-crypto/openpgp/packet" diff --git a/models/asymkey/gpg_key_add.go b/models/asymkey/gpg_key_add.go index 6c0f6e01a7..06cfd09a3e 100644 --- a/models/asymkey/gpg_key_add.go +++ b/models/asymkey/gpg_key_add.go @@ -7,8 +7,8 @@ import ( "context" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/log" + "forgejo.org/models/db" + "forgejo.org/modules/log" "github.com/ProtonMail/go-crypto/openpgp" ) diff --git a/models/asymkey/gpg_key_commit_verification.go b/models/asymkey/gpg_key_commit_verification.go index 9aa606405e..73b066b17c 100644 --- a/models/asymkey/gpg_key_commit_verification.go +++ b/models/asymkey/gpg_key_commit_verification.go @@ -6,9 +6,9 @@ package asymkey import ( "context" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/git" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/git" ) // __________________ ________ ____ __. diff --git a/models/asymkey/gpg_key_import.go b/models/asymkey/gpg_key_import.go index c9d46d29e5..8a63ea4a35 100644 --- a/models/asymkey/gpg_key_import.go +++ b/models/asymkey/gpg_key_import.go @@ -6,7 +6,7 @@ package asymkey import ( "context" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" ) // __________________ ________ ____ __. diff --git a/models/asymkey/gpg_key_list.go b/models/asymkey/gpg_key_list.go index 89548e495e..b2d4fb11f6 100644 --- a/models/asymkey/gpg_key_list.go +++ b/models/asymkey/gpg_key_list.go @@ -6,7 +6,7 @@ package asymkey import ( "context" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" ) type GPGKeyList []*GPGKey diff --git a/models/asymkey/gpg_key_object_verification.go b/models/asymkey/gpg_key_object_verification.go index 24d72a52c1..407a29c221 100644 --- a/models/asymkey/gpg_key_object_verification.go +++ b/models/asymkey/gpg_key_object_verification.go @@ -10,12 +10,12 @@ import ( "hash" "strings" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/git" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" "github.com/ProtonMail/go-crypto/openpgp/packet" ) diff --git a/models/asymkey/gpg_key_tag_verification.go b/models/asymkey/gpg_key_tag_verification.go index 5fd3983e54..f054525e8f 100644 --- a/models/asymkey/gpg_key_tag_verification.go +++ b/models/asymkey/gpg_key_tag_verification.go @@ -6,7 +6,7 @@ package asymkey import ( "context" - "code.gitea.io/gitea/modules/git" + "forgejo.org/modules/git" ) func ParseTagWithSignature(ctx context.Context, gitRepo *git.Repository, t *git.Tag) *ObjectVerification { diff --git a/models/asymkey/gpg_key_test.go b/models/asymkey/gpg_key_test.go index e9aa9cf5ec..4db07b84c2 100644 --- a/models/asymkey/gpg_key_test.go +++ b/models/asymkey/gpg_key_test.go @@ -7,11 +7,11 @@ import ( "testing" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "github.com/ProtonMail/go-crypto/openpgp/packet" "github.com/stretchr/testify/assert" diff --git a/models/asymkey/gpg_key_verify.go b/models/asymkey/gpg_key_verify.go index 01812a2d54..2b5ea7a1ac 100644 --- a/models/asymkey/gpg_key_verify.go +++ b/models/asymkey/gpg_key_verify.go @@ -8,10 +8,10 @@ import ( "strconv" "time" - "code.gitea.io/gitea/models/db" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/base" - "code.gitea.io/gitea/modules/log" + "forgejo.org/models/db" + user_model "forgejo.org/models/user" + "forgejo.org/modules/base" + "forgejo.org/modules/log" ) // __________________ ________ ____ __. diff --git a/models/asymkey/main_test.go b/models/asymkey/main_test.go index 87b5c22c4a..316e8f1d54 100644 --- a/models/asymkey/main_test.go +++ b/models/asymkey/main_test.go @@ -6,7 +6,7 @@ package asymkey import ( "testing" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/unittest" ) func TestMain(m *testing.M) { diff --git a/models/asymkey/ssh_key.go b/models/asymkey/ssh_key.go index 7a18732c32..7f76009e7f 100644 --- a/models/asymkey/ssh_key.go +++ b/models/asymkey/ssh_key.go @@ -10,13 +10,13 @@ import ( "strings" "time" - "code.gitea.io/gitea/models/auth" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/perm" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/auth" + "forgejo.org/models/db" + "forgejo.org/models/perm" + user_model "forgejo.org/models/user" + "forgejo.org/modules/log" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "golang.org/x/crypto/ssh" "xorm.io/builder" diff --git a/models/asymkey/ssh_key_authorized_keys.go b/models/asymkey/ssh_key_authorized_keys.go index d3f9f3f3be..d3bf6fe886 100644 --- a/models/asymkey/ssh_key_authorized_keys.go +++ b/models/asymkey/ssh_key_authorized_keys.go @@ -14,10 +14,10 @@ import ( "sync" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" ) // _____ __ .__ .__ .___ @@ -87,19 +87,16 @@ func appendAuthorizedKeysToFile(keys ...*PublicKey) error { } defer f.Close() - // Note: chmod command does not support in Windows. - if !setting.IsWindows { - fi, err := f.Stat() - if err != nil { - return err - } + fi, err := f.Stat() + if err != nil { + return err + } - // .ssh directory should have mode 700, and authorized_keys file should have mode 600. - if fi.Mode().Perm() > 0o600 { - log.Error("authorized_keys file has unusual permission flags: %s - setting to -rw-------", fi.Mode().Perm().String()) - if err = f.Chmod(0o600); err != nil { - return err - } + // .ssh directory should have mode 700, and authorized_keys file should have mode 600. + if fi.Mode().Perm() > 0o600 { + log.Error("authorized_keys file has unusual permission flags: %s - setting to -rw-------", fi.Mode().Perm().String()) + if err = f.Chmod(0o600); err != nil { + return err } } diff --git a/models/asymkey/ssh_key_authorized_principals.go b/models/asymkey/ssh_key_authorized_principals.go index f85de12aae..0b4fe13ba7 100644 --- a/models/asymkey/ssh_key_authorized_principals.go +++ b/models/asymkey/ssh_key_authorized_principals.go @@ -13,10 +13,10 @@ import ( "strings" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" ) // _____ __ .__ .__ .___ diff --git a/models/asymkey/ssh_key_deploy.go b/models/asymkey/ssh_key_deploy.go index 923c5020ed..22e80840af 100644 --- a/models/asymkey/ssh_key_deploy.go +++ b/models/asymkey/ssh_key_deploy.go @@ -8,9 +8,9 @@ import ( "fmt" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/perm" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/models/perm" + "forgejo.org/modules/timeutil" "xorm.io/builder" ) @@ -105,14 +105,6 @@ func addDeployKey(ctx context.Context, keyID, repoID int64, name, fingerprint st return key, db.Insert(ctx, key) } -// HasDeployKey returns true if public key is a deploy key of given repository. -func HasDeployKey(ctx context.Context, keyID, repoID int64) bool { - has, _ := db.GetEngine(ctx). - Where("key_id = ? AND repo_id = ?", keyID, repoID). - Get(new(DeployKey)) - return has -} - // AddDeployKey add new deploy key to database and authorized_keys file. func AddDeployKey(ctx context.Context, repoID int64, name, content string, readOnly bool) (*DeployKey, error) { fingerprint, err := CalcFingerprint(content) diff --git a/models/asymkey/ssh_key_fingerprint.go b/models/asymkey/ssh_key_fingerprint.go index 1ed3b5df2a..11112e4bc3 100644 --- a/models/asymkey/ssh_key_fingerprint.go +++ b/models/asymkey/ssh_key_fingerprint.go @@ -8,11 +8,11 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/process" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/log" + "forgejo.org/modules/process" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" "golang.org/x/crypto/ssh" "xorm.io/builder" diff --git a/models/asymkey/ssh_key_object_verification.go b/models/asymkey/ssh_key_object_verification.go index 5ad6fdb0a9..e0476fe5a8 100644 --- a/models/asymkey/ssh_key_object_verification.go +++ b/models/asymkey/ssh_key_object_verification.go @@ -9,9 +9,9 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/models/db" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/log" + "forgejo.org/models/db" + user_model "forgejo.org/models/user" + "forgejo.org/modules/log" "github.com/42wim/sshsig" ) diff --git a/models/asymkey/ssh_key_object_verification_test.go b/models/asymkey/ssh_key_object_verification_test.go index 0d5ebabb70..5d1b7edc27 100644 --- a/models/asymkey/ssh_key_object_verification_test.go +++ b/models/asymkey/ssh_key_object_verification_test.go @@ -6,12 +6,12 @@ package asymkey import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/test" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/git" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/asymkey/ssh_key_parse.go b/models/asymkey/ssh_key_parse.go index 94b1cf112b..305e464b4b 100644 --- a/models/asymkey/ssh_key_parse.go +++ b/models/asymkey/ssh_key_parse.go @@ -16,10 +16,10 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/process" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/process" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" "golang.org/x/crypto/ssh" ) @@ -219,8 +219,13 @@ func SSHNativeParsePublicKey(keyLine string) (string, int, error) { return "", 0, fmt.Errorf("ParsePublicKey: %w", err) } + pkeyType := pkey.Type() + if certPkey, ok := pkey.(*ssh.Certificate); ok { + pkeyType = certPkey.Key.Type() + } + // The ssh library can parse the key, so next we find out what key exactly we have. - switch pkey.Type() { + switch pkeyType { case ssh.KeyAlgoDSA: rawPub := struct { Name string diff --git a/models/asymkey/ssh_key_principals.go b/models/asymkey/ssh_key_principals.go index 4e7dee2c91..ba2a1a8c7d 100644 --- a/models/asymkey/ssh_key_principals.go +++ b/models/asymkey/ssh_key_principals.go @@ -8,11 +8,11 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/perm" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/models/perm" + user_model "forgejo.org/models/user" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" ) // AddPrincipalKey adds new principal to database and authorized_principals file. diff --git a/models/asymkey/ssh_key_test.go b/models/asymkey/ssh_key_test.go index 2625d6ac91..f3c3e41955 100644 --- a/models/asymkey/ssh_key_test.go +++ b/models/asymkey/ssh_key_test.go @@ -12,9 +12,9 @@ import ( "strings" "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + "forgejo.org/modules/setting" "github.com/42wim/sshsig" "github.com/stretchr/testify/assert" @@ -35,6 +35,7 @@ func Test_SSHParsePublicKey(t *testing.T) { {"ecdsa-384", false, "ecdsa", 384, "ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBINmioV+XRX1Fm9Qk2ehHXJ2tfVxW30ypUWZw670Zyq5GQfBAH6xjygRsJ5wWsHXBsGYgFUXIHvMKVAG1tpw7s6ax9oA+dJOJ7tj+vhn8joFqT+sg3LYHgZkHrfqryRasQ== nocomment"}, {"ecdsa-sk", true, "ecdsa-sk", 256, "sk-ecdsa-sha2-nistp256@openssh.com AAAAInNrLWVjZHNhLXNoYTItbmlzdHAyNTZAb3BlbnNzaC5jb20AAAAIbmlzdHAyNTYAAABBBGXEEzWmm1dxb+57RoK5KVCL0w2eNv9cqJX2AGGVlkFsVDhOXHzsadS3LTK4VlEbbrDMJdoti9yM8vclA8IeRacAAAAEc3NoOg== nocomment"}, {"ed25519-sk", true, "ed25519-sk", 256, "sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIE7kM1R02+4ertDKGKEDcKG0s+2vyDDcIvceJ0Gqv5f1AAAABHNzaDo= nocomment"}, + {"ed25519-cert-v01", true, "ed25519", 256, "ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIAlIAPlEj0mYQzQo8Ks0Nm/Ct8ceNkyJSf4DLuF5l7+5AAAAIEuWAoaBo2tT29/oMNnoDfdAPRCIdM2RGapKUhY4nDfLRgPQwfnRoc0AAAABAAAAcHZhdWx0LW9pZGMtNmRhYjdiZDgtNDg5YS00MDFkLTg3ZmItNjdjNTlhMDZkZDkxLTNjNTk2M2YyMGRmMDM3MDkyMzc1YmNiYmNiNzkxY2EyZWIxM2I0NGZhMzc2NTcwMWI0MjMwODU0MWFmNjhkNTgAAAALAAAAB2Zvcmdlam8AAAAAZ6/RUQAAAABn115vAAAAAAAAAAAAAAAAAAACFwAAAAdzc2gtcnNhAAAAAwEAAQAAAgEAySnM/TvD117GyKgOgMatDB2t+fCHORFaWVmH5SaadAzNJ2DfDAauRSLfnim1xdgAOMTzsPEEHH47zyYMjE85o2AiJxrfUBMw3O/7AbNc6+HyLr/txH4+vD9tWQknKnpVWM+3Z9wiHDcOdKRoXCmFZKJH1vxs16GNWjwbrfNiimv7Oi0fadgvTDKX603gpLTuVDXqs9eQFLCONptei86JYBAJqaHvg51k8YUCKt9WFqKAj7BJUWmrDvhv5VFMOsnZieJjqxkoxnpsQNlXfPzxK0vIpJofbYfWwscv/g9WZypHwO1ZR2PqzKm99YrSdr8w5256l0f44vsF0NSP0N7bDQEfYYnRGj8zWTYCBFD+uYF7AxIeaRUpZoTQO8MvCHOLMIDinNgEeCUvNA2v9zHl4BGq+PQjzUKAgJiKj0MZeiCDAmQ22g83ggQlB6BOrBb1fNa/S1cmTbGHQ2oAN358aqkmHVCBhPOyA2Rf65D2M2vzDlUdOsNDUIWAHk7GbwSNGDgcYfTWqtR5fTzp2MJovMh1dDUDXjOvojbhzjJtSy9+rzUYIv18aXdOitzVBgPMWdeVCZFZv4OKF+5MiqxQvedUvfiSjsdxZWLxyT1CJ88G3MzxNMS/Djm86T8h/Oa55bdvFtqpsLfvpIqq0pnXq1V/vF2j1MWwRB5z5Xh/HtEAAAIUAAAADHJzYS1zaGEyLTI1NgAAAgB2I2gzqemQl8/ETxtakALlm/2BpUcbhADcFWuoH6BCPnWHuTSwf3OayM6KXv1PQfL3YFRoi9Afrp8kVFL6DePsmKH+0BUEMz71sZ7v1ty7pwfzibItGnpTbQXhzbEiNYAFoz77rl7oaXF7pV6JNZhj3DVAB5gVA2oN5KRNVxijz+6uyuFJEw1HIl1C7GworvGwZcN7BThTEh3i72/Vntejy9Z8uGVjSFjS0rjRo2oXK1LKN0rVt66p3TmCWHouLkVnOTk0qrhLGlL2HVyo24OYHbkAAObD9b6aMDYlmluk6NsaiTKsSTsvMrbIbjtFQlh7nNyoPhZ0VMwaT1l10pDQ5uxWWZjKGIkz4xM1ZfpBszjJNPo+ivYQnTSjj9LwkbLAT9a/5LawSj80TGcLEMO+0eyPdJsP0wYmOVRFAZeRiBgwb3HrzcF6Wqr8icj1EjYkKSy9YFHGTnFBGknpdh3HGwghRXrCUwAnSM76db9pv4/qowT8LthtJ3dY5Epe0OJ1Tqm+q8bkGH4gB+7uqLSqM5pIHSKLp7lfHQBt1J6xa7H2saiweaWjU+QGTgQ2Lg+uUC5DXJrmm60CeFJ4BoGhUenDlgijbQpjH/l6330PbwefgjWtUK/pqaEA4lCoPyvJ+eF2DbYfPiAIBAFQnhVJJae4AH+XoCt29nb2j30ztg== nocomment"}, } for _, tc := range testCases { diff --git a/models/asymkey/ssh_key_verify.go b/models/asymkey/ssh_key_verify.go index 208288c77b..5dd26ccc9a 100644 --- a/models/asymkey/ssh_key_verify.go +++ b/models/asymkey/ssh_key_verify.go @@ -7,8 +7,8 @@ import ( "bytes" "context" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/log" + "forgejo.org/models/db" + "forgejo.org/modules/log" "github.com/42wim/sshsig" ) diff --git a/models/auth/TestOrphanedOAuth2Applications/oauth2_application.yaml b/models/auth/TestOrphanedOAuth2Applications/oauth2_application.yaml index b188770a30..cccb404ab1 100644 --- a/models/auth/TestOrphanedOAuth2Applications/oauth2_application.yaml +++ b/models/auth/TestOrphanedOAuth2Applications/oauth2_application.yaml @@ -23,3 +23,11 @@ redirect_uris: '["http://127.0.0.1", "https://127.0.0.1"]' created_unix: 1712358091 updated_unix: 1712358091 +- + id: 1003 + uid: 0 + name: "Global Auth source that should be kept" + client_id: "2f3467c1-7b3b-463d-ab04-2ae2b2712826" + redirect_uris: '["http://example.com/globalapp", "https://example.com/globalapp"]' + created_unix: 1732387292 + updated_unix: 1732387292 diff --git a/models/auth/access_token.go b/models/auth/access_token.go index 63331b4841..31d88c6b20 100644 --- a/models/auth/access_token.go +++ b/models/auth/access_token.go @@ -11,10 +11,10 @@ import ( "fmt" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" lru "github.com/hashicorp/golang-lru/v2" "xorm.io/builder" @@ -98,6 +98,15 @@ func init() { // NewAccessToken creates new access token. func NewAccessToken(ctx context.Context, t *AccessToken) error { + err := generateAccessToken(t) + if err != nil { + return err + } + _, err = db.GetEngine(ctx).Insert(t) + return err +} + +func generateAccessToken(t *AccessToken) error { salt, err := util.CryptoRandomString(10) if err != nil { return err @@ -110,8 +119,7 @@ func NewAccessToken(ctx context.Context, t *AccessToken) error { t.Token = hex.EncodeToString(token) t.TokenHash = HashToken(t.Token, t.TokenSalt) t.TokenLastEight = t.Token[len(t.Token)-8:] - _, err = db.GetEngine(ctx).Insert(t) - return err + return nil } // DisplayPublicOnly whether to display this as a public-only token. @@ -234,3 +242,25 @@ func DeleteAccessTokenByID(ctx context.Context, id, userID int64) error { } return nil } + +// RegenerateAccessTokenByID regenerates access token by given ID. +// It regenerates token and salt, as well as updates the creation time. +func RegenerateAccessTokenByID(ctx context.Context, id, userID int64) (*AccessToken, error) { + t := &AccessToken{} + found, err := db.GetEngine(ctx).Where("id = ? AND uid = ?", id, userID).Get(t) + if err != nil { + return nil, err + } else if !found { + return nil, ErrAccessTokenNotExist{} + } + + err = generateAccessToken(t) + if err != nil { + return nil, err + } + + // Reset the creation time, token is unused + t.UpdatedUnix = timeutil.TimeStampNow() + + return t, UpdateAccessToken(ctx, t) +} diff --git a/models/auth/access_token_scope.go b/models/auth/access_token_scope.go index 003ca5c9ab..802ad5aa07 100644 --- a/models/auth/access_token_scope.go +++ b/models/auth/access_token_scope.go @@ -7,7 +7,7 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/models/perm" + "forgejo.org/models/perm" ) // AccessTokenScopeCategory represents the scope category for an access token diff --git a/models/auth/access_token_test.go b/models/auth/access_token_test.go index e6ea4876e5..913118433c 100644 --- a/models/auth/access_token_test.go +++ b/models/auth/access_token_test.go @@ -6,9 +6,9 @@ package auth_test import ( "testing" - auth_model "code.gitea.io/gitea/models/auth" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" + auth_model "forgejo.org/models/auth" + "forgejo.org/models/db" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -131,3 +131,28 @@ func TestDeleteAccessTokenByID(t *testing.T) { require.Error(t, err) assert.True(t, auth_model.IsErrAccessTokenNotExist(err)) } + +func TestRegenerateAccessTokenByID(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + token, err := auth_model.GetAccessTokenBySHA(db.DefaultContext, "4c6f36e6cf498e2a448662f915d932c09c5a146c") + require.NoError(t, err) + + newToken, err := auth_model.RegenerateAccessTokenByID(db.DefaultContext, token.ID, 1) + require.NoError(t, err) + unittest.AssertNotExistsBean(t, &auth_model.AccessToken{ID: token.ID, UID: token.UID, TokenHash: token.TokenHash}) + newToken = &auth_model.AccessToken{ + ID: newToken.ID, + UID: newToken.UID, + TokenHash: newToken.TokenHash, + } + unittest.AssertExistsAndLoadBean(t, newToken) + + // Token has been recreated, new salt and hash, but should retain the same ID, UID, Name and Scope + assert.Equal(t, token.ID, newToken.ID) + assert.NotEqual(t, token.TokenHash, newToken.TokenHash) + assert.NotEqual(t, token.TokenSalt, newToken.TokenSalt) + assert.Equal(t, token.UID, newToken.UID) + assert.Equal(t, token.Name, newToken.Name) + assert.Equal(t, token.Scope, newToken.Scope) +} diff --git a/models/auth/auth_token.go b/models/auth/auth_token.go index 2c3ca90734..a3ac9c4c1a 100644 --- a/models/auth/auth_token.go +++ b/models/auth/auth_token.go @@ -10,17 +10,36 @@ import ( "fmt" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" ) +type AuthorizationPurpose string + +var ( + // Used to store long term authorization tokens. + LongTermAuthorization AuthorizationPurpose = "long_term_authorization" + + // Used to activate a user account. + UserActivation AuthorizationPurpose = "user_activation" + + // Used to reset the password. + PasswordReset AuthorizationPurpose = "password_reset" +) + +// Used to activate the specified email address for a user. +func EmailActivation(email string) AuthorizationPurpose { + return AuthorizationPurpose("email_activation:" + email) +} + // AuthorizationToken represents a authorization token to a user. type AuthorizationToken struct { ID int64 `xorm:"pk autoincr"` UID int64 `xorm:"INDEX"` LookupKey string `xorm:"INDEX UNIQUE"` HashedValidator string + Purpose AuthorizationPurpose `xorm:"NOT NULL DEFAULT 'long_term_authorization'"` Expiry timeutil.TimeStamp } @@ -41,7 +60,7 @@ func (authToken *AuthorizationToken) IsExpired() bool { // GenerateAuthToken generates a new authentication token for the given user. // It returns the lookup key and validator values that should be passed to the // user via a long-term cookie. -func GenerateAuthToken(ctx context.Context, userID int64, expiry timeutil.TimeStamp) (lookupKey, validator string, err error) { +func GenerateAuthToken(ctx context.Context, userID int64, expiry timeutil.TimeStamp, purpose AuthorizationPurpose) (lookupKey, validator string, err error) { // Request 64 random bytes. The first 32 bytes will be used for the lookupKey // and the other 32 bytes will be used for the validator. rBytes, err := util.CryptoRandomBytes(64) @@ -56,14 +75,15 @@ func GenerateAuthToken(ctx context.Context, userID int64, expiry timeutil.TimeSt Expiry: expiry, LookupKey: lookupKey, HashedValidator: HashValidator(rBytes[32:]), + Purpose: purpose, }) return lookupKey, validator, err } // FindAuthToken will find a authorization token via the lookup key. -func FindAuthToken(ctx context.Context, lookupKey string) (*AuthorizationToken, error) { +func FindAuthToken(ctx context.Context, lookupKey string, purpose AuthorizationPurpose) (*AuthorizationToken, error) { var authToken AuthorizationToken - has, err := db.GetEngine(ctx).Where("lookup_key = ?", lookupKey).Get(&authToken) + has, err := db.GetEngine(ctx).Where("lookup_key = ? AND purpose = ?", lookupKey, purpose).Get(&authToken) if err != nil { return nil, err } else if !has { diff --git a/models/auth/main_test.go b/models/auth/main_test.go index d772ea6b1c..b30db24483 100644 --- a/models/auth/main_test.go +++ b/models/auth/main_test.go @@ -6,13 +6,14 @@ package auth_test import ( "testing" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/unittest" - _ "code.gitea.io/gitea/models" - _ "code.gitea.io/gitea/models/actions" - _ "code.gitea.io/gitea/models/activities" - _ "code.gitea.io/gitea/models/auth" - _ "code.gitea.io/gitea/models/perm/access" + _ "forgejo.org/models" + _ "forgejo.org/models/actions" + _ "forgejo.org/models/activities" + _ "forgejo.org/models/auth" + _ "forgejo.org/models/forgefed" + _ "forgejo.org/models/perm/access" ) func TestMain(m *testing.M) { diff --git a/models/auth/oauth2.go b/models/auth/oauth2.go index 125d64b36f..fb0a451566 100644 --- a/models/auth/oauth2.go +++ b/models/auth/oauth2.go @@ -14,11 +14,11 @@ import ( "net/url" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/container" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" uuid "github.com/google/uuid" "golang.org/x/crypto/bcrypt" @@ -657,6 +657,7 @@ func CountOrphanedOAuth2Applications(ctx context.Context) (int64, error) { Table("`oauth2_application`"). Join("LEFT", "`user`", "`oauth2_application`.`uid` = `user`.`id`"). Where(builder.IsNull{"`user`.id"}). + Where(builder.Neq{"uid": 0}). // exclude instance-wide admin applications Where(builder.NotIn("`oauth2_application`.`client_id`", BuiltinApplicationsClientIDs())). Select("COUNT(`oauth2_application`.`id`)"). Count() @@ -668,6 +669,7 @@ func DeleteOrphanedOAuth2Applications(ctx context.Context) (int64, error) { From("`oauth2_application`"). Join("LEFT", "`user`", "`oauth2_application`.`uid` = `user`.`id`"). Where(builder.IsNull{"`user`.id"}). + Where(builder.Neq{"uid": 0}). // exclude instance-wide admin applications Where(builder.NotIn("`oauth2_application`.`client_id`", BuiltinApplicationsClientIDs())) b := builder.Delete(builder.In("id", subQuery)).From("`oauth2_application`") diff --git a/models/auth/oauth2_list.go b/models/auth/oauth2_list.go index c55f10b3c8..6f508833a0 100644 --- a/models/auth/oauth2_list.go +++ b/models/auth/oauth2_list.go @@ -4,7 +4,7 @@ package auth import ( - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" "xorm.io/builder" ) diff --git a/models/auth/oauth2_test.go b/models/auth/oauth2_test.go index 94b506ed48..65865c6d31 100644 --- a/models/auth/oauth2_test.go +++ b/models/auth/oauth2_test.go @@ -4,14 +4,12 @@ package auth_test import ( - "path/filepath" "slices" "testing" - auth_model "code.gitea.io/gitea/models/auth" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/setting" + auth_model "forgejo.org/models/auth" + "forgejo.org/models/db" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -275,13 +273,7 @@ func TestBuiltinApplicationsClientIDs(t *testing.T) { } func TestOrphanedOAuth2Applications(t *testing.T) { - defer unittest.OverrideFixtures( - unittest.FixturesOptions{ - Dir: filepath.Join(setting.AppWorkPath, "models/fixtures/"), - Base: setting.AppWorkPath, - Dirs: []string{"models/auth/TestOrphanedOAuth2Applications/"}, - }, - )() + defer unittest.OverrideFixtures("models/auth/TestOrphanedOAuth2Applications")() require.NoError(t, unittest.PrepareTestDatabase()) count, err := auth_model.CountOrphanedOAuth2Applications(db.DefaultContext) @@ -296,4 +288,5 @@ func TestOrphanedOAuth2Applications(t *testing.T) { require.NoError(t, err) assert.EqualValues(t, 0, count) unittest.AssertExistsIf(t, false, &auth_model.OAuth2Application{ID: 1002}) + unittest.AssertExistsIf(t, true, &auth_model.OAuth2Application{ID: 1003}) } diff --git a/models/auth/session.go b/models/auth/session.go index 75a205f702..b3724dafb6 100644 --- a/models/auth/session.go +++ b/models/auth/session.go @@ -7,8 +7,8 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/modules/timeutil" "xorm.io/builder" ) diff --git a/models/auth/session_test.go b/models/auth/session_test.go index 3b57239704..ab6415f289 100644 --- a/models/auth/session_test.go +++ b/models/auth/session_test.go @@ -7,10 +7,10 @@ import ( "testing" "time" - "code.gitea.io/gitea/models/auth" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/auth" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + "forgejo.org/modules/timeutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/auth/source.go b/models/auth/source.go index 8f7c2a89db..ecd3abc39d 100644 --- a/models/auth/source.go +++ b/models/auth/source.go @@ -9,11 +9,11 @@ import ( "fmt" "reflect" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/log" + "forgejo.org/modules/optional" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" "xorm.io/xorm" @@ -32,7 +32,7 @@ const ( PAM // 4 DLDAP // 5 OAuth2 // 6 - SSPI // 7 + _ // 7 (was SSPI) Remote // 8 ) @@ -53,7 +53,6 @@ var Names = map[Type]string{ SMTP: "SMTP", PAM: "PAM", OAuth2: "OAuth2", - SSPI: "SPNEGO with SSPI", Remote: "Remote", } @@ -178,11 +177,6 @@ func (source *Source) IsOAuth2() bool { return source.Type == OAuth2 } -// IsSSPI returns true of this source is of the SSPI type. -func (source *Source) IsSSPI() bool { - return source.Type == SSPI -} - func (source *Source) IsRemote() bool { return source.Type == Remote } @@ -216,7 +210,7 @@ func CreateSource(ctx context.Context, source *Source) error { return ErrSourceAlreadyExist{source.Name} } // Synchronization is only available with LDAP for now - if !source.IsLDAP() && !source.IsOAuth2() { + if !source.IsLDAP() { source.IsSyncEnabled = false } @@ -265,20 +259,6 @@ func (opts FindSourcesOptions) ToConds() builder.Cond { return conds } -// IsSSPIEnabled returns true if there is at least one activated login -// source of type LoginSSPI -func IsSSPIEnabled(ctx context.Context) bool { - exist, err := db.Exist[Source](ctx, FindSourcesOptions{ - IsActive: optional.Some(true), - LoginType: SSPI, - }.ToConds()) - if err != nil { - log.Error("IsSSPIEnabled: failed to query active SSPI sources: %v", err) - return false - } - return exist -} - // GetSourceByID returns login source by given ID. func GetSourceByID(ctx context.Context, id int64) (*Source, error) { source := new(Source) @@ -299,17 +279,6 @@ func GetSourceByID(ctx context.Context, id int64) (*Source, error) { return source, nil } -func GetSourceByName(ctx context.Context, name string) (*Source, error) { - source := &Source{} - has, err := db.GetEngine(ctx).Where("name = ?", name).Get(source) - if err != nil { - return nil, err - } else if !has { - return nil, ErrSourceNotExist{} - } - return source, nil -} - // UpdateSource updates a Source record in DB. func UpdateSource(ctx context.Context, source *Source) error { var originalSource *Source diff --git a/models/auth/source_test.go b/models/auth/source_test.go index 522fecc25f..ed21aef253 100644 --- a/models/auth/source_test.go +++ b/models/auth/source_test.go @@ -7,10 +7,10 @@ import ( "strings" "testing" - auth_model "code.gitea.io/gitea/models/auth" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/json" + auth_model "forgejo.org/models/auth" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + "forgejo.org/modules/json" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/auth/two_factor.go b/models/auth/two_factor.go new file mode 100644 index 0000000000..e8f19c33cc --- /dev/null +++ b/models/auth/two_factor.go @@ -0,0 +1,21 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later +package auth + +import ( + "context" +) + +// HasTwoFactorByUID returns true if the user has TOTP or WebAuthn enabled for +// their account. +func HasTwoFactorByUID(ctx context.Context, userID int64) (bool, error) { + hasTOTP, err := HasTOTPByUID(ctx, userID) + if err != nil { + return false, err + } + if hasTOTP { + return true, nil + } + + return HasWebAuthnRegistrationsByUID(ctx, userID) +} diff --git a/models/auth/two_factor_test.go b/models/auth/two_factor_test.go new file mode 100644 index 0000000000..36e0404ae2 --- /dev/null +++ b/models/auth/two_factor_test.go @@ -0,0 +1,34 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later +package auth + +import ( + "testing" + + "forgejo.org/models/unittest" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestHasTwoFactorByUID(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + t.Run("No twofactor", func(t *testing.T) { + ok, err := HasTwoFactorByUID(t.Context(), 2) + require.NoError(t, err) + assert.False(t, ok) + }) + + t.Run("WebAuthn credential", func(t *testing.T) { + ok, err := HasTwoFactorByUID(t.Context(), 32) + require.NoError(t, err) + assert.True(t, ok) + }) + + t.Run("TOTP", func(t *testing.T) { + ok, err := HasTwoFactorByUID(t.Context(), 24) + require.NoError(t, err) + assert.True(t, ok) + }) +} diff --git a/models/auth/twofactor.go b/models/auth/twofactor.go index d0c341a192..edff471836 100644 --- a/models/auth/twofactor.go +++ b/models/auth/twofactor.go @@ -5,19 +5,16 @@ package auth import ( "context" - "crypto/md5" "crypto/sha256" "crypto/subtle" "encoding/base32" - "encoding/base64" "encoding/hex" "fmt" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/secret" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/keying" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "github.com/pquerna/otp/totp" "golang.org/x/crypto/pbkdf2" @@ -49,9 +46,9 @@ func (err ErrTwoFactorNotEnrolled) Unwrap() error { // TwoFactor represents a two-factor authentication token. type TwoFactor struct { - ID int64 `xorm:"pk autoincr"` - UID int64 `xorm:"UNIQUE"` - Secret string + ID int64 `xorm:"pk autoincr"` + UID int64 `xorm:"UNIQUE"` + Secret []byte `xorm:"BLOB"` ScratchSalt string ScratchHash string LastUsedPasscode string `xorm:"VARCHAR(10)"` @@ -92,39 +89,35 @@ func (t *TwoFactor) VerifyScratchToken(token string) bool { return subtle.ConstantTimeCompare([]byte(t.ScratchHash), []byte(tempHash)) == 1 } -func (t *TwoFactor) getEncryptionKey() []byte { - k := md5.Sum([]byte(setting.SecretKey)) - return k[:] -} - // SetSecret sets the 2FA secret. -func (t *TwoFactor) SetSecret(secretString string) error { - secretBytes, err := secret.AesEncrypt(t.getEncryptionKey(), []byte(secretString)) - if err != nil { - return err - } - t.Secret = base64.StdEncoding.EncodeToString(secretBytes) - return nil +func (t *TwoFactor) SetSecret(secretString string) { + key := keying.DeriveKey(keying.ContextTOTP) + t.Secret = key.Encrypt([]byte(secretString), keying.ColumnAndID("secret", t.ID)) } // ValidateTOTP validates the provided passcode. func (t *TwoFactor) ValidateTOTP(passcode string) (bool, error) { - decodedStoredSecret, err := base64.StdEncoding.DecodeString(t.Secret) + key := keying.DeriveKey(keying.ContextTOTP) + secret, err := key.Decrypt(t.Secret, keying.ColumnAndID("secret", t.ID)) if err != nil { return false, err } - secretBytes, err := secret.AesDecrypt(t.getEncryptionKey(), decodedStoredSecret) - if err != nil { - return false, err - } - secretStr := string(secretBytes) - return totp.Validate(passcode, secretStr), nil + return totp.Validate(passcode, string(secret)), nil } // NewTwoFactor creates a new two-factor authentication token. -func NewTwoFactor(ctx context.Context, t *TwoFactor) error { - _, err := db.GetEngine(ctx).Insert(t) - return err +func NewTwoFactor(ctx context.Context, t *TwoFactor, secret string) error { + return db.WithTx(ctx, func(ctx context.Context) error { + sess := db.GetEngine(ctx) + _, err := sess.Insert(t) + if err != nil { + return err + } + + t.SetSecret(secret) + _, err = sess.Cols("secret").ID(t.ID).Update(t) + return err + }) } // UpdateTwoFactor updates a two-factor authentication token. @@ -146,9 +139,9 @@ func GetTwoFactorByUID(ctx context.Context, uid int64) (*TwoFactor, error) { return twofa, nil } -// HasTwoFactorByUID returns the two-factor authentication token associated with -// the user, if any. -func HasTwoFactorByUID(ctx context.Context, uid int64) (bool, error) { +// HasTOTPByUID returns the TOTP authentication token associated with +// the user, if the user has TOTP enabled for their account. +func HasTOTPByUID(ctx context.Context, uid int64) (bool, error) { return db.GetEngine(ctx).Where("uid=?", uid).Exist(&TwoFactor{}) } diff --git a/models/auth/webauthn.go b/models/auth/webauthn.go index aa13cf6cb1..5b86a6e6f2 100644 --- a/models/auth/webauthn.go +++ b/models/auth/webauthn.go @@ -8,9 +8,9 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "github.com/go-webauthn/webauthn/webauthn" ) @@ -52,10 +52,10 @@ type WebAuthnCredential struct { AAGUID []byte SignCount uint32 `xorm:"BIGINT"` CloneWarning bool - BackupEligible bool `XORM:"NOT NULL DEFAULT false"` - BackupState bool `XORM:"NOT NULL DEFAULT false"` + BackupEligible bool `xorm:"NOT NULL DEFAULT false"` + BackupState bool `xorm:"NOT NULL DEFAULT false"` // If legacy is set to true, backup_eligible and backup_state isn't set. - Legacy bool `XORM:"NOT NULL DEFAULT true"` + Legacy bool `xorm:"NOT NULL DEFAULT true"` CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` } diff --git a/models/auth/webauthn_test.go b/models/auth/webauthn_test.go index e1cd652009..abf8e34408 100644 --- a/models/auth/webauthn_test.go +++ b/models/auth/webauthn_test.go @@ -6,9 +6,9 @@ package auth_test import ( "testing" - auth_model "code.gitea.io/gitea/models/auth" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" + auth_model "forgejo.org/models/auth" + "forgejo.org/models/db" + "forgejo.org/models/unittest" "github.com/go-webauthn/webauthn/webauthn" "github.com/stretchr/testify/assert" diff --git a/models/avatars/avatar.go b/models/avatars/avatar.go index 9eb34dcbcc..ad59bd8769 100644 --- a/models/avatars/avatar.go +++ b/models/avatars/avatar.go @@ -14,10 +14,10 @@ import ( "strings" "sync/atomic" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/cache" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/db" + "forgejo.org/modules/cache" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" "code.forgejo.org/forgejo-contrib/go-libravatar" ) diff --git a/models/avatars/avatar_test.go b/models/avatars/avatar_test.go index 85c40c3fa1..7850d2c096 100644 --- a/models/avatars/avatar_test.go +++ b/models/avatars/avatar_test.go @@ -6,11 +6,11 @@ package avatars_test import ( "testing" - avatars_model "code.gitea.io/gitea/models/avatars" - "code.gitea.io/gitea/models/db" - system_model "code.gitea.io/gitea/models/system" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/setting/config" + avatars_model "forgejo.org/models/avatars" + "forgejo.org/models/db" + system_model "forgejo.org/models/system" + "forgejo.org/modules/setting" + "forgejo.org/modules/setting/config" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/avatars/main_test.go b/models/avatars/main_test.go index c721a7dc2a..bdc66954b1 100644 --- a/models/avatars/main_test.go +++ b/models/avatars/main_test.go @@ -6,11 +6,11 @@ package avatars_test import ( "testing" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/unittest" - _ "code.gitea.io/gitea/models" - _ "code.gitea.io/gitea/models/activities" - _ "code.gitea.io/gitea/models/perm/access" + _ "forgejo.org/models" + _ "forgejo.org/models/activities" + _ "forgejo.org/models/perm/access" ) func TestMain(m *testing.M) { diff --git a/models/db/collation.go b/models/db/collation.go index 39d28fa2ff..768ada89e6 100644 --- a/models/db/collation.go +++ b/models/db/collation.go @@ -8,9 +8,9 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/container" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" "xorm.io/xorm" "xorm.io/xorm/schemas" diff --git a/models/db/common.go b/models/db/common.go index f3fd3e72ae..c9b012597c 100644 --- a/models/db/common.go +++ b/models/db/common.go @@ -6,8 +6,8 @@ package db import ( "strings" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" "xorm.io/builder" ) diff --git a/models/db/context.go b/models/db/context.go index 43f612518a..35526936af 100644 --- a/models/db/context.go +++ b/models/db/context.go @@ -269,6 +269,9 @@ func FindIDs(ctx context.Context, tableName, idCol string, cond builder.Cond) ([ // DecrByIDs decreases the given column for entities of the "bean" type with one of the given ids by one // Timestamps of the entities won't be updated func DecrByIDs(ctx context.Context, ids []int64, decrCol string, bean any) error { + if len(ids) == 0 { + return nil + } _, err := GetEngine(ctx).Decr(decrCol).In("id", ids).NoAutoCondition().NoAutoTime().Update(bean) return err } diff --git a/models/db/context_committer_test.go b/models/db/context_committer_test.go index 38e91f22ed..849c5dea41 100644 --- a/models/db/context_committer_test.go +++ b/models/db/context_committer_test.go @@ -4,7 +4,7 @@ package db // it's not db_test, because this file is for testing the private type halfCommitter import ( - "fmt" + "errors" "testing" "github.com/stretchr/testify/assert" @@ -80,7 +80,7 @@ func Test_halfCommitter(t *testing.T) { testWithCommitter(mockCommitter, func(committer Committer) error { defer committer.Close() if true { - return fmt.Errorf("error") + return errors.New("error") } return committer.Commit() }) @@ -94,7 +94,7 @@ func Test_halfCommitter(t *testing.T) { testWithCommitter(mockCommitter, func(committer Committer) error { committer.Close() committer.Commit() - return fmt.Errorf("error") + return errors.New("error") }) mockCommitter.Assert(t) diff --git a/models/db/context_test.go b/models/db/context_test.go index 855f360b75..7ab327b7e9 100644 --- a/models/db/context_test.go +++ b/models/db/context_test.go @@ -7,8 +7,8 @@ import ( "context" "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/db/convert.go b/models/db/convert.go index 956e17d411..1f37e49176 100644 --- a/models/db/convert.go +++ b/models/db/convert.go @@ -8,8 +8,8 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" "xorm.io/xorm" "xorm.io/xorm/schemas" diff --git a/models/db/engine.go b/models/db/engine.go index 61649592e7..ca6576da8a 100755 --- a/models/db/engine.go +++ b/models/db/engine.go @@ -11,11 +11,12 @@ import ( "fmt" "io" "reflect" + "runtime/trace" "strings" "time" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" "xorm.io/xorm" "xorm.io/xorm/contexts" @@ -163,6 +164,8 @@ func InitEngine(ctx context.Context) error { Logger: errorLogger, }) + xormEngine.AddHook(&TracingHook{}) + SetDefaultEngine(ctx, xormEngine) return nil } @@ -318,6 +321,25 @@ func SetLogSQL(ctx context.Context, on bool) { } } +type TracingHook struct{} + +var _ contexts.Hook = &TracingHook{} + +type sqlTask struct{} + +func (TracingHook) BeforeProcess(c *contexts.ContextHook) (context.Context, error) { + ctx, task := trace.NewTask(c.Ctx, "sql") + ctx = context.WithValue(ctx, sqlTask{}, task) + trace.Log(ctx, "query", c.SQL) + trace.Logf(ctx, "args", "%v", c.Args) + return ctx, nil +} + +func (TracingHook) AfterProcess(c *contexts.ContextHook) error { + c.Ctx.Value(sqlTask{}).(*trace.Task).End() + return nil +} + type SlowQueryHook struct { Treshold time.Duration Logger log.Logger diff --git a/models/db/engine_test.go b/models/db/engine_test.go index 230ee3f2b1..5d20e3d602 100644 --- a/models/db/engine_test.go +++ b/models/db/engine_test.go @@ -8,14 +8,14 @@ import ( "testing" "time" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/test" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + "forgejo.org/models/unittest" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" - _ "code.gitea.io/gitea/cmd" // for TestPrimaryKeys + _ "forgejo.org/cmd" // for TestPrimaryKeys "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -64,7 +64,7 @@ func TestPrimaryKeys(t *testing.T) { // https://github.com/go-gitea/gitea/issues/21086 // https://github.com/go-gitea/gitea/issues/16802 // To avoid creating tables without primary key again, this test will check them. - // Import "code.gitea.io/gitea/cmd" to make sure each db.RegisterModel in init functions has been called. + // Import "forgejo.org/cmd" to make sure each db.RegisterModel in init functions has been called. beans, err := db.NamesToBean() if err != nil { diff --git a/models/db/error.go b/models/db/error.go index 665e970e17..6b70c40eb3 100644 --- a/models/db/error.go +++ b/models/db/error.go @@ -6,7 +6,7 @@ package db import ( "fmt" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/util" ) // ErrCancelled represents an error due to context cancellation diff --git a/models/db/index.go b/models/db/index.go index 259ddd6ade..4c15dbe8a1 100644 --- a/models/db/index.go +++ b/models/db/index.go @@ -9,7 +9,7 @@ import ( "fmt" "strconv" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" ) // ResourceIndex represents a resource index which could be used as issue/release and others diff --git a/models/db/index_test.go b/models/db/index_test.go index 11fbc70d8d..929e514329 100644 --- a/models/db/index_test.go +++ b/models/db/index_test.go @@ -9,8 +9,8 @@ import ( "fmt" "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/db/install/db.go b/models/db/install/db.go index d4c1139637..104a7a8e39 100644 --- a/models/db/install/db.go +++ b/models/db/install/db.go @@ -4,8 +4,8 @@ package install import ( - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/db" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/db/iterate.go b/models/db/iterate.go index e1caefa72b..450c7d3389 100644 --- a/models/db/iterate.go +++ b/models/db/iterate.go @@ -6,7 +6,7 @@ package db import ( "context" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "xorm.io/builder" ) diff --git a/models/db/iterate_test.go b/models/db/iterate_test.go index 7535d01d56..47b6a956f4 100644 --- a/models/db/iterate_test.go +++ b/models/db/iterate_test.go @@ -7,9 +7,9 @@ import ( "context" "testing" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/db/list.go b/models/db/list.go index 5c005a0350..057221936c 100644 --- a/models/db/list.go +++ b/models/db/list.go @@ -6,7 +6,7 @@ package db import ( "context" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "xorm.io/builder" "xorm.io/xorm" diff --git a/models/db/list_test.go b/models/db/list_test.go index 82240d205b..f13958496a 100644 --- a/models/db/list_test.go +++ b/models/db/list_test.go @@ -6,9 +6,9 @@ package db_test import ( "testing" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/db/log.go b/models/db/log.go index 457ee80ff5..387709cc50 100644 --- a/models/db/log.go +++ b/models/db/log.go @@ -7,7 +7,7 @@ import ( "fmt" "sync/atomic" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" xormlog "xorm.io/xorm/log" ) @@ -69,6 +69,9 @@ func (l *XORMLogBridge) Warn(v ...any) { // Warnf show warning log func (l *XORMLogBridge) Warnf(format string, v ...any) { + if format == "Table %s Column %s db default is %s, struct default is %s" || format == "Table %s Column %s db nullable is %v, struct nullable is %v" { + return + } l.Log(stackLevel, log.WARN, format, v...) } diff --git a/models/db/main_test.go b/models/db/main_test.go index 7d80b400fe..4b06923950 100644 --- a/models/db/main_test.go +++ b/models/db/main_test.go @@ -6,10 +6,10 @@ package db_test import ( "testing" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/unittest" - _ "code.gitea.io/gitea/models" - _ "code.gitea.io/gitea/models/repo" + _ "forgejo.org/models" + _ "forgejo.org/models/repo" ) func TestMain(m *testing.M) { diff --git a/models/db/name.go b/models/db/name.go index 51be33a8bc..29b60b2373 100644 --- a/models/db/name.go +++ b/models/db/name.go @@ -9,7 +9,7 @@ import ( "strings" "unicode/utf8" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/util" ) var ( diff --git a/models/db/paginator/main_test.go b/models/db/paginator/main_test.go index 47993aed6b..e2528be121 100644 --- a/models/db/paginator/main_test.go +++ b/models/db/paginator/main_test.go @@ -6,7 +6,7 @@ package paginator import ( "testing" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/unittest" ) func TestMain(m *testing.M) { diff --git a/models/db/paginator/paginator_test.go b/models/db/paginator/paginator_test.go index 20602212d9..c6d0569aaa 100644 --- a/models/db/paginator/paginator_test.go +++ b/models/db/paginator/paginator_test.go @@ -6,8 +6,8 @@ package paginator import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/db" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" ) diff --git a/models/db/sequence.go b/models/db/sequence.go index f49ad935de..1740e74c52 100644 --- a/models/db/sequence.go +++ b/models/db/sequence.go @@ -8,7 +8,7 @@ import ( "fmt" "regexp" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" ) // CountBadSequences looks for broken sequences from recreate-table mistakes diff --git a/models/db/sql_postgres_with_schema.go b/models/db/sql_postgres_with_schema.go index ec63447f6f..376f984dc6 100644 --- a/models/db/sql_postgres_with_schema.go +++ b/models/db/sql_postgres_with_schema.go @@ -8,7 +8,7 @@ import ( "database/sql/driver" "sync" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "github.com/lib/pq" "xorm.io/xorm/dialects" diff --git a/models/dbfs/dbfile.go b/models/dbfs/dbfile.go index dd27b5c36b..12c0398abc 100644 --- a/models/dbfs/dbfile.go +++ b/models/dbfs/dbfile.go @@ -14,7 +14,7 @@ import ( "strings" "time" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" ) var defaultFileBlockSize int64 = 32 * 1024 diff --git a/models/dbfs/dbfs.go b/models/dbfs/dbfs.go index f68b4a2b70..ba57e50151 100644 --- a/models/dbfs/dbfs.go +++ b/models/dbfs/dbfs.go @@ -10,7 +10,7 @@ import ( "path" "time" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" ) /* diff --git a/models/dbfs/dbfs_test.go b/models/dbfs/dbfs_test.go index 3ad273a732..8e42c54f31 100644 --- a/models/dbfs/dbfs_test.go +++ b/models/dbfs/dbfs_test.go @@ -9,7 +9,7 @@ import ( "os" "testing" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/dbfs/main_test.go b/models/dbfs/main_test.go index 537ba0935d..3d4b2bc235 100644 --- a/models/dbfs/main_test.go +++ b/models/dbfs/main_test.go @@ -6,7 +6,7 @@ package dbfs import ( "testing" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/unittest" ) func TestMain(m *testing.M) { diff --git a/models/error.go b/models/error.go index 75c53245de..e8962f386b 100644 --- a/models/error.go +++ b/models/error.go @@ -7,9 +7,9 @@ package models import ( "fmt" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/util" + repo_model "forgejo.org/models/repo" + "forgejo.org/modules/git" + "forgejo.org/modules/util" ) // ErrUserOwnRepos represents a "UserOwnRepos" kind of error. @@ -151,25 +151,6 @@ func (err *ErrInvalidCloneAddr) Unwrap() error { return util.ErrInvalidArgument } -// ErrUpdateTaskNotExist represents a "UpdateTaskNotExist" kind of error. -type ErrUpdateTaskNotExist struct { - UUID string -} - -// IsErrUpdateTaskNotExist checks if an error is a ErrUpdateTaskNotExist. -func IsErrUpdateTaskNotExist(err error) bool { - _, ok := err.(ErrUpdateTaskNotExist) - return ok -} - -func (err ErrUpdateTaskNotExist) Error() string { - return fmt.Sprintf("update task does not exist [uuid: %s]", err.UUID) -} - -func (err ErrUpdateTaskNotExist) Unwrap() error { - return util.ErrNotExist -} - // ErrInvalidTagName represents a "InvalidTagName" kind of error. type ErrInvalidTagName struct { TagName string diff --git a/models/fixture_generation.go b/models/fixture_generation.go deleted file mode 100644 index 6234caefad..0000000000 --- a/models/fixture_generation.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2020 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package models - -import ( - "context" - "fmt" - "strings" - - "code.gitea.io/gitea/models/db" - access_model "code.gitea.io/gitea/models/perm/access" - repo_model "code.gitea.io/gitea/models/repo" -) - -// GetYamlFixturesAccess returns a string containing the contents -// for the access table, as recalculated using repo.RecalculateAccesses() -func GetYamlFixturesAccess(ctx context.Context) (string, error) { - repos := make([]*repo_model.Repository, 0, 50) - if err := db.GetEngine(ctx).Find(&repos); err != nil { - return "", err - } - - for _, repo := range repos { - repo.MustOwner(ctx) - if err := access_model.RecalculateAccesses(ctx, repo); err != nil { - return "", err - } - } - - var b strings.Builder - - accesses := make([]*access_model.Access, 0, 200) - if err := db.GetEngine(ctx).OrderBy("user_id, repo_id").Find(&accesses); err != nil { - return "", err - } - - for i, a := range accesses { - fmt.Fprintf(&b, "-\n") - fmt.Fprintf(&b, " id: %d\n", i+1) - fmt.Fprintf(&b, " user_id: %d\n", a.UserID) - fmt.Fprintf(&b, " repo_id: %d\n", a.RepoID) - fmt.Fprintf(&b, " mode: %d\n", a.Mode) - if i < len(accesses)-1 { - fmt.Fprintf(&b, "\n") - } - } - - return b.String(), nil -} diff --git a/models/fixture_test.go b/models/fixture_test.go deleted file mode 100644 index 33429c8c2d..0000000000 --- a/models/fixture_test.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2020 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package models - -import ( - "context" - "os" - "path/filepath" - "testing" - - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/util" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestFixtureGeneration(t *testing.T) { - require.NoError(t, unittest.PrepareTestDatabase()) - - test := func(ctx context.Context, gen func(ctx context.Context) (string, error), name string) { - expected, err := gen(ctx) - require.NoError(t, err) - - p := filepath.Join(unittest.FixturesDir(), name+".yml") - bytes, err := os.ReadFile(p) - require.NoError(t, err) - - data := string(util.NormalizeEOL(bytes)) - assert.EqualValues(t, expected, data, "Differences detected for %s", p) - } - - test(db.DefaultContext, GetYamlFixturesAccess, "access") -} diff --git a/models/fixtures/PrivateIssueProjects/project.yml b/models/fixtures/PrivateIssueProjects/project.yml new file mode 100644 index 0000000000..8950b33606 --- /dev/null +++ b/models/fixtures/PrivateIssueProjects/project.yml @@ -0,0 +1,23 @@ +- + id: 1001 + title: Org project that contains private and public issues + owner_id: 3 + repo_id: 0 + is_closed: false + creator_id: 2 + board_type: 1 + type: 3 + created_unix: 1738000000 + updated_unix: 1738000000 + +- + id: 1002 + title: User project that contains private and public issues + owner_id: 2 + repo_id: 0 + is_closed: false + creator_id: 2 + board_type: 1 + type: 1 + created_unix: 1738000000 + updated_unix: 1738000000 diff --git a/models/fixtures/PrivateIssueProjects/project_board.yml b/models/fixtures/PrivateIssueProjects/project_board.yml new file mode 100644 index 0000000000..3f1fe1e705 --- /dev/null +++ b/models/fixtures/PrivateIssueProjects/project_board.yml @@ -0,0 +1,17 @@ +- + id: 1001 + project_id: 1001 + title: Triage + creator_id: 2 + default: true + created_unix: 1738000000 + updated_unix: 1738000000 + +- + id: 1002 + project_id: 1002 + title: Triage + creator_id: 2 + default: true + created_unix: 1738000000 + updated_unix: 1738000000 diff --git a/models/fixtures/PrivateIssueProjects/project_issue.yml b/models/fixtures/PrivateIssueProjects/project_issue.yml new file mode 100644 index 0000000000..0245fb47f3 --- /dev/null +++ b/models/fixtures/PrivateIssueProjects/project_issue.yml @@ -0,0 +1,23 @@ +- + id: 1001 + issue_id: 6 + project_id: 1001 + project_board_id: 1001 + +- + id: 1002 + issue_id: 7 + project_id: 1002 + project_board_id: 1002 + +- + id: 1003 + issue_id: 16 + project_id: 1001 + project_board_id: 1001 + +- + id: 1004 + issue_id: 1 + project_id: 1002 + project_board_id: 1002 diff --git a/models/fixtures/TestGetUsedForUser/action_artifact.yaml b/models/fixtures/TestGetUsedForUser/action_artifact.yaml new file mode 100644 index 0000000000..db5392126d --- /dev/null +++ b/models/fixtures/TestGetUsedForUser/action_artifact.yaml @@ -0,0 +1,17 @@ +- + id: 1001 + run_id: 792 + runner_id: 1 + repo_id: 4 + owner_id: 1 + commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 + storage_path: "27/5/1730330775594233150.chunk" + file_size: 693147180559 + file_compressed_size: 693147180559 + content_encoding: "application/zip" + artifact_path: "big-file.zip" + artifact_name: "big-file" + status: 4 + created_unix: 1730330775 + updated_unix: 1730330775 + expired_unix: 1738106775 diff --git a/models/fixtures/TestPackagesGetOrInsertBlob/package_blob.yml b/models/fixtures/TestPackagesGetOrInsertBlob/package_blob.yml new file mode 100644 index 0000000000..ec90787c43 --- /dev/null +++ b/models/fixtures/TestPackagesGetOrInsertBlob/package_blob.yml @@ -0,0 +1,17 @@ +- + id: 1 + size: 10 + hash_md5: HASHMD5_1 + hash_sha1: HASHSHA1_1 + hash_sha256: HASHSHA256_1 + hash_sha512: HASHSHA512_1 + hash_blake2b: HASHBLAKE2B_1 + created_unix: 946687980 +- + id: 2 + size: 20 + hash_md5: HASHMD5_2 + hash_sha1: HASHSHA1_2 + hash_sha256: HASHSHA256_2 + hash_sha512: HASHSHA512_2 + created_unix: 946687980 diff --git a/models/fixtures/TestPrivateRepoProjects/access.yml b/models/fixtures/TestPrivateRepoProjects/access.yml new file mode 100644 index 0000000000..4149e34b0b --- /dev/null +++ b/models/fixtures/TestPrivateRepoProjects/access.yml @@ -0,0 +1,5 @@ +- + id: 1001 + user_id: 29 + repo_id: 3 + mode: 1 diff --git a/models/fixtures/TestPrivateRepoProjects/project.yml b/models/fixtures/TestPrivateRepoProjects/project.yml new file mode 100644 index 0000000000..f66e4c8676 --- /dev/null +++ b/models/fixtures/TestPrivateRepoProjects/project.yml @@ -0,0 +1,11 @@ +- + id: 1001 + title: Org project that contains private issues + owner_id: 3 + repo_id: 0 + is_closed: false + creator_id: 2 + board_type: 1 + type: 3 + created_unix: 1738000000 + updated_unix: 1738000000 diff --git a/models/fixtures/TestPrivateRepoProjects/project_board.yml b/models/fixtures/TestPrivateRepoProjects/project_board.yml new file mode 100644 index 0000000000..9829cf7e27 --- /dev/null +++ b/models/fixtures/TestPrivateRepoProjects/project_board.yml @@ -0,0 +1,8 @@ +- + id: 1001 + project_id: 1001 + title: Triage + creator_id: 2 + default: true + created_unix: 1738000000 + updated_unix: 1738000000 diff --git a/models/fixtures/TestPrivateRepoProjects/project_issue.yml b/models/fixtures/TestPrivateRepoProjects/project_issue.yml new file mode 100644 index 0000000000..3e8c1dca9e --- /dev/null +++ b/models/fixtures/TestPrivateRepoProjects/project_issue.yml @@ -0,0 +1,11 @@ +- + id: 1001 + issue_id: 6 + project_id: 1001 + project_board_id: 1001 + +- + id: 1002 + issue_id: 15 + project_id: 1001 + project_board_id: 1001 diff --git a/models/fixtures/action_artifact.yml b/models/fixtures/action_artifact.yml new file mode 100644 index 0000000000..2c51c11ebd --- /dev/null +++ b/models/fixtures/action_artifact.yml @@ -0,0 +1,71 @@ +- + id: 1 + run_id: 791 + runner_id: 1 + repo_id: 4 + owner_id: 1 + commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 + storage_path: "26/1/1712166500347189545.chunk" + file_size: 1024 + file_compressed_size: 1024 + content_encoding: "" + artifact_path: "abc.txt" + artifact_name: "artifact-download" + status: 1 + created_unix: 1712338649 + updated_unix: 1712338649 + expired_unix: 1720114649 + +- + id: 19 + run_id: 791 + runner_id: 1 + repo_id: 4 + owner_id: 1 + commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 + storage_path: "26/19/1712348022422036662.chunk" + file_size: 1024 + file_compressed_size: 1024 + content_encoding: "" + artifact_path: "abc.txt" + artifact_name: "multi-file-download" + status: 2 + created_unix: 1712348022 + updated_unix: 1712348022 + expired_unix: 1720124022 + +- + id: 20 + run_id: 791 + runner_id: 1 + repo_id: 4 + owner_id: 1 + commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 + storage_path: "26/20/1712348022423431524.chunk" + file_size: 1024 + file_compressed_size: 1024 + content_encoding: "" + artifact_path: "xyz/def.txt" + artifact_name: "multi-file-download" + status: 2 + created_unix: 1712348022 + updated_unix: 1712348022 + expired_unix: 1720124022 + +- + id: 22 + run_id: 792 + runner_id: 1 + repo_id: 4 + owner_id: 1 + commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 + storage_path: "27/5/1730330775594233150.chunk" + file_size: 1024 + file_compressed_size: 1024 + content_encoding: "application/zip" + artifact_path: "artifact-v4-download.zip" + artifact_name: "artifact-v4-download" + status: 2 + created_unix: 1730330775 + updated_unix: 1730330775 + expired_unix: 1738106775 diff --git a/models/fixtures/action_run.yml b/models/fixtures/action_run.yml index 9c60b352f9..7a7bf34197 100644 --- a/models/fixtures/action_run.yml +++ b/models/fixtures/action_run.yml @@ -413,6 +413,44 @@ }, "total_commits": 0 } +- + id: 793 + title: "job output" + repo_id: 4 + owner_id: 1 + workflow_id: "test.yaml" + index: 189 + trigger_user_id: 1 + ref: "refs/heads/master" + commit_sha: "c2d72f548424103f01ee1dc02889c1e2bff816b0" + event: "push" + is_fork_pull_request: 0 + status: 1 + started: 1683636528 + stopped: 1683636626 + created: 1683636108 + updated: 1683636626 + need_approval: 0 + approved_by: 0 +- + id: 794 + title: "job output" + repo_id: 4 + owner_id: 1 + workflow_id: "test.yaml" + index: 190 + trigger_user_id: 1 + ref: "refs/heads/test" + commit_sha: "c2d72f548424103f01ee1dc02889c1e2bff816b0" + event: "push" + is_fork_pull_request: 0 + status: 1 + started: 1683636528 + stopped: 1683636626 + created: 1683636108 + updated: 1683636626 + need_approval: 0 + approved_by: 0 - id: 891 title: "update actions" diff --git a/models/fixtures/action_run_job.yml b/models/fixtures/action_run_job.yml index 0b02d0e17e..702c6bc832 100644 --- a/models/fixtures/action_run_job.yml +++ b/models/fixtures/action_run_job.yml @@ -26,6 +26,49 @@ status: 1 started: 1683636528 stopped: 1683636626 +- + id: 194 + run_id: 793 + repo_id: 4 + owner_id: 1 + commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 + is_fork_pull_request: 0 + name: job1 (1) + attempt: 1 + job_id: job1 + task_id: 49 + status: 1 + started: 1683636528 + stopped: 1683636626 +- + id: 195 + run_id: 793 + repo_id: 4 + owner_id: 1 + commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 + is_fork_pull_request: 0 + name: job1 (2) + attempt: 1 + job_id: job1 + task_id: 50 + status: 1 + started: 1683636528 + stopped: 1683636626 +- + id: 196 + run_id: 793 + repo_id: 4 + owner_id: 1 + commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 + is_fork_pull_request: 0 + name: job2 + attempt: 1 + job_id: job2 + needs: [job1] + task_id: 51 + status: 5 + started: 1683636528 + stopped: 1683636626 - id: 292 run_id: 891 @@ -40,3 +83,48 @@ status: 1 started: 1683636528 stopped: 1683636626 +- + id: 393 + run_id: 891 + repo_id: 1 + owner_id: 1 + commit_sha: 985f0301dba5e7b34be866819cd15ad3d8f508ee + is_fork_pull_request: 0 + name: job_2 + attempt: 1 + job_id: job_2 + task_id: 47 + status: 5 + runs_on: '["ubuntu-latest"]' + started: 1683636528 + stopped: 1683636626 +- + id: 394 + run_id: 891 + repo_id: 1 + owner_id: 2 + commit_sha: 985f0301dba5e7b34be866819cd15ad3d8f508ee + is_fork_pull_request: 0 + name: job_2 + attempt: 1 + job_id: job_2 + task_id: 47 + status: 5 + runs_on: '["debian-latest"]' + started: 1683636528 + stopped: 1683636626 +- + id: 395 + run_id: 891 + repo_id: 1 + owner_id: 3 + commit_sha: 985f0301dba5e7b34be866819cd15ad3d8f508ee + is_fork_pull_request: 0 + name: job_2 + attempt: 1 + job_id: job_2 + task_id: 47 + status: 5 + runs_on: '["fedora"]' + started: 1683636528 + stopped: 1683636626 diff --git a/models/fixtures/action_task.yml b/models/fixtures/action_task.yml index 443effe08c..506a47d8a0 100644 --- a/models/fixtures/action_task.yml +++ b/models/fixtures/action_task.yml @@ -1,3 +1,22 @@ +- + id: 46 + attempt: 3 + runner_id: 1 + status: 3 # 3 is the status code for "cancelled" + started: 1683636528 + stopped: 1683636626 + repo_id: 4 + owner_id: 1 + commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 + is_fork_pull_request: 0 + token_hash: 6d8ef48297195edcc8e22c70b3020eaa06c52976db67d39b4260c64a69a2cc1508825121b7b8394e48e00b1bf8718b2aaaaa + token_salt: eeeeeeee + token_last_eight: eeeeeeee + log_filename: artifact-test2/2f/47.log + log_in_storage: 1 + log_length: 707 + log_size: 90179 + log_expired: 0 - id: 47 job_id: 192 @@ -38,3 +57,63 @@ log_length: 707 log_size: 90179 log_expired: 0 +- + id: 49 + job_id: 194 + attempt: 1 + runner_id: 1 + status: 1 # success + started: 1683636528 + stopped: 1683636626 + repo_id: 4 + owner_id: 1 + commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 + is_fork_pull_request: 0 + token_hash: b8d3962425466b6709b9ac51446f93260c54afe8e7b6d3686e34f991fb8a8953822b0deed86fe41a103f34bc48dbc4784220 + token_salt: ffffffffff + token_last_eight: ffffffff + log_filename: artifact-test2/2f/47.log + log_in_storage: 1 + log_length: 707 + log_size: 90179 + log_expired: 0 +- + id: 50 + job_id: 195 + attempt: 1 + runner_id: 1 + status: 1 # success + started: 1683636528 + stopped: 1683636626 + repo_id: 4 + owner_id: 1 + commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 + is_fork_pull_request: 0 + token_hash: b8d3962425466b6709b9ac51446f93260c54afe8e7b6d3686e34f991fb8a8953822b0deed86fe41a103f34bc48dbc4784221 + token_salt: ffffffffff + token_last_eight: ffffffff + log_filename: artifact-test2/2f/47.log + log_in_storage: 1 + log_length: 707 + log_size: 90179 + log_expired: 0 +- + id: 51 + job_id: 196 + attempt: 1 + runner_id: 1 + status: 6 # running + started: 1683636528 + stopped: 1683636626 + repo_id: 4 + owner_id: 1 + commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 + is_fork_pull_request: 0 + token_hash: b8d3962425466b6709b9ac51446f93260c54afe8e7b6d3686e34f991fb8a8953822b0deed86fe41a103f34bc48dbc4784222 + token_salt: ffffffffff + token_last_eight: ffffffff + log_filename: artifact-test2/2f/47.log + log_in_storage: 1 + log_length: 707 + log_size: 90179 + log_expired: 0 diff --git a/models/fixtures/action_task_output.yml b/models/fixtures/action_task_output.yml new file mode 100644 index 0000000000..314e9f7115 --- /dev/null +++ b/models/fixtures/action_task_output.yml @@ -0,0 +1,20 @@ +- + id: 1 + task_id: 49 + output_key: output_a + output_value: abc +- + id: 2 + task_id: 49 + output_key: output_b + output_value: '' +- + id: 3 + task_id: 50 + output_key: output_a + output_value: '' +- + id: 4 + task_id: 50 + output_key: output_b + output_value: bbb diff --git a/models/fixtures/branch.yml b/models/fixtures/branch.yml index 93003049c6..2a9e3105e6 100644 --- a/models/fixtures/branch.yml +++ b/models/fixtures/branch.yml @@ -45,3 +45,27 @@ is_deleted: false deleted_by_id: 0 deleted_unix: 0 + +- + id: 15 + repo_id: 4 + name: 'master' + commit_id: 'c7cd3cd144e6d23c9d6f3d07e52b2c1a956e0338' + commit_message: 'add Readme' + commit_time: 1588147171 + pusher_id: 13 + is_deleted: false + deleted_by_id: 0 + deleted_unix: 0 + +- + id: 16 + repo_id: 62 + name: 'main' + commit_id: '774f93df12d14931ea93259ae93418da4482fcc1' + commit_message: 'Add workflow test-dispatch.yml' + commit_time: 1717317522 + pusher_id: 1 + is_deleted: false + deleted_by_id: 0 + deleted_unix: 0 diff --git a/models/fixtures/comment.yml b/models/fixtures/comment.yml index d2a1de6559..f4121284a6 100644 --- a/models/fixtures/comment.yml +++ b/models/fixtures/comment.yml @@ -94,3 +94,22 @@ content: "test markup light/dark-mode-only ![GitHub-Mark-Light](https://user-images.githubusercontent.com/3369400/139447912-e0f43f33-6d9f-45f8-be46-2df5bbc91289.png#gh-dark-mode-only)![GitHub-Mark-Dark](https://user-images.githubusercontent.com/3369400/139448065-39a229ba-4b06-434b-bc67-616e2ed80c8f.png#gh-light-mode-only)" created_unix: 946684813 updated_unix: 946684813 + +- + id: 11 + type: 22 # review + poster_id: 5 + issue_id: 3 # in repo_id 1 + content: "reviewed by user5" + review_id: 21 + created_unix: 946684816 + +- + id: 12 + type: 27 # review request + poster_id: 2 + issue_id: 3 # in repo_id 1 + content: "review request for user5" + review_id: 22 + assignee_id: 5 + created_unix: 946684817 diff --git a/models/fixtures/commit_status.yml b/models/fixtures/commit_status.yml index 0ba6caafe9..c568e89cea 100644 --- a/models/fixtures/commit_status.yml +++ b/models/fixtures/commit_status.yml @@ -7,6 +7,7 @@ target_url: https://example.com/builds/ description: My awesome CI-service context: ci/awesomeness + context_hash: c65f4d64a3b14a3eced0c9b36799e66e1bd5ced7 creator_id: 2 - @@ -18,6 +19,7 @@ target_url: https://example.com/coverage/ description: My awesome Coverage service context: cov/awesomeness + context_hash: 3929ac7bccd3fa1bf9b38ddedb77973b1b9a8cfe creator_id: 2 - @@ -29,6 +31,7 @@ target_url: https://example.com/coverage/ description: My awesome Coverage service context: cov/awesomeness + context_hash: 3929ac7bccd3fa1bf9b38ddedb77973b1b9a8cfe creator_id: 2 - @@ -40,6 +43,7 @@ target_url: https://example.com/builds/ description: My awesome CI-service context: ci/awesomeness + context_hash: c65f4d64a3b14a3eced0c9b36799e66e1bd5ced7 creator_id: 2 - @@ -51,15 +55,41 @@ target_url: https://example.com/builds/ description: My awesome deploy service context: deploy/awesomeness + context_hash: ae9547713a6665fc4261d0756904932085a41cf2 creator_id: 2 - id: 6 - index: 6 + index: 1 repo_id: 62 state: "failure" sha: "774f93df12d14931ea93259ae93418da4482fcc1" target_url: "/user2/test_workflows/actions" description: My awesome deploy service context: deploy/awesomeness + context_hash: ae9547713a6665fc4261d0756904932085a41cf2 + creator_id: 2 + +- + id: 7 + index: 6 + repo_id: 1 + state: "pending" + sha: "1234123412341234123412341234123412341234" + target_url: https://example.com/builds/ + description: My awesome deploy service + context: deploy/awesomeness + context_hash: ae9547713a6665fc4261d0756904932085a41cf2 + creator_id: 2 + +- + id: 8 + index: 2 + repo_id: 62 + state: "error" + sha: "774f93df12d14931ea93259ae93418da4482fcc1" + target_url: "/user2/test_workflows/actions" + description: "My awesome deploy service - v2" + context: deploy/awesomeness + context_hash: ae9547713a6665fc4261d0756904932085a41cf2 creator_id: 2 diff --git a/models/fixtures/federated_user.yml b/models/fixtures/federated_user.yml new file mode 100644 index 0000000000..ca780a73aa --- /dev/null +++ b/models/fixtures/federated_user.yml @@ -0,0 +1 @@ +[] # empty diff --git a/models/fixtures/federation_host.yml b/models/fixtures/federation_host.yml new file mode 100644 index 0000000000..ca780a73aa --- /dev/null +++ b/models/fixtures/federation_host.yml @@ -0,0 +1 @@ +[] # empty diff --git a/models/fixtures/label.yml b/models/fixtures/label.yml index 2242b90dcd..acfac74968 100644 --- a/models/fixtures/label.yml +++ b/models/fixtures/label.yml @@ -96,3 +96,14 @@ num_issues: 0 num_closed_issues: 0 archived_unix: 0 + +- + id: 10 + repo_id: 3 + org_id: 0 + name: repo3label1 + color: '#112233' + exclusive: false + num_issues: 0 + num_closed_issues: 0 + archived_unix: 0 diff --git a/models/fixtures/pull_request.yml b/models/fixtures/pull_request.yml index 9a16316e5a..79051ffb6c 100644 --- a/models/fixtures/pull_request.yml +++ b/models/fixtures/pull_request.yml @@ -64,6 +64,8 @@ base_branch: branch2 merge_base: 985f0301dba5e7b34be866819cd15ad3d8f508ee has_merged: false + allow_maintainer_edit: true + commits_behind: 1 - id: 6 diff --git a/models/fixtures/repository.yml b/models/fixtures/repository.yml index f783d58187..0ba4d06e14 100644 --- a/models/fixtures/repository.yml +++ b/models/fixtures/repository.yml @@ -29,7 +29,8 @@ size: 7597 is_fsck_enabled: true close_issues_via_commit_in_any_branch: false - + created_unix: 1731254961 + updated_unix: 1731254961 - id: 2 owner_id: 2 @@ -91,6 +92,8 @@ size: 0 is_fsck_enabled: true close_issues_via_commit_in_any_branch: false + created_unix: 1700000001 + updated_unix: 1700000001 - id: 4 @@ -129,6 +132,7 @@ owner_name: org3 lower_name: repo5 name: repo5 + default_branch: master num_watches: 0 num_stars: 0 num_forks: 0 @@ -152,6 +156,8 @@ size: 0 is_fsck_enabled: true close_issues_via_commit_in_any_branch: false + created_unix: 1700000002 + updated_unix: 1700000002 - id: 6 @@ -182,6 +188,8 @@ size: 0 is_fsck_enabled: true close_issues_via_commit_in_any_branch: false + created_unix: 1710000001 + updated_unix: 1710000001 - id: 7 @@ -212,6 +220,8 @@ size: 0 is_fsck_enabled: true close_issues_via_commit_in_any_branch: false + created_unix: 1710000003 + updated_unix: 1710000003 - id: 8 @@ -242,6 +252,8 @@ size: 0 is_fsck_enabled: true close_issues_via_commit_in_any_branch: false + created_unix: 1710000002 + updated_unix: 1710000002 - id: 9 @@ -968,6 +980,8 @@ size: 0 is_fsck_enabled: true close_issues_via_commit_in_any_branch: false + created_unix: 1700000003 + updated_unix: 1700000003 - id: 33 @@ -1811,4 +1825,4 @@ template_id: 0 size: 0 is_fsck_enabled: true - close_issues_via_commit_in_any_branch: false \ No newline at end of file + close_issues_via_commit_in_any_branch: false diff --git a/models/fixtures/review.yml b/models/fixtures/review.yml index ac97e24c2b..0438ceadae 100644 --- a/models/fixtures/review.yml +++ b/models/fixtures/review.yml @@ -179,3 +179,22 @@ content: "Review Comment" updated_unix: 946684810 created_unix: 946684810 + +- + id: 21 + type: 2 + reviewer_id: 5 + issue_id: 3 + content: "reviewed by user5" + commit_id: 4a357436d925b5c974181ff12a994538ddc5a269 + updated_unix: 946684816 + created_unix: 946684816 + +- + id: 22 + type: 4 + reviewer_id: 5 + issue_id: 3 + content: "review request for user5" + updated_unix: 946684817 + created_unix: 946684817 diff --git a/models/fixtures/secret.yml b/models/fixtures/secret.yml new file mode 100644 index 0000000000..ca780a73aa --- /dev/null +++ b/models/fixtures/secret.yml @@ -0,0 +1 @@ +[] # empty diff --git a/models/fixtures/system_setting.yml b/models/fixtures/system_setting.yml index 30542bc82a..dcad176c89 100644 --- a/models/fixtures/system_setting.yml +++ b/models/fixtures/system_setting.yml @@ -1,7 +1,7 @@ - id: 1 setting_key: 'picture.disable_gravatar' - setting_value: 'false' + setting_value: 'true' version: 1 created: 1653533198 updated: 1653533198 diff --git a/models/fixtures/team_unit.yml b/models/fixtures/team_unit.yml index de0e8d738b..e8f8d0e422 100644 --- a/models/fixtures/team_unit.yml +++ b/models/fixtures/team_unit.yml @@ -1,42 +1,49 @@ - id: 1 team_id: 1 + org_id: 3 type: 1 access_mode: 4 - id: 2 team_id: 1 + org_id: 3 type: 2 access_mode: 4 - id: 3 team_id: 1 + org_id: 3 type: 3 access_mode: 4 - id: 4 team_id: 1 + org_id: 3 type: 4 access_mode: 4 - id: 5 team_id: 1 + org_id: 3 type: 5 access_mode: 4 - id: 6 team_id: 1 + org_id: 3 type: 6 access_mode: 4 - id: 7 team_id: 1 + org_id: 3 type: 7 access_mode: 4 diff --git a/models/fixtures/two_factor.yml b/models/fixtures/two_factor.yml index d8cb85274b..bca1109ea8 100644 --- a/models/fixtures/two_factor.yml +++ b/models/fixtures/two_factor.yml @@ -1,9 +1,9 @@ - - id: 1 - uid: 24 - secret: KlDporn6Ile4vFcKI8z7Z6sqK1Scj2Qp0ovtUzCZO6jVbRW2lAoT7UDxDPtrab8d2B9zKOocBRdBJnS8orsrUNrsyETY+jJHb79M82uZRioKbRUz15sfOpmJmEzkFeSg6S4LicUBQos= - scratch_salt: Qb5bq2DyR2 - scratch_hash: 068eb9b8746e0bcfe332fac4457693df1bda55800eb0f6894d14ebb736ae6a24e0fc8fc5333c19f57f81599788f0b8e51ec1 - last_used_passcode: - created_unix: 1564253724 - updated_unix: 1564253724 + id: 1 + uid: 24 + secret: MrAed+7K+fKQKu1l3aU45oTDSWK/i5Ugtgk8CmORrKWTMwa2w97rniLU+h+2xq8ZF+16uuXGLzjWa0bOV5xg4NY6w5Ec/tkwQ5rEecOTvc/JZV5lrrlDi48B7Y5/lNcjAWBmH2nEUlM= + scratch_salt: Qb5bq2DyR2 + scratch_hash: 068eb9b8746e0bcfe332fac4457693df1bda55800eb0f6894d14ebb736ae6a24e0fc8fc5333c19f57f81599788f0b8e51ec1 + last_used_passcode: + created_unix: 1564253724 + updated_unix: 1564253724 diff --git a/models/fixtures/user.yml b/models/fixtures/user.yml index 8e216fbc7d..630505b8b4 100644 --- a/models/fixtures/user.yml +++ b/models/fixtures/user.yml @@ -23,9 +23,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar1 + avatar: "" avatar_email: user1@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -36,6 +36,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578000 - id: 2 @@ -44,6 +45,7 @@ full_name: ' < Ur Tw >< ' email: user2@example.com keep_email_private: true + keep_pronouns_private: true email_notifications_preference: enabled passwd: ZogKvWdyEx:password passwd_hash_algo: dummy @@ -60,8 +62,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar2 + avatar: "" avatar_email: user2@example.com + # cause a random avatar to be generated when referenced for test purposes use_custom_avatar: false num_followers: 2 num_following: 1 @@ -73,6 +76,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578010 - id: 3 @@ -97,9 +101,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar3 + avatar: "" avatar_email: org3@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -110,6 +114,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578020 - id: 4 @@ -134,9 +139,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar4 + avatar: "" avatar_email: user4@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 1 num_stars: 0 @@ -147,6 +152,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578030 - id: 5 @@ -171,9 +177,9 @@ allow_import_local: false allow_create_organization: false prohibit_login: false - avatar: avatar5 + avatar: "" avatar_email: user5@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -184,6 +190,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578040 - id: 6 @@ -208,9 +215,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar6 + avatar: "" avatar_email: org6@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -221,6 +228,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578050 - id: 7 @@ -245,9 +253,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar7 + avatar: "" avatar_email: org7@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -258,6 +266,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578060 - id: 8 @@ -282,9 +291,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar8 + avatar: "" avatar_email: user8@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 1 num_following: 1 num_stars: 0 @@ -295,6 +304,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578070 - id: 9 @@ -319,9 +329,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar9 + avatar: "" avatar_email: user9@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -332,6 +342,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578080 - id: 10 @@ -340,6 +351,7 @@ full_name: User Ten email: user10@example.com keep_email_private: false + keep_pronouns_private: true email_notifications_preference: enabled passwd: ZogKvWdyEx:password passwd_hash_algo: dummy @@ -356,9 +368,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar10 + avatar: "" avatar_email: user10@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -369,6 +381,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578090 - id: 11 @@ -393,9 +406,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar11 + avatar: "" avatar_email: user11@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -406,6 +419,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578100 - id: 12 @@ -430,9 +444,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar12 + avatar: "" avatar_email: user12@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -443,6 +457,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578110 - id: 13 @@ -467,9 +482,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar13 + avatar: "" avatar_email: user13@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -480,6 +495,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578120 - id: 14 @@ -504,9 +520,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar14 + avatar: "" avatar_email: user13@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -517,6 +533,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578130 - id: 15 @@ -541,9 +558,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar15 + avatar: "" avatar_email: user15@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -554,6 +571,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578140 - id: 16 @@ -578,9 +596,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar16 + avatar: "" avatar_email: user16@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -591,6 +609,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578150 - id: 17 @@ -615,9 +634,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar17 + avatar: "" avatar_email: org17@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -628,6 +647,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578160 - id: 18 @@ -652,9 +672,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar18 + avatar: "" avatar_email: user18@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -665,6 +685,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578170 - id: 19 @@ -689,9 +710,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar19 + avatar: "" avatar_email: org19@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -702,6 +723,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578180 - id: 20 @@ -726,9 +748,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar20 + avatar: "" avatar_email: user20@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -739,6 +761,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578190 - id: 21 @@ -763,9 +786,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar21 + avatar: "" avatar_email: user21@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -776,6 +799,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578200 - id: 22 @@ -800,9 +824,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar22 + avatar: "" avatar_email: limited_org@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -813,6 +837,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578210 - id: 23 @@ -837,9 +862,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar23 + avatar: "" avatar_email: privated_org@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -850,6 +875,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578220 - id: 24 @@ -874,9 +900,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar24 + avatar: "" avatar_email: user24@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -887,6 +913,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578230 - id: 25 @@ -911,9 +938,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar25 + avatar: "" avatar_email: org25@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -924,6 +951,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578240 - id: 26 @@ -948,9 +976,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar26 + avatar: "" avatar_email: org26@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -961,6 +989,7 @@ repo_admin_change_team_access: true theme: "" keep_activity_private: false + created_unix: 1672578250 - id: 27 @@ -985,9 +1014,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar27 + avatar: "" avatar_email: user27@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -998,6 +1027,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578260 - id: 28 @@ -1022,9 +1052,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar28 + avatar: "" avatar_email: user28@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -1035,6 +1065,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578270 - id: 29 @@ -1059,9 +1090,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar29 + avatar: "" avatar_email: user29@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -1072,6 +1103,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578280 - id: 30 @@ -1096,9 +1128,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar29 + avatar: "" avatar_email: user30@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -1109,6 +1141,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578290 - id: 31 @@ -1133,9 +1166,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar31 + avatar: "" avatar_email: user31@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 1 num_stars: 0 @@ -1146,6 +1179,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578300 - id: 32 @@ -1170,9 +1204,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar32 + avatar: "" avatar_email: user30@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -1183,6 +1217,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578310 - id: 33 @@ -1207,9 +1242,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar33 + avatar: "" avatar_email: user33@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 1 num_following: 0 num_stars: 0 @@ -1220,6 +1255,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578320 - id: 34 @@ -1245,7 +1281,7 @@ allow_import_local: false allow_create_organization: false prohibit_login: false - avatar: avatar34 + avatar: "" avatar_email: user34@example.com use_custom_avatar: true num_followers: 0 @@ -1258,6 +1294,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578330 - id: 35 @@ -1282,9 +1319,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar35 + avatar: "" avatar_email: private_org35@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -1295,6 +1332,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578340 - id: 36 @@ -1319,9 +1357,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar22 + avatar: "" avatar_email: abcde@gitea.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -1332,6 +1370,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578350 - id: 37 @@ -1356,9 +1395,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: true - avatar: avatar29 + avatar: "" avatar_email: user37@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -1369,6 +1408,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578360 - id: 38 @@ -1393,9 +1433,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar38 + avatar: "" avatar_email: user38@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -1406,6 +1446,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578370 - id: 39 @@ -1430,9 +1471,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar39 + avatar: "" avatar_email: user39@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -1443,6 +1484,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578380 - id: 40 @@ -1467,9 +1509,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar40 + avatar: "" avatar_email: user40@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -1480,6 +1522,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578390 - id: 41 @@ -1504,9 +1547,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: avatar41 + avatar: "" avatar_email: org41@example.com - use_custom_avatar: false + use_custom_avatar: true num_followers: 0 num_following: 0 num_stars: 0 @@ -1517,3 +1560,4 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + created_unix: 1672578400 diff --git a/models/fixtures/user_redirect.yml b/models/fixtures/user_redirect.yml index 8ff7993398..f471e94511 100644 --- a/models/fixtures/user_redirect.yml +++ b/models/fixtures/user_redirect.yml @@ -2,3 +2,4 @@ id: 1 lower_name: olduser1 redirect_user_id: 1 + created_unix: 1730000000 diff --git a/models/forgefed/federationhost.go b/models/forgefed/federationhost.go index b60c0c39cf..00f13ea399 100644 --- a/models/forgefed/federationhost.go +++ b/models/forgefed/federationhost.go @@ -8,8 +8,8 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/validation" ) // FederationHost data type diff --git a/models/forgefed/federationhost_repository.go b/models/forgefed/federationhost_repository.go index 03d8741c58..b04a5cd882 100644 --- a/models/forgefed/federationhost_repository.go +++ b/models/forgefed/federationhost_repository.go @@ -8,8 +8,8 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/models/db" + "forgejo.org/modules/validation" ) func init() { diff --git a/models/forgefed/federationhost_test.go b/models/forgefed/federationhost_test.go index ea5494c6e9..7e48a41d3b 100644 --- a/models/forgefed/federationhost_test.go +++ b/models/forgefed/federationhost_test.go @@ -8,7 +8,7 @@ import ( "testing" "time" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/validation" ) func Test_FederationHostValidation(t *testing.T) { diff --git a/models/forgefed/nodeinfo.go b/models/forgefed/nodeinfo.go index 66d2eca7aa..2461b5e499 100644 --- a/models/forgefed/nodeinfo.go +++ b/models/forgefed/nodeinfo.go @@ -6,7 +6,7 @@ package forgefed import ( "net/url" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/validation" "github.com/valyala/fastjson" ) diff --git a/models/forgefed/nodeinfo_test.go b/models/forgefed/nodeinfo_test.go index 4c73bb44d8..9e37e77100 100644 --- a/models/forgefed/nodeinfo_test.go +++ b/models/forgefed/nodeinfo_test.go @@ -9,7 +9,7 @@ import ( "strings" "testing" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/validation" ) func Test_NodeInfoWellKnownUnmarshalJSON(t *testing.T) { diff --git a/models/forgejo/semver/main_test.go b/models/forgejo/semver/main_test.go index fa56182627..dcc9d588cd 100644 --- a/models/forgejo/semver/main_test.go +++ b/models/forgejo/semver/main_test.go @@ -5,11 +5,12 @@ package semver import ( "testing" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/unittest" - _ "code.gitea.io/gitea/models" - _ "code.gitea.io/gitea/models/actions" - _ "code.gitea.io/gitea/models/activities" + _ "forgejo.org/models" + _ "forgejo.org/models/actions" + _ "forgejo.org/models/activities" + _ "forgejo.org/models/forgefed" ) func TestMain(m *testing.M) { diff --git a/models/forgejo/semver/semver.go b/models/forgejo/semver/semver.go index 7f122d2301..24a3db9181 100644 --- a/models/forgejo/semver/semver.go +++ b/models/forgejo/semver/semver.go @@ -5,7 +5,7 @@ package semver import ( "context" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" "github.com/hashicorp/go-version" ) diff --git a/models/forgejo/semver/semver_test.go b/models/forgejo/semver/semver_test.go index a508c69b18..2d055e86bb 100644 --- a/models/forgejo/semver/semver_test.go +++ b/models/forgejo/semver/semver_test.go @@ -5,8 +5,8 @@ package semver import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + "forgejo.org/models/unittest" "github.com/hashicorp/go-version" "github.com/stretchr/testify/assert" diff --git a/models/forgejo_migrations/main_test.go b/models/forgejo_migrations/main_test.go index 2297f74f73..031fe8090d 100644 --- a/models/forgejo_migrations/main_test.go +++ b/models/forgejo_migrations/main_test.go @@ -6,7 +6,7 @@ package forgejo_migrations //nolint:revive import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/forgejo_migrations/migrate.go b/models/forgejo_migrations/migrate.go index cca83d6b4d..a4cbca70c1 100644 --- a/models/forgejo_migrations/migrate.go +++ b/models/forgejo_migrations/migrate.go @@ -8,12 +8,12 @@ import ( "fmt" "os" - "code.gitea.io/gitea/models/forgejo/semver" - forgejo_v1_20 "code.gitea.io/gitea/models/forgejo_migrations/v1_20" - forgejo_v1_22 "code.gitea.io/gitea/models/forgejo_migrations/v1_22" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/forgejo/semver" + forgejo_v1_20 "forgejo.org/models/forgejo_migrations/v1_20" + forgejo_v1_22 "forgejo.org/models/forgejo_migrations/v1_22" + "forgejo.org/modules/git" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" "xorm.io/xorm" "xorm.io/xorm/names" @@ -58,30 +58,42 @@ var migrations = []*Migration{ NewMigration("Add the `apply_to_admins` column to the `protected_branch` table", forgejo_v1_22.AddApplyToAdminsSetting), // v9 -> v10 NewMigration("Add pronouns to user", forgejo_v1_22.AddPronounsToUser), - // v11 -> v12 + // v10 -> v11 NewMigration("Add the `created` column to the `issue` table", forgejo_v1_22.AddCreatedToIssue), - // v12 -> v13 + // v11 -> v12 NewMigration("Add repo_archive_download_count table", forgejo_v1_22.AddRepoArchiveDownloadCount), - // v13 -> v14 + // v12 -> v13 NewMigration("Add `hide_archive_links` column to `release` table", AddHideArchiveLinksToRelease), - // v14 -> v15 + // v13 -> v14 NewMigration("Remove Gitea-specific columns from the repository and badge tables", RemoveGiteaSpecificColumnsFromRepositoryAndBadge), - // v15 -> v16 + // v14 -> v15 NewMigration("Create the `federation_host` table", CreateFederationHostTable), - // v16 -> v17 + // v15 -> v16 NewMigration("Create the `federated_user` table", CreateFederatedUserTable), - // v17 -> v18 + // v16 -> v17 NewMigration("Add `normalized_federated_uri` column to `user` table", AddNormalizedFederatedURIToUser), - // v18 -> v19 + // v17 -> v18 NewMigration("Create the `following_repo` table", CreateFollowingRepoTable), - // v19 -> v20 + // v18 -> v19 NewMigration("Add external_url to attachment table", AddExternalURLColumnToAttachmentTable), - // v20 -> v21 + // v19 -> v20 NewMigration("Creating Quota-related tables", CreateQuotaTables), - // v21 -> v22 + // v20 -> v21 NewMigration("Add SSH keypair to `pull_mirror` table", AddSSHKeypairToPushMirror), - // v22 -> v23 + // v21 -> v22 NewMigration("Add `legacy` to `web_authn_credential` table", AddLegacyToWebAuthnCredential), + // v22 -> v23 + NewMigration("Add `delete_branch_after_merge` to `auto_merge` table", AddDeleteBranchAfterMergeToAutoMerge), + // v23 -> v24 + NewMigration("Add `purpose` column to `forgejo_auth_token` table", AddPurposeToForgejoAuthToken), + // v24 -> v25 + NewMigration("Migrate `secret` column to store keying material", MigrateTwoFactorToKeying), + // v25 -> v26 + NewMigration("Add `hash_blake2b` column to `package_blob` table", AddHashBlake2bToPackageBlob), + // v26 -> v27 + NewMigration("Add `created_unix` column to `user_redirect` table", AddCreatedUnixToRedirect), + // v27 -> v28 + NewMigration("Add pronoun privacy settings to user", AddHidePronounsOptionToUser), } // GetCurrentDBVersion returns the current Forgejo database version. diff --git a/models/forgejo_migrations/migrate_test.go b/models/forgejo_migrations/migrate_test.go index 48ee4f77b1..20653929a3 100644 --- a/models/forgejo_migrations/migrate_test.go +++ b/models/forgejo_migrations/migrate_test.go @@ -6,7 +6,7 @@ package forgejo_migrations //nolint:revive import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" "github.com/stretchr/testify/require" ) diff --git a/models/forgejo_migrations/v14.go b/models/forgejo_migrations/v14.go index f6dd35ecf0..53f1ef2223 100644 --- a/models/forgejo_migrations/v14.go +++ b/models/forgejo_migrations/v14.go @@ -4,7 +4,7 @@ package forgejo_migrations //nolint:revive import ( - "code.gitea.io/gitea/models/migrations/base" + "forgejo.org/models/migrations/base" "xorm.io/xorm" ) diff --git a/models/forgejo_migrations/v15.go b/models/forgejo_migrations/v15.go index d7ed19ca7c..5e5588dd05 100644 --- a/models/forgejo_migrations/v15.go +++ b/models/forgejo_migrations/v15.go @@ -6,7 +6,7 @@ package forgejo_migrations //nolint:revive import ( "time" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/forgejo_migrations/v18.go b/models/forgejo_migrations/v18.go index afccfbfe15..e6c1493f0e 100644 --- a/models/forgejo_migrations/v18.go +++ b/models/forgejo_migrations/v18.go @@ -14,5 +14,5 @@ type FollowingRepo struct { } func CreateFollowingRepoTable(x *xorm.Engine) error { - return x.Sync(new(FederatedUser)) + return x.Sync(new(FollowingRepo)) } diff --git a/models/forgejo_migrations/v1_20/v1.go b/models/forgejo_migrations/v1_20/v1.go index 1097613655..72beaf23de 100644 --- a/models/forgejo_migrations/v1_20/v1.go +++ b/models/forgejo_migrations/v1_20/v1.go @@ -4,7 +4,7 @@ package forgejo_v1_20 //nolint:revive import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/forgejo_migrations/v1_20/v3.go b/models/forgejo_migrations/v1_20/v3.go index caa4f1aa99..cce227e6eb 100644 --- a/models/forgejo_migrations/v1_20/v3.go +++ b/models/forgejo_migrations/v1_20/v3.go @@ -4,7 +4,7 @@ package forgejo_v1_20 //nolint:revive import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/forgejo_migrations/v1_22/main_test.go b/models/forgejo_migrations/v1_22/main_test.go index 097110893f..03c4c5272c 100644 --- a/models/forgejo_migrations/v1_22/main_test.go +++ b/models/forgejo_migrations/v1_22/main_test.go @@ -6,7 +6,7 @@ package v1_22 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/forgejo_migrations/v1_22/v11.go b/models/forgejo_migrations/v1_22/v11.go index c693993565..17bb592379 100644 --- a/models/forgejo_migrations/v1_22/v11.go +++ b/models/forgejo_migrations/v1_22/v11.go @@ -4,7 +4,7 @@ package v1_22 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/forgejo_migrations/v1_22/v8_test.go b/models/forgejo_migrations/v1_22/v8_test.go index 128fd08ab0..2af9e431b1 100644 --- a/models/forgejo_migrations/v1_22/v8_test.go +++ b/models/forgejo_migrations/v1_22/v8_test.go @@ -6,7 +6,7 @@ package v1_22 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/forgejo_migrations/v23.go b/models/forgejo_migrations/v23.go new file mode 100644 index 0000000000..20a916a716 --- /dev/null +++ b/models/forgejo_migrations/v23.go @@ -0,0 +1,16 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package forgejo_migrations //nolint:revive + +import "xorm.io/xorm" + +// AddDeleteBranchAfterMergeToAutoMerge: add DeleteBranchAfterMerge column, setting existing rows to false +func AddDeleteBranchAfterMergeToAutoMerge(x *xorm.Engine) error { + type AutoMerge struct { + ID int64 `xorm:"pk autoincr"` + DeleteBranchAfterMerge bool `xorm:"NOT NULL DEFAULT false"` + } + + return x.Sync(&AutoMerge{}) +} diff --git a/models/forgejo_migrations/v24.go b/models/forgejo_migrations/v24.go new file mode 100644 index 0000000000..ebfb5fc1c4 --- /dev/null +++ b/models/forgejo_migrations/v24.go @@ -0,0 +1,19 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package forgejo_migrations //nolint:revive + +import "xorm.io/xorm" + +func AddPurposeToForgejoAuthToken(x *xorm.Engine) error { + type ForgejoAuthToken struct { + ID int64 `xorm:"pk autoincr"` + Purpose string `xorm:"NOT NULL DEFAULT 'long_term_authorization'"` + } + if err := x.Sync(new(ForgejoAuthToken)); err != nil { + return err + } + + _, err := x.Exec("UPDATE `forgejo_auth_token` SET purpose = 'long_term_authorization' WHERE purpose = ''") + return err +} diff --git a/models/forgejo_migrations/v25.go b/models/forgejo_migrations/v25.go new file mode 100644 index 0000000000..8e3032a40c --- /dev/null +++ b/models/forgejo_migrations/v25.go @@ -0,0 +1,96 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package forgejo_migrations //nolint:revive + +import ( + "context" + "crypto/md5" + "encoding/base64" + "fmt" + + "forgejo.org/models/auth" + "forgejo.org/models/db" + "forgejo.org/modules/log" + "forgejo.org/modules/secret" + "forgejo.org/modules/setting" + + "xorm.io/xorm" + "xorm.io/xorm/schemas" +) + +func MigrateTwoFactorToKeying(x *xorm.Engine) error { + var err error + + // When upgrading from Forgejo v9 to v10, this migration will already be + // called from models/migrations/migrations.go migration 304 and must not + // be run twice. + var version int + _, err = x.Table("version").Where("`id` = 1").Select("version").Get(&version) + if err != nil { + // the version table does not exist when a test environment only applies Forgejo migrations + } else if version > 304 { + return nil + } + + switch x.Dialect().URI().DBType { + case schemas.MYSQL: + _, err = x.Exec("ALTER TABLE `two_factor` MODIFY `secret` BLOB") + case schemas.SQLITE: + _, err = x.Exec("ALTER TABLE `two_factor` RENAME COLUMN `secret` TO `secret_backup`") + if err != nil { + return err + } + _, err = x.Exec("ALTER TABLE `two_factor` ADD COLUMN `secret` BLOB") + if err != nil { + return err + } + _, err = x.Exec("UPDATE `two_factor` SET `secret` = `secret_backup`") + if err != nil { + return err + } + _, err = x.Exec("ALTER TABLE `two_factor` DROP COLUMN `secret_backup`") + case schemas.POSTGRES: + _, err = x.Exec("ALTER TABLE `two_factor` ALTER COLUMN `secret` SET DATA TYPE bytea USING secret::text::bytea") + } + if err != nil { + return err + } + + oldEncryptionKey := md5.Sum([]byte(setting.SecretKey)) + + messages := make([]string, 0, 100) + ids := make([]int64, 0, 100) + + err = db.Iterate(context.Background(), nil, func(ctx context.Context, bean *auth.TwoFactor) error { + decodedStoredSecret, err := base64.StdEncoding.DecodeString(string(bean.Secret)) + if err != nil { + messages = append(messages, fmt.Sprintf("two_factor.id=%d, two_factor.uid=%d: base64.StdEncoding.DecodeString: %v", bean.ID, bean.UID, err)) + ids = append(ids, bean.ID) + return nil + } + + secretBytes, err := secret.AesDecrypt(oldEncryptionKey[:], decodedStoredSecret) + if err != nil { + messages = append(messages, fmt.Sprintf("two_factor.id=%d, two_factor.uid=%d: secret.AesDecrypt: %v", bean.ID, bean.UID, err)) + ids = append(ids, bean.ID) + return nil + } + + bean.SetSecret(string(secretBytes)) + _, err = db.GetEngine(ctx).Cols("secret").ID(bean.ID).Update(bean) + return err + }) + if err == nil { + if len(ids) > 0 { + log.Error("Forgejo migration[25]: The following TOTP secrets were found to be corrupted and removed from the database. TOTP is no longer required to login with the associated users. They should be informed because they will need to visit their security settings and configure TOTP again. No other action is required. See https://codeberg.org/forgejo/forgejo/issues/6637 for more context on the various causes for such a corruption.") + for _, message := range messages { + log.Error("Forgejo migration[25]: %s", message) + } + + _, err = db.GetEngine(context.Background()).In("id", ids).NoAutoCondition().NoAutoTime().Delete(&auth.TwoFactor{}) + } + } + + return err +} diff --git a/models/forgejo_migrations/v25_test.go b/models/forgejo_migrations/v25_test.go new file mode 100644 index 0000000000..e7402fd021 --- /dev/null +++ b/models/forgejo_migrations/v25_test.go @@ -0,0 +1,54 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package forgejo_migrations //nolint:revive + +import ( + "testing" + + "forgejo.org/models/auth" + migration_tests "forgejo.org/models/migrations/test" + "forgejo.org/modules/keying" + "forgejo.org/modules/timeutil" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_MigrateTwoFactorToKeying(t *testing.T) { + type TwoFactor struct { //revive:disable-line:exported + ID int64 `xorm:"pk autoincr"` + UID int64 `xorm:"UNIQUE"` + Secret string + ScratchSalt string + ScratchHash string + LastUsedPasscode string `xorm:"VARCHAR(10)"` + CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` + UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` + } + + // Prepare and load the testing database + x, deferable := migration_tests.PrepareTestEnv(t, 0, new(TwoFactor)) + defer deferable() + if x == nil || t.Failed() { + return + } + + cnt, err := x.Table("two_factor").Count() + require.NoError(t, err) + assert.EqualValues(t, 2, cnt) + + require.NoError(t, MigrateTwoFactorToKeying(x)) + + cnt, err = x.Table("two_factor").Count() + require.NoError(t, err) + assert.EqualValues(t, 1, cnt) + + var twofactor auth.TwoFactor + _, err = x.Table("two_factor").ID(1).Get(&twofactor) + require.NoError(t, err) + + secretBytes, err := keying.DeriveKey(keying.ContextTOTP).Decrypt(twofactor.Secret, keying.ColumnAndID("secret", twofactor.ID)) + require.NoError(t, err) + assert.Equal(t, []byte("AVDYS32OPIAYSNBG2NKYV4AHBVEMKKKIGBQ46OXTLMJO664G4TIECOGEANMSNBLS"), secretBytes) +} diff --git a/models/forgejo_migrations/v26.go b/models/forgejo_migrations/v26.go new file mode 100644 index 0000000000..3292d93ffd --- /dev/null +++ b/models/forgejo_migrations/v26.go @@ -0,0 +1,14 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package forgejo_migrations //nolint:revive + +import "xorm.io/xorm" + +func AddHashBlake2bToPackageBlob(x *xorm.Engine) error { + type PackageBlob struct { + ID int64 `xorm:"pk autoincr"` + HashBlake2b string `xorm:"hash_blake2b char(128) UNIQUE(blake2b) INDEX"` + } + return x.Sync(&PackageBlob{}) +} diff --git a/models/forgejo_migrations/v27.go b/models/forgejo_migrations/v27.go new file mode 100644 index 0000000000..2efa3485a8 --- /dev/null +++ b/models/forgejo_migrations/v27.go @@ -0,0 +1,18 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package forgejo_migrations //nolint:revive + +import ( + "forgejo.org/modules/timeutil" + + "xorm.io/xorm" +) + +func AddCreatedUnixToRedirect(x *xorm.Engine) error { + type UserRedirect struct { + ID int64 `xorm:"pk autoincr"` + CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL DEFAULT 0"` + } + return x.Sync(new(UserRedirect)) +} diff --git a/models/forgejo_migrations/v28.go b/models/forgejo_migrations/v28.go new file mode 100644 index 0000000000..cba888d2ec --- /dev/null +++ b/models/forgejo_migrations/v28.go @@ -0,0 +1,15 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package forgejo_migrations //nolint:revive + +import "xorm.io/xorm" + +func AddHidePronounsOptionToUser(x *xorm.Engine) error { + type User struct { + ID int64 `xorm:"pk autoincr"` + KeepPronounsPrivate bool `xorm:"NOT NULL DEFAULT false"` + } + + return x.Sync(&User{}) +} diff --git a/models/git/branch.go b/models/git/branch.go index f004d502ac..a73a0f2a20 100644 --- a/models/git/branch.go +++ b/models/git/branch.go @@ -8,13 +8,14 @@ import ( "fmt" "time" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/container" + "forgejo.org/modules/git" + "forgejo.org/modules/log" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) @@ -162,9 +163,22 @@ func GetBranch(ctx context.Context, repoID int64, branchName string) (*Branch, e return &branch, nil } -func GetBranches(ctx context.Context, repoID int64, branchNames []string) ([]*Branch, error) { +func GetBranches(ctx context.Context, repoID int64, branchNames []string, includeDeleted bool) ([]*Branch, error) { branches := make([]*Branch, 0, len(branchNames)) - return branches, db.GetEngine(ctx).Where("repo_id=?", repoID).In("name", branchNames).Find(&branches) + + sess := db.GetEngine(ctx).Where("repo_id=?", repoID).In("name", branchNames) + if !includeDeleted { + sess.And("is_deleted=?", false) + } + return branches, sess.Find(&branches) +} + +func BranchesToNamesSet(branches []*Branch) container.Set[string] { + names := make(container.Set[string], len(branches)) + for _, branch := range branches { + names.Add(branch.Name) + } + return names } func AddBranches(ctx context.Context, branches []*Branch) error { @@ -417,15 +431,18 @@ func FindRecentlyPushedNewBranches(ctx context.Context, repoID, userID int64, ex branches := make(BranchList, 0, 2) subQuery := builder.Select("head_branch").From("pull_request"). InnerJoin("issue", "issue.id = pull_request.issue_id"). - Where(builder.Eq{ - "pull_request.head_repo_id": repoID, - "issue.is_closed": false, - }) + Where(builder.And( + builder.Eq{"pull_request.head_repo_id": repoID}, + builder.Or( + builder.Eq{"pull_request.has_merged": true}, + builder.Eq{"issue.is_closed": false}, + ), + )) err := db.GetEngine(ctx). Where("pusher_id=? AND is_deleted=?", userID, false). And("name <> ?", excludeBranchName). And("repo_id = ?", repoID). - And("commit_time >= ?", time.Now().Add(-time.Hour*6).Unix()). + And("commit_time >= ?", time.Now().Add(-time.Minute*30).Unix()). NotIn("name", subQuery). OrderBy("branch.commit_time DESC"). Limit(2). diff --git a/models/git/branch_list.go b/models/git/branch_list.go index 81a43eaea3..4b678f15c0 100644 --- a/models/git/branch_list.go +++ b/models/git/branch_list.go @@ -6,10 +6,10 @@ package git import ( "context" - "code.gitea.io/gitea/models/db" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/optional" + "forgejo.org/models/db" + user_model "forgejo.org/models/user" + "forgejo.org/modules/container" + "forgejo.org/modules/optional" "xorm.io/builder" ) diff --git a/models/git/branch_test.go b/models/git/branch_test.go index 81839eb774..5c1762750e 100644 --- a/models/git/branch_test.go +++ b/models/git/branch_test.go @@ -7,13 +7,13 @@ import ( "context" "testing" - "code.gitea.io/gitea/models/db" - git_model "code.gitea.io/gitea/models/git" - issues_model "code.gitea.io/gitea/models/issues" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/optional" + "forgejo.org/models/db" + git_model "forgejo.org/models/git" + issues_model "forgejo.org/models/issues" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" + "forgejo.org/modules/git" + "forgejo.org/modules/optional" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/git/commit_status.go b/models/git/commit_status.go index 53d1ddc8c3..a679703ffd 100644 --- a/models/git/commit_status.go +++ b/models/git/commit_status.go @@ -13,16 +13,16 @@ import ( "strings" "time" - asymkey_model "code.gitea.io/gitea/models/asymkey" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - api "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/translation" + asymkey_model "forgejo.org/models/asymkey" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/git" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + api "forgejo.org/modules/structs" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/translation" "xorm.io/builder" "xorm.io/xorm" @@ -288,16 +288,12 @@ func GetLatestCommitStatus(ctx context.Context, repoID int64, sha string, listOp // GetLatestCommitStatusForPairs returns all statuses with a unique context for a given list of repo-sha pairs func GetLatestCommitStatusForPairs(ctx context.Context, repoSHAs []RepoSHA) (map[int64][]*CommitStatus, error) { - type result struct { - Index int64 - RepoID int64 - SHA string - } + results := []*CommitStatus{} + repoStatuses := make(map[int64][]*CommitStatus) - results := make([]result, 0, len(repoSHAs)) - - getBase := func() *xorm.Session { - return db.GetEngine(ctx).Table(&CommitStatus{}) + if len(repoSHAs) == 0 { + // Avoid performing query when there will be no query conditions added. + return repoStatuses, nil } // Create a disjunction of conditions for each repoID and SHA pair @@ -305,38 +301,30 @@ func GetLatestCommitStatusForPairs(ctx context.Context, repoSHAs []RepoSHA) (map for _, repoSHA := range repoSHAs { conds = append(conds, builder.Eq{"repo_id": repoSHA.RepoID, "sha": repoSHA.SHA}) } - sess := getBase().Where(builder.Or(conds...)). - Select("max( `index` ) as `index`, repo_id, sha"). - GroupBy("context_hash, repo_id, sha").OrderBy("max( `index` ) desc") + subquery := builder.Dialect(db.BuilderDialect()). + Select("context_hash, repo_id, sha, MAX(`index`) AS max_index"). + From("commit_status"). + Where(builder.Or(conds...)). + GroupBy("context_hash, repo_id, sha") + + sess := db.GetEngine(ctx). + Table(&CommitStatus{}). + Alias("c"). + Join( + "INNER", + subquery, + "c.context_hash = commit_status.context_hash AND c.repo_id = commit_status.repo_id AND c.sha = commit_status.sha AND c.`index` = commit_status.max_index", + ). + OrderBy("c.`index` DESC") err := sess.Find(&results) if err != nil { return nil, err } - repoStatuses := make(map[int64][]*CommitStatus) - - if len(results) > 0 { - statuses := make([]*CommitStatus, 0, len(results)) - - conds = make([]builder.Cond, 0, len(results)) - for _, result := range results { - cond := builder.Eq{ - "`index`": result.Index, - "repo_id": result.RepoID, - "sha": result.SHA, - } - conds = append(conds, cond) - } - err = getBase().Where(builder.Or(conds...)).Find(&statuses) - if err != nil { - return nil, err - } - - // Group the statuses by repo ID - for _, status := range statuses { - repoStatuses[status.RepoID] = append(repoStatuses[status.RepoID], status) - } + // Group the statuses by repo ID + for _, status := range results { + repoStatuses[status.RepoID] = append(repoStatuses[status.RepoID], status) } return repoStatuses, nil @@ -348,6 +336,12 @@ func GetLatestCommitStatusForRepoCommitIDs(ctx context.Context, repoID int64, co Index int64 SHA string } + repoStatuses := make(map[string][]*CommitStatus) + + if len(commitIDs) == 0 { + // Avoid performing query when there will be no `sha` query conditions added. + return repoStatuses, nil + } getBase := func() *xorm.Session { return db.GetEngine(ctx).Table(&CommitStatus{}).Where("repo_id = ?", repoID) @@ -367,8 +361,6 @@ func GetLatestCommitStatusForRepoCommitIDs(ctx context.Context, repoID int64, co return nil, err } - repoStatuses := make(map[string][]*CommitStatus) - if len(results) > 0 { statuses := make([]*CommitStatus, 0, len(results)) diff --git a/models/git/commit_status_summary.go b/models/git/commit_status_summary.go index 7603e7aa65..448aa5aed7 100644 --- a/models/git/commit_status_summary.go +++ b/models/git/commit_status_summary.go @@ -6,9 +6,9 @@ package git import ( "context" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/setting" - api "code.gitea.io/gitea/modules/structs" + "forgejo.org/models/db" + "forgejo.org/modules/setting" + api "forgejo.org/modules/structs" "xorm.io/builder" ) diff --git a/models/git/commit_status_test.go b/models/git/commit_status_test.go index 1014ee1e13..c062bbbbb9 100644 --- a/models/git/commit_status_test.go +++ b/models/git/commit_status_test.go @@ -8,15 +8,15 @@ import ( "testing" "time" - actions_model "code.gitea.io/gitea/models/actions" - "code.gitea.io/gitea/models/db" - git_model "code.gitea.io/gitea/models/git" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/gitrepo" - "code.gitea.io/gitea/modules/structs" + actions_model "forgejo.org/models/actions" + "forgejo.org/models/db" + git_model "forgejo.org/models/git" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/git" + "forgejo.org/modules/gitrepo" + "forgejo.org/modules/structs" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -35,8 +35,8 @@ func TestGetCommitStatuses(t *testing.T) { SHA: sha1, }) require.NoError(t, err) - assert.Equal(t, 5, int(maxResults)) - assert.Len(t, statuses, 5) + assert.EqualValues(t, 6, maxResults) + assert.Len(t, statuses, 6) assert.Equal(t, "ci/awesomeness", statuses[0].Context) assert.Equal(t, structs.CommitStatusPending, statuses[0].State) @@ -58,13 +58,17 @@ func TestGetCommitStatuses(t *testing.T) { assert.Equal(t, structs.CommitStatusError, statuses[4].State) assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[4].APIURL(db.DefaultContext)) + assert.Equal(t, "deploy/awesomeness", statuses[5].Context) + assert.Equal(t, structs.CommitStatusPending, statuses[5].State) + assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[5].APIURL(db.DefaultContext)) + statuses, maxResults, err = db.FindAndCount[git_model.CommitStatus](db.DefaultContext, &git_model.CommitStatusOptions{ ListOptions: db.ListOptions{Page: 2, PageSize: 50}, RepoID: repo1.ID, SHA: sha1, }) require.NoError(t, err) - assert.Equal(t, 5, int(maxResults)) + assert.EqualValues(t, 6, maxResults) assert.Empty(t, statuses) } diff --git a/models/git/lfs.go b/models/git/lfs.go index 44b741c4c8..9ec1ca7d8a 100644 --- a/models/git/lfs.go +++ b/models/git/lfs.go @@ -7,16 +7,16 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/perm" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unit" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/lfs" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/models/perm" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unit" + user_model "forgejo.org/models/user" + "forgejo.org/modules/lfs" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) @@ -136,8 +136,6 @@ var ErrLFSObjectNotExist = db.ErrNotExist{Resource: "LFS Meta object"} // NewLFSMetaObject stores a given populated LFSMetaObject structure in the database // if it is not already present. func NewLFSMetaObject(ctx context.Context, repoID int64, p lfs.Pointer) (*LFSMetaObject, error) { - var err error - ctx, committer, err := db.TxContext(ctx) if err != nil { return nil, err diff --git a/models/git/lfs_lock.go b/models/git/lfs_lock.go index 07ce7d4abf..9dc0a947c3 100644 --- a/models/git/lfs_lock.go +++ b/models/git/lfs_lock.go @@ -10,14 +10,14 @@ import ( "strings" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/perm" - access_model "code.gitea.io/gitea/models/perm/access" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unit" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/models/perm" + access_model "forgejo.org/models/perm/access" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unit" + user_model "forgejo.org/models/user" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" ) // LFSLock represents a git lfs lock of repository. diff --git a/models/git/lfs_lock_list.go b/models/git/lfs_lock_list.go index cab1e61cab..ffa4db21c4 100644 --- a/models/git/lfs_lock_list.go +++ b/models/git/lfs_lock_list.go @@ -7,9 +7,9 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/container" + "forgejo.org/models/db" + user_model "forgejo.org/models/user" + "forgejo.org/modules/container" ) // LFSLockList is a list of LFSLock diff --git a/models/git/lfs_test.go b/models/git/lfs_test.go index afb73ecf4e..af5e1abd90 100644 --- a/models/git/lfs_test.go +++ b/models/git/lfs_test.go @@ -5,26 +5,19 @@ package git import ( "context" - "path/filepath" "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/test" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestIterateRepositoryIDsWithLFSMetaObjects(t *testing.T) { - defer unittest.OverrideFixtures( - unittest.FixturesOptions{ - Dir: filepath.Join(setting.AppWorkPath, "models/fixtures/"), - Base: setting.AppWorkPath, - Dirs: []string{"models/git/TestIterateRepositoryIDsWithLFSMetaObjects/"}, - }, - )() + defer unittest.OverrideFixtures("models/git/TestIterateRepositoryIDsWithLFSMetaObjects")() require.NoError(t, unittest.PrepareTestDatabase()) type repocount struct { diff --git a/models/git/main_test.go b/models/git/main_test.go index aab1fa9a26..63a3c363ab 100644 --- a/models/git/main_test.go +++ b/models/git/main_test.go @@ -6,11 +6,12 @@ package git_test import ( "testing" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/unittest" - _ "code.gitea.io/gitea/models" - _ "code.gitea.io/gitea/models/actions" - _ "code.gitea.io/gitea/models/activities" + _ "forgejo.org/models" + _ "forgejo.org/models/actions" + _ "forgejo.org/models/activities" + _ "forgejo.org/models/forgefed" ) func TestMain(m *testing.M) { diff --git a/models/git/protected_branch.go b/models/git/protected_branch.go index a8b8c81bbe..c1eb750230 100644 --- a/models/git/protected_branch.go +++ b/models/git/protected_branch.go @@ -10,16 +10,16 @@ import ( "slices" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/organization" - "code.gitea.io/gitea/models/perm" - access_model "code.gitea.io/gitea/models/perm/access" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unit" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/models/organization" + "forgejo.org/models/perm" + access_model "forgejo.org/models/perm/access" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unit" + user_model "forgejo.org/models/user" + "forgejo.org/modules/log" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "github.com/gobwas/glob" "github.com/gobwas/glob/syntax" @@ -79,14 +79,20 @@ func IsRuleNameSpecial(ruleName string) bool { } func (protectBranch *ProtectedBranch) loadGlob() { - if protectBranch.globRule == nil { - var err error - protectBranch.globRule, err = glob.Compile(protectBranch.RuleName, '/') - if err != nil { - log.Warn("Invalid glob rule for ProtectedBranch[%d]: %s %v", protectBranch.ID, protectBranch.RuleName, err) - protectBranch.globRule = glob.MustCompile(glob.QuoteMeta(protectBranch.RuleName), '/') - } - protectBranch.isPlainName = !IsRuleNameSpecial(protectBranch.RuleName) + if protectBranch.isPlainName || protectBranch.globRule != nil { + return + } + // detect if it is not glob + if !IsRuleNameSpecial(protectBranch.RuleName) { + protectBranch.isPlainName = true + return + } + // now we load the glob + var err error + protectBranch.globRule, err = glob.Compile(protectBranch.RuleName, '/') + if err != nil { + log.Warn("Invalid glob rule for ProtectedBranch[%d]: %s %v", protectBranch.ID, protectBranch.RuleName, err) + protectBranch.globRule = glob.MustCompile(glob.QuoteMeta(protectBranch.RuleName), '/') } } diff --git a/models/git/protected_branch_list.go b/models/git/protected_branch_list.go index 613333a5a2..c7a3154884 100644 --- a/models/git/protected_branch_list.go +++ b/models/git/protected_branch_list.go @@ -7,8 +7,8 @@ import ( "context" "sort" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/optional" + "forgejo.org/models/db" + "forgejo.org/modules/optional" "github.com/gobwas/glob" ) diff --git a/models/git/protected_banch_list_test.go b/models/git/protected_branch_list_test.go similarity index 79% rename from models/git/protected_banch_list_test.go rename to models/git/protected_branch_list_test.go index 09319d21a8..db7e54f685 100644 --- a/models/git/protected_banch_list_test.go +++ b/models/git/protected_branch_list_test.go @@ -75,3 +75,32 @@ func TestBranchRuleMatchPriority(t *testing.T) { } } } + +func TestBranchRuleSort(t *testing.T) { + in := []*ProtectedBranch{{ + RuleName: "b", + CreatedUnix: 1, + }, { + RuleName: "b/*", + CreatedUnix: 3, + }, { + RuleName: "a/*", + CreatedUnix: 2, + }, { + RuleName: "c", + CreatedUnix: 0, + }, { + RuleName: "a", + CreatedUnix: 4, + }} + expect := []string{"c", "b", "a", "a/*", "b/*"} + + pbr := ProtectedBranchRules(in) + pbr.sort() + + var got []string + for i := range pbr { + got = append(got, pbr[i].RuleName) + } + assert.Equal(t, expect, got) +} diff --git a/models/git/protected_tag.go b/models/git/protected_tag.go index 9a6646c742..eeaae41868 100644 --- a/models/git/protected_tag.go +++ b/models/git/protected_tag.go @@ -9,9 +9,9 @@ import ( "slices" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/organization" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/models/organization" + "forgejo.org/modules/timeutil" "github.com/gobwas/glob" ) diff --git a/models/git/protected_tag_test.go b/models/git/protected_tag_test.go index 796e1594b9..eec13fdc1f 100644 --- a/models/git/protected_tag_test.go +++ b/models/git/protected_tag_test.go @@ -6,9 +6,9 @@ package git_test import ( "testing" - "code.gitea.io/gitea/models/db" - git_model "code.gitea.io/gitea/models/git" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + git_model "forgejo.org/models/git" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/issues/TestGetUIDsAndStopwatch/stopwatch.yml b/models/issues/TestGetUIDsAndStopwatch/stopwatch.yml new file mode 100644 index 0000000000..f564e4b389 --- /dev/null +++ b/models/issues/TestGetUIDsAndStopwatch/stopwatch.yml @@ -0,0 +1,11 @@ +- + id: 3 + user_id: 1 + issue_id: 2 + created_unix: 1500988004 + +- + id: 4 + user_id: 3 + issue_id: 0 + created_unix: 1500988003 diff --git a/models/issues/action_aggregator.go b/models/issues/action_aggregator.go new file mode 100644 index 0000000000..cf5be753f1 --- /dev/null +++ b/models/issues/action_aggregator.go @@ -0,0 +1,375 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package issues + +import ( + "slices" + + "forgejo.org/models/organization" + user_model "forgejo.org/models/user" +) + +type ActionAggregator struct { + StartUnix int64 + AggAge int64 + PosterID int64 + StartInd int + EndInd int + + PrevClosed bool + IsClosed bool + + AddedLabels []*Label + RemovedLabels []*Label + + AddedRequestReview []RequestReviewTarget + RemovedRequestReview []RequestReviewTarget +} + +// Get the time threshold for aggregation of multiple actions together +func (agg *ActionAggregator) timeThreshold() int64 { + if agg.AggAge > (60 * 60 * 24 * 30) { // Age > 1 month, aggregate by day + return 60 * 60 * 24 + } else if agg.AggAge > (60 * 60 * 24) { // Age > 1 day, aggregate by hour + return 60 * 60 + } else if agg.AggAge > (60 * 60) { // Age > 1 hour, aggregate by 10 mins + return 60 * 10 + } + // Else, aggregate by minute + return 60 +} + +// TODO Aggregate also +// - Dependency added / removed +// - Added / Removed due date +// - Milestone Added / Removed +func (agg *ActionAggregator) aggregateAction(c *Comment, index int) { + if agg.StartInd == -1 { + agg.StartInd = index + } + agg.EndInd = index + + if c.Type == CommentTypeClose { + agg.IsClosed = true + } else if c.Type == CommentTypeReopen { + agg.IsClosed = false + } else if c.Type == CommentTypeReviewRequest { + if c.AssigneeID > 0 { + req := RequestReviewTarget{User: c.Assignee} + if c.RemovedAssignee { + agg.delReviewRequest(req) + } else { + agg.addReviewRequest(req) + } + } else if c.AssigneeTeamID > 0 { + req := RequestReviewTarget{Team: c.AssigneeTeam} + if c.RemovedAssignee { + agg.delReviewRequest(req) + } else { + agg.addReviewRequest(req) + } + } + + for _, r := range c.RemovedRequestReview { + agg.delReviewRequest(r) + } + + for _, r := range c.AddedRequestReview { + agg.addReviewRequest(r) + } + } else if c.Type == CommentTypeLabel { + if c.Content == "1" { + agg.addLabel(c.Label) + } else { + agg.delLabel(c.Label) + } + } else if c.Type == CommentTypeAggregator { + agg.Merge(c.Aggregator) + } +} + +// Merge a past CommentAggregator with the next one in the issue comments list +func (agg *ActionAggregator) Merge(next *ActionAggregator) { + agg.IsClosed = next.IsClosed + + for _, l := range next.AddedLabels { + agg.addLabel(l) + } + + for _, l := range next.RemovedLabels { + agg.delLabel(l) + } + + for _, r := range next.AddedRequestReview { + agg.addReviewRequest(r) + } + + for _, r := range next.RemovedRequestReview { + agg.delReviewRequest(r) + } +} + +// Check if a comment can be aggregated or not depending on its type +func (agg *ActionAggregator) IsAggregated(t *CommentType) bool { + switch *t { + case CommentTypeAggregator, CommentTypeClose, CommentTypeReopen, CommentTypeLabel, CommentTypeReviewRequest: + { + return true + } + default: + { + return false + } + } +} + +// Add a label to the aggregated list +func (agg *ActionAggregator) addLabel(lbl *Label) { + for l, agglbl := range agg.RemovedLabels { + if agglbl.ID == lbl.ID { + agg.RemovedLabels = slices.Delete(agg.RemovedLabels, l, l+1) + return + } + } + + if !slices.ContainsFunc(agg.AddedLabels, func(l *Label) bool { return l.ID == lbl.ID }) { + agg.AddedLabels = append(agg.AddedLabels, lbl) + } +} + +// Remove a label from the aggregated list +func (agg *ActionAggregator) delLabel(lbl *Label) { + for l, agglbl := range agg.AddedLabels { + if agglbl.ID == lbl.ID { + agg.AddedLabels = slices.Delete(agg.AddedLabels, l, l+1) + return + } + } + + if !slices.ContainsFunc(agg.RemovedLabels, func(l *Label) bool { return l.ID == lbl.ID }) { + agg.RemovedLabels = append(agg.RemovedLabels, lbl) + } +} + +// Add a review request to the aggregated list +func (agg *ActionAggregator) addReviewRequest(req RequestReviewTarget) { + reqid := req.ID() + reqty := req.Type() + for r, aggreq := range agg.RemovedRequestReview { + if (aggreq.ID() == reqid) && (aggreq.Type() == reqty) { + agg.RemovedRequestReview = slices.Delete(agg.RemovedRequestReview, r, r+1) + return + } + } + + if !slices.ContainsFunc(agg.AddedRequestReview, func(r RequestReviewTarget) bool { return (r.ID() == reqid) && (r.Type() == reqty) }) { + agg.AddedRequestReview = append(agg.AddedRequestReview, req) + } +} + +// Delete a review request from the aggregated list +func (agg *ActionAggregator) delReviewRequest(req RequestReviewTarget) { + reqid := req.ID() + reqty := req.Type() + for r, aggreq := range agg.AddedRequestReview { + if (aggreq.ID() == reqid) && (aggreq.Type() == reqty) { + agg.AddedRequestReview = slices.Delete(agg.AddedRequestReview, r, r+1) + return + } + } + + if !slices.ContainsFunc(agg.RemovedRequestReview, func(r RequestReviewTarget) bool { return (r.ID() == reqid) && (r.Type() == reqty) }) { + agg.RemovedRequestReview = append(agg.RemovedRequestReview, req) + } +} + +// Check if anything has changed with this aggregated list of comments +func (agg *ActionAggregator) Changed() bool { + return (agg.IsClosed != agg.PrevClosed) || + (len(agg.AddedLabels) > 0) || + (len(agg.RemovedLabels) > 0) || + (len(agg.AddedRequestReview) > 0) || + (len(agg.RemovedRequestReview) > 0) +} + +func (agg *ActionAggregator) OnlyLabelsChanged() bool { + return ((len(agg.AddedLabels) > 0) || (len(agg.RemovedLabels) > 0)) && + (len(agg.AddedRequestReview) == 0) && (len(agg.RemovedRequestReview) == 0) && + (agg.PrevClosed == agg.IsClosed) +} + +func (agg *ActionAggregator) OnlyRequestReview() bool { + return ((len(agg.AddedRequestReview) > 0) || (len(agg.RemovedRequestReview) > 0)) && + (len(agg.AddedLabels) == 0) && (len(agg.RemovedLabels) == 0) && + (agg.PrevClosed == agg.IsClosed) +} + +func (agg *ActionAggregator) OnlyClosedReopened() bool { + return (agg.IsClosed != agg.PrevClosed) && + (len(agg.AddedLabels) == 0) && (len(agg.RemovedLabels) == 0) && + (len(agg.AddedRequestReview) == 0) && (len(agg.RemovedRequestReview) == 0) +} + +// Reset the aggregator to start a new aggregating context +func (agg *ActionAggregator) Reset(cur *Comment, now int64) { + agg.StartUnix = int64(cur.CreatedUnix) + agg.AggAge = now - agg.StartUnix + agg.PosterID = cur.PosterID + + agg.PrevClosed = agg.IsClosed + + agg.StartInd = -1 + agg.EndInd = -1 + agg.AddedLabels = []*Label{} + agg.RemovedLabels = []*Label{} + agg.AddedRequestReview = []RequestReviewTarget{} + agg.RemovedRequestReview = []RequestReviewTarget{} +} + +// Function that replaces all the comments aggregated with a single one +// Its CommentType depend on whether multiple type of comments are been aggregated or not +// If nothing has changed, we remove all the comments that get nullified +// +// The function returns how many comments has been removed, in order for the "for" loop +// of the main algorithm to change its index +func (agg *ActionAggregator) createAggregatedComment(issue *Issue, final bool) int { + // If the aggregation of comments make the whole thing null, erase all the comments + if !agg.Changed() { + if final { + issue.Comments = issue.Comments[:agg.StartInd] + } else { + issue.Comments = slices.Replace(issue.Comments, agg.StartInd, agg.EndInd+1) + } + return (agg.EndInd - agg.StartInd) + 1 + } + + newAgg := *agg // Trigger a memory allocation, get a COPY of the aggregator + + // Keep the same author, time, etc... But reset the parts we may want to use + comment := issue.Comments[agg.StartInd] + comment.Content = "" + comment.Label = nil + comment.Aggregator = nil + comment.Assignee = nil + comment.AssigneeID = 0 + comment.AssigneeTeam = nil + comment.AssigneeTeamID = 0 + comment.RemovedAssignee = false + comment.AddedLabels = nil + comment.RemovedLabels = nil + + // In case there's only a single change, create a comment of this type + // instead of an aggregator + if agg.OnlyLabelsChanged() { + comment.Type = CommentTypeLabel + } else if agg.OnlyClosedReopened() { + if agg.IsClosed { + comment.Type = CommentTypeClose + } else { + comment.Type = CommentTypeReopen + } + } else if agg.OnlyRequestReview() { + comment.Type = CommentTypeReviewRequest + } else { + comment.Type = CommentTypeAggregator + comment.Aggregator = &newAgg + } + + if len(newAgg.AddedLabels) > 0 { + comment.AddedLabels = newAgg.AddedLabels + } + + if len(newAgg.RemovedLabels) > 0 { + comment.RemovedLabels = newAgg.RemovedLabels + } + + if len(newAgg.AddedRequestReview) > 0 { + comment.AddedRequestReview = newAgg.AddedRequestReview + } + + if len(newAgg.RemovedRequestReview) > 0 { + comment.RemovedRequestReview = newAgg.RemovedRequestReview + } + + if final { + issue.Comments = append(issue.Comments[:agg.StartInd], comment) + } else { + issue.Comments = slices.Replace(issue.Comments, agg.StartInd, agg.EndInd+1, comment) + } + return agg.EndInd - agg.StartInd +} + +// combineCommentsHistory combines nearby elements in the history as one +func CombineCommentsHistory(issue *Issue, now int64) { + if len(issue.Comments) < 1 { + return + } + + // Initialise a new empty aggregator, ready to combine comments + var agg ActionAggregator + agg.Reset(issue.Comments[0], now) + + for i := 0; i < len(issue.Comments); i++ { + cur := issue.Comments[i] + // If the comment we encounter is not accepted inside an aggregator + if !agg.IsAggregated(&cur.Type) { + // If we aggregated some data, create the resulting comment for it + if agg.StartInd != -1 { + i -= agg.createAggregatedComment(issue, false) + } + + agg.StartInd = -1 + if i+1 < len(issue.Comments) { + agg.Reset(issue.Comments[i+1], now) + } + + // Do not need to continue the aggregation loop, skip to next comment + continue + } + + // If the comment we encounter cannot be aggregated with the current aggregator, + // we create a new empty aggregator + threshold := agg.timeThreshold() + if ((int64(cur.CreatedUnix) - agg.StartUnix) > threshold) || (cur.PosterID != agg.PosterID) { + // First, create the aggregated comment if there's data in it + if agg.StartInd != -1 { + i -= agg.createAggregatedComment(issue, false) + } + agg.Reset(cur, now) + } + + agg.aggregateAction(cur, i) + } + + // Create the aggregated comment if there's data in it + if agg.StartInd != -1 { + agg.createAggregatedComment(issue, true) + } +} + +type RequestReviewTarget struct { + User *user_model.User + Team *organization.Team +} + +func (t *RequestReviewTarget) ID() int64 { + if t.User != nil { + return t.User.ID + } + return t.Team.ID +} + +func (t *RequestReviewTarget) Name() string { + if t.User != nil { + return t.User.GetDisplayName() + } + return t.Team.Name +} + +func (t *RequestReviewTarget) Type() string { + if t.User != nil { + return "user" + } + return "team" +} diff --git a/models/issues/assignees.go b/models/issues/assignees.go index a83cb250fa..b1099b6b63 100644 --- a/models/issues/assignees.go +++ b/models/issues/assignees.go @@ -7,9 +7,9 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + user_model "forgejo.org/models/user" + "forgejo.org/modules/util" "xorm.io/builder" ) diff --git a/models/issues/assignees_test.go b/models/issues/assignees_test.go index 47fb81a237..a5e8f0cb09 100644 --- a/models/issues/assignees_test.go +++ b/models/issues/assignees_test.go @@ -6,10 +6,10 @@ package issues_test import ( "testing" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/issues/comment.go b/models/issues/comment.go index d53e5f5949..1b9b259a30 100644 --- a/models/issues/comment.go +++ b/models/issues/comment.go @@ -12,22 +12,22 @@ import ( "strconv" "unicode/utf8" - "code.gitea.io/gitea/models/db" - git_model "code.gitea.io/gitea/models/git" - "code.gitea.io/gitea/models/organization" - project_model "code.gitea.io/gitea/models/project" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/gitrepo" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/references" - "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/translation" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + git_model "forgejo.org/models/git" + "forgejo.org/models/organization" + project_model "forgejo.org/models/project" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/container" + "forgejo.org/modules/gitrepo" + "forgejo.org/modules/json" + "forgejo.org/modules/log" + "forgejo.org/modules/optional" + "forgejo.org/modules/references" + "forgejo.org/modules/structs" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/translation" + "forgejo.org/modules/util" "xorm.io/builder" ) @@ -114,6 +114,8 @@ const ( CommentTypePin // 36 pin Issue CommentTypeUnpin // 37 unpin Issue + + CommentTypeAggregator // 38 Aggregator of comments ) var commentStrings = []string{ @@ -155,6 +157,7 @@ var commentStrings = []string{ "pull_cancel_scheduled_merge", "pin", "unpin", + "action_aggregator", } func (t CommentType) String() string { @@ -194,6 +197,20 @@ func (t CommentType) HasMailReplySupport() bool { return false } +func (t CommentType) CountedAsConversation() bool { + for _, ct := range ConversationCountedCommentType() { + if t == ct { + return true + } + } + return false +} + +// ConversationCountedCommentType returns the comment types that are counted as a conversation +func ConversationCountedCommentType() []CommentType { + return []CommentType{CommentTypeComment, CommentTypeReview} +} + // RoleInRepo presents the user's participation in the repo type RoleInRepo string @@ -224,41 +241,44 @@ func (r RoleInRepo) LocaleHelper(lang translation.Locale) string { // Comment represents a comment in commit and issue page. type Comment struct { - ID int64 `xorm:"pk autoincr"` - Type CommentType `xorm:"INDEX"` - PosterID int64 `xorm:"INDEX"` - Poster *user_model.User `xorm:"-"` - OriginalAuthor string - OriginalAuthorID int64 - IssueID int64 `xorm:"INDEX"` - Issue *Issue `xorm:"-"` - LabelID int64 - Label *Label `xorm:"-"` - AddedLabels []*Label `xorm:"-"` - RemovedLabels []*Label `xorm:"-"` - OldProjectID int64 - ProjectID int64 - OldProject *project_model.Project `xorm:"-"` - Project *project_model.Project `xorm:"-"` - OldMilestoneID int64 - MilestoneID int64 - OldMilestone *Milestone `xorm:"-"` - Milestone *Milestone `xorm:"-"` - TimeID int64 - Time *TrackedTime `xorm:"-"` - AssigneeID int64 - RemovedAssignee bool - Assignee *user_model.User `xorm:"-"` - AssigneeTeamID int64 `xorm:"NOT NULL DEFAULT 0"` - AssigneeTeam *organization.Team `xorm:"-"` - ResolveDoerID int64 - ResolveDoer *user_model.User `xorm:"-"` - OldTitle string - NewTitle string - OldRef string - NewRef string - DependentIssueID int64 `xorm:"index"` // This is used by issue_service.deleteIssue - DependentIssue *Issue `xorm:"-"` + ID int64 `xorm:"pk autoincr"` + Type CommentType `xorm:"INDEX"` + PosterID int64 `xorm:"INDEX"` + Poster *user_model.User `xorm:"-"` + OriginalAuthor string + OriginalAuthorID int64 + IssueID int64 `xorm:"INDEX"` + Issue *Issue `xorm:"-"` + LabelID int64 + Label *Label `xorm:"-"` + Aggregator *ActionAggregator `xorm:"-"` + AddedLabels []*Label `xorm:"-"` + RemovedLabels []*Label `xorm:"-"` + AddedRequestReview []RequestReviewTarget `xorm:"-"` + RemovedRequestReview []RequestReviewTarget `xorm:"-"` + OldProjectID int64 + ProjectID int64 + OldProject *project_model.Project `xorm:"-"` + Project *project_model.Project `xorm:"-"` + OldMilestoneID int64 + MilestoneID int64 + OldMilestone *Milestone `xorm:"-"` + Milestone *Milestone `xorm:"-"` + TimeID int64 + Time *TrackedTime `xorm:"-"` + AssigneeID int64 + RemovedAssignee bool + Assignee *user_model.User `xorm:"-"` + AssigneeTeamID int64 `xorm:"NOT NULL DEFAULT 0"` + AssigneeTeam *organization.Team `xorm:"-"` + ResolveDoerID int64 + ResolveDoer *user_model.User `xorm:"-"` + OldTitle string + NewTitle string + OldRef string + NewRef string + DependentIssueID int64 `xorm:"index"` // This is used by issue_service.deleteIssue + DependentIssue *Issue `xorm:"-"` CommitID int64 Line int64 // - previous line / + proposed line @@ -629,8 +649,11 @@ func (c *Comment) LoadAssigneeUserAndTeam(ctx context.Context) error { if c.Issue.Repo.Owner.IsOrganization() { c.AssigneeTeam, err = organization.GetTeamByID(ctx, c.AssigneeTeamID) - if err != nil && !organization.IsErrTeamNotExist(err) { - return err + if err != nil { + if !organization.IsErrTeamNotExist(err) { + return err + } + c.AssigneeTeam = organization.NewGhostTeam() } } } @@ -879,7 +902,7 @@ func updateCommentInfos(ctx context.Context, opts *CreateCommentOptions, comment } fallthrough case CommentTypeComment: - if _, err = db.Exec(ctx, "UPDATE `issue` SET num_comments=num_comments+1 WHERE id=?", opts.Issue.ID); err != nil { + if err := UpdateIssueNumComments(ctx, opts.Issue.ID); err != nil { return err } fallthrough @@ -1094,7 +1117,7 @@ func FindComments(ctx context.Context, opts *FindCommentsOptions) (CommentList, sess.Join("INNER", "issue", "issue.id = comment.issue_id") } - if opts.Page != 0 { + if opts.Page > 0 { sess = db.SetSessionPagination(sess, opts) } @@ -1174,8 +1197,8 @@ func DeleteComment(ctx context.Context, comment *Comment) error { return err } - if comment.Type == CommentTypeComment { - if _, err := e.ID(comment.IssueID).Decr("num_comments").Update(new(Issue)); err != nil { + if comment.Type.CountedAsConversation() { + if err := UpdateIssueNumComments(ctx, comment.IssueID); err != nil { return err } } @@ -1292,6 +1315,21 @@ func (c *Comment) HasOriginalAuthor() bool { return c.OriginalAuthor != "" && c.OriginalAuthorID != 0 } +func UpdateIssueNumCommentsBuilder(issueID int64) *builder.Builder { + subQuery := builder.Select("COUNT(*)").From("`comment`").Where( + builder.Eq{"issue_id": issueID}.And( + builder.In("`type`", ConversationCountedCommentType()), + )) + + return builder.Update(builder.Eq{"num_comments": subQuery}). + From("`issue`").Where(builder.Eq{"id": issueID}) +} + +func UpdateIssueNumComments(ctx context.Context, issueID int64) error { + _, err := db.GetEngine(ctx).Exec(UpdateIssueNumCommentsBuilder(issueID)) + return err +} + // InsertIssueComments inserts many comments of issues. func InsertIssueComments(ctx context.Context, comments []*Comment) error { if len(comments) == 0 { @@ -1324,8 +1362,7 @@ func InsertIssueComments(ctx context.Context, comments []*Comment) error { } for _, issueID := range issueIDs { - if _, err := db.Exec(ctx, "UPDATE issue set num_comments = (SELECT count(*) FROM comment WHERE issue_id = ? AND `type`=?) WHERE id = ?", - issueID, CommentTypeComment, issueID); err != nil { + if err := UpdateIssueNumComments(ctx, issueID); err != nil { return err } } diff --git a/models/issues/comment_code.go b/models/issues/comment_code.go index 2f6f57e0da..3c87a1b41a 100644 --- a/models/issues/comment_code.go +++ b/models/issues/comment_code.go @@ -6,10 +6,10 @@ package issues import ( "context" - "code.gitea.io/gitea/models/db" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/markup" - "code.gitea.io/gitea/modules/markup/markdown" + "forgejo.org/models/db" + user_model "forgejo.org/models/user" + "forgejo.org/modules/markup" + "forgejo.org/modules/markup/markdown" "xorm.io/builder" ) diff --git a/models/issues/comment_list.go b/models/issues/comment_list.go index 7a133d1c16..7285e347b4 100644 --- a/models/issues/comment_list.go +++ b/models/issues/comment_list.go @@ -6,11 +6,11 @@ package issues import ( "context" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/log" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/container" + "forgejo.org/modules/log" ) // CommentList defines a list of comments diff --git a/models/issues/comment_list_test.go b/models/issues/comment_list_test.go index 5ad1cd19c9..062a710b84 100644 --- a/models/issues/comment_list_test.go +++ b/models/issues/comment_list_test.go @@ -6,10 +6,10 @@ package issues import ( "testing" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + 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" diff --git a/models/issues/comment_test.go b/models/issues/comment_test.go index f7088cc96c..0e257f533c 100644 --- a/models/issues/comment_test.go +++ b/models/issues/comment_test.go @@ -7,12 +7,12 @@ import ( "testing" "time" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/structs" + "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" + "forgejo.org/modules/structs" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -125,3 +125,12 @@ func TestUpdateCommentsMigrationsByType(t *testing.T) { assert.Empty(t, comment.OriginalAuthorID) assert.EqualValues(t, 513, comment.PosterID) } + +func Test_UpdateIssueNumComments(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + issue2 := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2}) + + require.NoError(t, issues_model.UpdateIssueNumComments(db.DefaultContext, issue2.ID)) + issue2 = unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2}) + assert.EqualValues(t, 1, issue2.NumComments) +} diff --git a/models/issues/content_history.go b/models/issues/content_history.go index cd3e217b21..476c6e0f90 100644 --- a/models/issues/content_history.go +++ b/models/issues/content_history.go @@ -7,11 +7,11 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/avatars" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/avatars" + "forgejo.org/models/db" + "forgejo.org/modules/log" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) diff --git a/models/issues/content_history_test.go b/models/issues/content_history_test.go index dde6f195bc..4e158da1cc 100644 --- a/models/issues/content_history_test.go +++ b/models/issues/content_history_test.go @@ -6,10 +6,10 @@ package issues_test import ( "testing" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + "forgejo.org/models/unittest" + "forgejo.org/modules/timeutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/issues/dependency.go b/models/issues/dependency.go index 146dd1887d..fab35dad12 100644 --- a/models/issues/dependency.go +++ b/models/issues/dependency.go @@ -7,10 +7,10 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + user_model "forgejo.org/models/user" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" ) // ErrDependencyExists represents a "DependencyAlreadyExists" kind of error. diff --git a/models/issues/dependency_test.go b/models/issues/dependency_test.go index 1e73c581ee..46f3ad10e5 100644 --- a/models/issues/dependency_test.go +++ b/models/issues/dependency_test.go @@ -6,10 +6,10 @@ package issues_test import ( "testing" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/issues/issue.go b/models/issues/issue.go index f7379b7e0c..142f2de182 100644 --- a/models/issues/issue.go +++ b/models/issues/issue.go @@ -11,16 +11,16 @@ import ( "regexp" "slices" - "code.gitea.io/gitea/models/db" - project_model "code.gitea.io/gitea/models/project" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - api "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + project_model "forgejo.org/models/project" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/container" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + api "forgejo.org/modules/structs" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) @@ -63,21 +63,6 @@ func (err ErrIssueIsClosed) Error() string { return fmt.Sprintf("issue is closed [id: %d, repo_id: %d, index: %d]", err.ID, err.RepoID, err.Index) } -// ErrNewIssueInsert is used when the INSERT statement in newIssue fails -type ErrNewIssueInsert struct { - OriginalError error -} - -// IsErrNewIssueInsert checks if an error is a ErrNewIssueInsert. -func IsErrNewIssueInsert(err error) bool { - _, ok := err.(ErrNewIssueInsert) - return ok -} - -func (err ErrNewIssueInsert) Error() string { - return err.OriginalError.Error() -} - // ErrIssueWasClosed is used when close a closed issue type ErrIssueWasClosed struct { ID int64 @@ -268,6 +253,9 @@ func (issue *Issue) loadCommentsByType(ctx context.Context, tp CommentType) (err IssueID: issue.ID, Type: tp, }) + for _, comment := range issue.Comments { + comment.Issue = issue + } return err } @@ -411,6 +399,11 @@ func (issue *Issue) HTMLURL() string { return fmt.Sprintf("%s/%s/%d", issue.Repo.HTMLURL(), path, issue.Index) } +// SummaryCardURL returns the absolute URL to an image providing a summary of the issue +func (issue *Issue) SummaryCardURL() string { + return fmt.Sprintf("%s/summary-card", issue.HTMLURL()) +} + // Link returns the issue's relative URL. func (issue *Issue) Link() string { var path string @@ -553,6 +546,9 @@ func GetIssueByID(ctx context.Context, id int64) (*Issue, error) { // If keepOrder is true, the order of the returned issues will be the same as the given IDs. func GetIssuesByIDs(ctx context.Context, issueIDs []int64, keepOrder ...bool) (IssueList, error) { issues := make([]*Issue, 0, len(issueIDs)) + if len(issueIDs) == 0 { + return issues, nil + } if err := db.GetEngine(ctx).In("id", issueIDs).Find(&issues); err != nil { return nil, err @@ -644,7 +640,7 @@ func (issue *Issue) BlockedByDependencies(ctx context.Context, opts db.ListOptio Where("issue_id = ?", issue.ID). // sort by repo id then created date, with the issues of the same repo at the beginning of the list OrderBy("CASE WHEN issue.repo_id = ? THEN 0 ELSE issue.repo_id END, issue.created_unix DESC", issue.RepoID) - if opts.Page != 0 { + if opts.Page > 0 { sess = db.SetSessionPagination(sess, &opts) } err = sess.Find(&issueDeps) @@ -875,7 +871,7 @@ func GetPinnedIssues(ctx context.Context, repoID int64, isPull bool) (IssueList, return issues, nil } -// IsNewPinnedAllowed returns if a new Issue or Pull request can be pinned +// IsNewPinAllowed returns if a new Issue or Pull request can be pinned func IsNewPinAllowed(ctx context.Context, repoID int64, isPull bool) (bool, error) { var maxPin int _, err := db.GetEngine(ctx).SQL("SELECT COUNT(pin_order) FROM issue WHERE repo_id = ? AND is_pull = ? AND pin_order > 0", repoID, isPull).Get(&maxPin) diff --git a/models/issues/issue_index.go b/models/issues/issue_index.go index 9386027f74..5012067d70 100644 --- a/models/issues/issue_index.go +++ b/models/issues/issue_index.go @@ -6,7 +6,7 @@ package issues import ( "context" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" ) func GetMaxIssueIndexForRepo(ctx context.Context, repoID int64) (int64, error) { diff --git a/models/issues/issue_index_test.go b/models/issues/issue_index_test.go index eb79a0806c..6de3f0bc95 100644 --- a/models/issues/issue_index_test.go +++ b/models/issues/issue_index_test.go @@ -6,10 +6,10 @@ package issues_test import ( "testing" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/issues/issue_label.go b/models/issues/issue_label.go index 10fc821454..c9e792ed0f 100644 --- a/models/issues/issue_label.go +++ b/models/issues/issue_label.go @@ -8,9 +8,9 @@ import ( "fmt" "sort" - "code.gitea.io/gitea/models/db" - access_model "code.gitea.io/gitea/models/perm/access" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + access_model "forgejo.org/models/perm/access" + user_model "forgejo.org/models/user" "xorm.io/builder" ) @@ -111,9 +111,7 @@ func NewIssueLabel(ctx context.Context, issue *Issue, label *Label, doer *user_m return err } - issue.isLabelsLoaded = false - issue.Labels = nil - if err = issue.LoadLabels(ctx); err != nil { + if err = issue.ReloadLabels(ctx); err != nil { return err } @@ -161,10 +159,7 @@ func NewIssueLabels(ctx context.Context, issue *Issue, labels []*Label, doer *us return err } - // reload all labels - issue.isLabelsLoaded = false - issue.Labels = nil - if err = issue.LoadLabels(ctx); err != nil { + if err = issue.ReloadLabels(ctx); err != nil { return err } @@ -205,8 +200,7 @@ func DeleteIssueLabel(ctx context.Context, issue *Issue, label *Label, doer *use return err } - issue.Labels = nil - return issue.LoadLabels(ctx) + return issue.ReloadLabels(ctx) } // DeleteLabelsByRepoID deletes labels of some repository @@ -326,14 +320,23 @@ func FixIssueLabelWithOutsideLabels(ctx context.Context) (int64, error) { return res.RowsAffected() } -// LoadLabels loads labels +// LoadLabels only if they are not already set func (issue *Issue) LoadLabels(ctx context.Context) (err error) { - if !issue.isLabelsLoaded && issue.Labels == nil && issue.ID != 0 { + if !issue.isLabelsLoaded && issue.Labels == nil { + if err := issue.ReloadLabels(ctx); err != nil { + return err + } + issue.isLabelsLoaded = true + } + return nil +} + +func (issue *Issue) ReloadLabels(ctx context.Context) (err error) { + if issue.ID != 0 { issue.Labels, err = GetLabelsByIssueID(ctx, issue.ID) if err != nil { return fmt.Errorf("getLabelsByIssueID [%d]: %w", issue.ID, err) } - issue.isLabelsLoaded = true } return nil } @@ -496,8 +499,7 @@ func ReplaceIssueLabels(ctx context.Context, issue *Issue, labels []*Label, doer } } - issue.Labels = nil - if err = issue.LoadLabels(ctx); err != nil { + if err = issue.ReloadLabels(ctx); err != nil { return err } diff --git a/models/issues/issue_label_test.go b/models/issues/issue_label_test.go index b6b39d683d..753e389c7b 100644 --- a/models/issues/issue_label_test.go +++ b/models/issues/issue_label_test.go @@ -6,15 +6,123 @@ package issues_test import ( "testing" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) +func TestIssueNewIssueLabels(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2}) + label1 := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 1}) + label2 := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 4}) + doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + + label3 := &issues_model.Label{RepoID: 1, Name: "label3", Color: "#123"} + require.NoError(t, issues_model.NewLabel(db.DefaultContext, label3)) + + // label1 is already set, do nothing + // label3 is new, add it + require.NoError(t, issues_model.NewIssueLabels(db.DefaultContext, issue, []*issues_model.Label{label1, label3}, doer)) + + assert.Len(t, issue.Labels, 3) + // check that the pre-existing label1 is still present + assert.Equal(t, label1.ID, issue.Labels[0].ID) + // check that new label3 was added + assert.Equal(t, label3.ID, issue.Labels[1].ID) + // check that pre-existing label2 was not removed + assert.Equal(t, label2.ID, issue.Labels[2].ID) +} + +func TestIssueNewIssueLabel(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 3}) + doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + + label := &issues_model.Label{RepoID: 1, Name: "label3", Color: "#123"} + require.NoError(t, issues_model.NewLabel(db.DefaultContext, label)) + + require.NoError(t, issues_model.NewIssueLabel(db.DefaultContext, issue, label, doer)) + + assert.Len(t, issue.Labels, 1) + assert.Equal(t, label.ID, issue.Labels[0].ID) +} + +func TestIssueReplaceIssueLabels(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2}) + label1 := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 1}) + label2 := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 4}) + doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + + label3 := &issues_model.Label{RepoID: 1, Name: "label3", Color: "#123"} + require.NoError(t, issues_model.NewLabel(db.DefaultContext, label3)) + + issue.LoadLabels(db.DefaultContext) + assert.Len(t, issue.Labels, 2) + assert.Equal(t, label1.ID, issue.Labels[0].ID) + assert.Equal(t, label2.ID, issue.Labels[1].ID) + + // label1 is already set, do nothing + // label3 is new, add it + // label2 is not in the list but already set, remove it + require.NoError(t, issues_model.ReplaceIssueLabels(db.DefaultContext, issue, []*issues_model.Label{label1, label3}, doer)) + + assert.Len(t, issue.Labels, 2) + assert.Equal(t, label1.ID, issue.Labels[0].ID) + assert.Equal(t, label3.ID, issue.Labels[1].ID) +} + +func TestIssueDeleteIssueLabel(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2}) + label1 := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 1}) + label2 := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 4}) + doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + + issue.LoadLabels(db.DefaultContext) + assert.Len(t, issue.Labels, 2) + assert.Equal(t, label1.ID, issue.Labels[0].ID) + assert.Equal(t, label2.ID, issue.Labels[1].ID) + + require.NoError(t, issues_model.DeleteIssueLabel(db.DefaultContext, issue, label2, doer)) + + assert.Len(t, issue.Labels, 1) + assert.Equal(t, label1.ID, issue.Labels[0].ID) +} + +func TestIssueLoadLabels(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2}) + label1 := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 1}) + label2 := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 4}) + + assert.Empty(t, issue.Labels) + issue.LoadLabels(db.DefaultContext) + assert.Len(t, issue.Labels, 2) + assert.Equal(t, label1.ID, issue.Labels[0].ID) + assert.Equal(t, label2.ID, issue.Labels[1].ID) + + unittest.AssertSuccessfulDelete(t, &issues_model.IssueLabel{IssueID: issue.ID, LabelID: label2.ID}) + + // the database change is not noticed because the labels are cached + issue.LoadLabels(db.DefaultContext) + assert.Len(t, issue.Labels, 2) + + issue.ReloadLabels(db.DefaultContext) + assert.Len(t, issue.Labels, 1) + assert.Equal(t, label1.ID, issue.Labels[0].ID) +} + func TestNewIssueLabelsScope(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) diff --git a/models/issues/issue_list.go b/models/issues/issue_list.go index fe6c630a31..5a02baa428 100644 --- a/models/issues/issue_list.go +++ b/models/issues/issue_list.go @@ -7,11 +7,11 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - project_model "code.gitea.io/gitea/models/project" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/container" + "forgejo.org/models/db" + project_model "forgejo.org/models/project" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/container" "xorm.io/builder" ) diff --git a/models/issues/issue_list_test.go b/models/issues/issue_list_test.go index 32cc0fe423..7aa5222958 100644 --- a/models/issues/issue_list_test.go +++ b/models/issues/issue_list_test.go @@ -6,11 +6,11 @@ package issues_test import ( "testing" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/issues/issue_lock.go b/models/issues/issue_lock.go index b21629b529..1e4a5906d9 100644 --- a/models/issues/issue_lock.go +++ b/models/issues/issue_lock.go @@ -6,8 +6,8 @@ package issues import ( "context" - "code.gitea.io/gitea/models/db" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + user_model "forgejo.org/models/user" ) // IssueLockOptions defines options for locking and/or unlocking an issue/PR diff --git a/models/issues/issue_project.go b/models/issues/issue_project.go index 835ea1db52..3c6ce0ca1c 100644 --- a/models/issues/issue_project.go +++ b/models/issues/issue_project.go @@ -6,10 +6,12 @@ package issues import ( "context" - "code.gitea.io/gitea/models/db" - project_model "code.gitea.io/gitea/models/project" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + org_model "forgejo.org/models/organization" + project_model "forgejo.org/models/project" + user_model "forgejo.org/models/user" + "forgejo.org/modules/optional" + "forgejo.org/modules/util" ) // LoadProject load the project the issue was assigned to @@ -48,22 +50,28 @@ func (issue *Issue) ProjectColumnID(ctx context.Context) int64 { } // LoadIssuesFromColumn load issues assigned to this column -func LoadIssuesFromColumn(ctx context.Context, b *project_model.Column) (IssueList, error) { - issueList, err := Issues(ctx, &IssuesOptions{ +func LoadIssuesFromColumn(ctx context.Context, b *project_model.Column, doer *user_model.User, org *org_model.Organization, isClosed optional.Option[bool]) (IssueList, error) { + issueOpts := &IssuesOptions{ ProjectColumnID: b.ID, ProjectID: b.ProjectID, SortType: "project-column-sorting", - }) + IsClosed: isClosed, + AllPublic: true, + } + if doer != nil { + issueOpts.User = doer + issueOpts.Org = org + } + + issueList, err := Issues(ctx, issueOpts) if err != nil { return nil, err } if b.Default { - issues, err := Issues(ctx, &IssuesOptions{ - ProjectColumnID: db.NoConditionID, - ProjectID: b.ProjectID, - SortType: "project-column-sorting", - }) + issueOpts.ProjectColumnID = db.NoConditionID + + issues, err := Issues(ctx, issueOpts) if err != nil { return nil, err } @@ -78,10 +86,10 @@ func LoadIssuesFromColumn(ctx context.Context, b *project_model.Column) (IssueLi } // LoadIssuesFromColumnList load issues assigned to the columns -func LoadIssuesFromColumnList(ctx context.Context, bs project_model.ColumnList) (map[int64]IssueList, error) { +func LoadIssuesFromColumnList(ctx context.Context, bs project_model.ColumnList, doer *user_model.User, org *org_model.Organization, isClosed optional.Option[bool]) (map[int64]IssueList, error) { issuesMap := make(map[int64]IssueList, len(bs)) for i := range bs { - il, err := LoadIssuesFromColumn(ctx, bs[i]) + il, err := LoadIssuesFromColumn(ctx, bs[i], doer, org, isClosed) if err != nil { return nil, err } @@ -160,3 +168,36 @@ func IssueAssignOrRemoveProject(ctx context.Context, issue *Issue, doer *user_mo }) }) } + +// NumIssuesInProjects returns the amount of issues assigned to one of the project +// in the list which the doer can access. +func NumIssuesInProjects(ctx context.Context, pl []*project_model.Project, doer *user_model.User, org *org_model.Organization, isClosed optional.Option[bool]) (map[int64]int, error) { + numMap := make(map[int64]int, len(pl)) + for _, p := range pl { + num, err := NumIssuesInProject(ctx, p, doer, org, isClosed) + if err != nil { + return nil, err + } + numMap[p.ID] = num + } + + return numMap, nil +} + +// NumIssuesInProject returns the amount of issues assigned to the project which +// the doer can access. +func NumIssuesInProject(ctx context.Context, p *project_model.Project, doer *user_model.User, org *org_model.Organization, isClosed optional.Option[bool]) (int, error) { + numIssuesInProject := int(0) + bs, err := p.GetColumns(ctx) + if err != nil { + return 0, err + } + im, err := LoadIssuesFromColumnList(ctx, bs, doer, org, isClosed) + if err != nil { + return 0, err + } + for _, il := range im { + numIssuesInProject += len(il) + } + return numIssuesInProject, nil +} diff --git a/models/issues/issue_project_test.go b/models/issues/issue_project_test.go new file mode 100644 index 0000000000..099679a8c7 --- /dev/null +++ b/models/issues/issue_project_test.go @@ -0,0 +1,173 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package issues_test + +import ( + "testing" + + "forgejo.org/models/db" + "forgejo.org/models/issues" + "forgejo.org/models/organization" + "forgejo.org/models/project" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/optional" + "forgejo.org/tests" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestPrivateIssueProjects(t *testing.T) { + defer unittest.OverrideFixtures("models/fixtures/PrivateIssueProjects")() + require.NoError(t, unittest.PrepareTestDatabase()) + + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + t.Run("Organization project", func(t *testing.T) { + org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3}) + orgProject := unittest.AssertExistsAndLoadBean(t, &project.Project{ID: 1001, OwnerID: org.ID}) + column := unittest.AssertExistsAndLoadBean(t, &project.Column{ID: 1001, ProjectID: orgProject.ID}) + + t.Run("Authenticated user", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + issueList, err := issues.LoadIssuesFromColumn(db.DefaultContext, column, user2, org, optional.None[bool]()) + require.NoError(t, err) + assert.Len(t, issueList, 2) + assert.EqualValues(t, 16, issueList[0].ID) + assert.EqualValues(t, 6, issueList[1].ID) + + issuesNum, err := issues.NumIssuesInProject(db.DefaultContext, orgProject, user2, org, optional.None[bool]()) + require.NoError(t, err) + assert.EqualValues(t, 2, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user2, org, optional.Some(true)) + require.NoError(t, err) + assert.EqualValues(t, 0, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user2, org, optional.Some(false)) + require.NoError(t, err) + assert.EqualValues(t, 2, issuesNum) + }) + + t.Run("Anonymous user", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + issueList, err := issues.LoadIssuesFromColumn(db.DefaultContext, column, nil, org, optional.None[bool]()) + require.NoError(t, err) + assert.Len(t, issueList, 1) + assert.EqualValues(t, 16, issueList[0].ID) + + issuesNum, err := issues.NumIssuesInProject(db.DefaultContext, orgProject, nil, org, optional.None[bool]()) + require.NoError(t, err) + assert.EqualValues(t, 1, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, nil, org, optional.Some(true)) + require.NoError(t, err) + assert.EqualValues(t, 0, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, nil, org, optional.Some(false)) + require.NoError(t, err) + assert.EqualValues(t, 1, issuesNum) + }) + }) + + t.Run("User project", func(t *testing.T) { + userProject := unittest.AssertExistsAndLoadBean(t, &project.Project{ID: 1002, OwnerID: user2.ID}) + column := unittest.AssertExistsAndLoadBean(t, &project.Column{ID: 1002, ProjectID: userProject.ID}) + + t.Run("Authenticated user", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + issueList, err := issues.LoadIssuesFromColumn(db.DefaultContext, column, user2, nil, optional.None[bool]()) + require.NoError(t, err) + assert.Len(t, issueList, 2) + assert.EqualValues(t, 7, issueList[0].ID) + assert.EqualValues(t, 1, issueList[1].ID) + + issuesNum, err := issues.NumIssuesInProject(db.DefaultContext, userProject, user2, nil, optional.None[bool]()) + require.NoError(t, err) + assert.EqualValues(t, 2, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, userProject, user2, nil, optional.Some(true)) + require.NoError(t, err) + assert.EqualValues(t, 0, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, userProject, user2, nil, optional.Some(false)) + require.NoError(t, err) + assert.EqualValues(t, 2, issuesNum) + }) + + t.Run("Anonymous user", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + issueList, err := issues.LoadIssuesFromColumn(db.DefaultContext, column, nil, nil, optional.None[bool]()) + require.NoError(t, err) + assert.Len(t, issueList, 1) + assert.EqualValues(t, 1, issueList[0].ID) + + issuesNum, err := issues.NumIssuesInProject(db.DefaultContext, userProject, nil, nil, optional.None[bool]()) + require.NoError(t, err) + assert.EqualValues(t, 1, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, userProject, nil, nil, optional.Some(true)) + require.NoError(t, err) + assert.EqualValues(t, 0, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, userProject, nil, nil, optional.Some(false)) + require.NoError(t, err) + assert.EqualValues(t, 1, issuesNum) + }) + }) +} + +func TestPrivateRepoProjects(t *testing.T) { + defer unittest.OverrideFixtures("models/fixtures/TestPrivateRepoProjects")() + require.NoError(t, unittest.PrepareTestDatabase()) + + org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3}) + orgProject := unittest.AssertExistsAndLoadBean(t, &project.Project{ID: 1001, OwnerID: org.ID}) + column := unittest.AssertExistsAndLoadBean(t, &project.Column{ID: 1001, ProjectID: orgProject.ID}) + + t.Run("Partial access", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + user29 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 29}) + + issueList, err := issues.LoadIssuesFromColumn(db.DefaultContext, column, user29, org, optional.None[bool]()) + require.NoError(t, err) + assert.Len(t, issueList, 1) + assert.EqualValues(t, 6, issueList[0].ID) + + issuesNum, err := issues.NumIssuesInProject(db.DefaultContext, orgProject, user29, org, optional.None[bool]()) + require.NoError(t, err) + assert.EqualValues(t, 1, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user29, org, optional.Some(true)) + require.NoError(t, err) + assert.EqualValues(t, 0, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user29, org, optional.Some(false)) + require.NoError(t, err) + assert.EqualValues(t, 1, issuesNum) + }) + + t.Run("Full access", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + + issueList, err := issues.LoadIssuesFromColumn(db.DefaultContext, column, user2, org, optional.None[bool]()) + require.NoError(t, err) + assert.Len(t, issueList, 2) + assert.EqualValues(t, 15, issueList[0].ID) + assert.EqualValues(t, 6, issueList[1].ID) + + issuesNum, err := issues.NumIssuesInProject(db.DefaultContext, orgProject, user2, org, optional.None[bool]()) + require.NoError(t, err) + assert.EqualValues(t, 2, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user2, org, optional.Some(true)) + require.NoError(t, err) + assert.EqualValues(t, 0, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user2, org, optional.Some(false)) + require.NoError(t, err) + assert.EqualValues(t, 2, issuesNum) + }) +} diff --git a/models/issues/issue_search.go b/models/issues/issue_search.go index e9f116bfc6..bf4b89ee0b 100644 --- a/models/issues/issue_search.go +++ b/models/issues/issue_search.go @@ -9,13 +9,13 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/organization" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unit" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/optional" + "forgejo.org/models/db" + "forgejo.org/models/organization" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unit" + user_model "forgejo.org/models/user" + "forgejo.org/modules/container" + "forgejo.org/modules/optional" "xorm.io/builder" "xorm.io/xorm" @@ -49,9 +49,13 @@ type IssuesOptions struct { //nolint // prioritize issues from this repo PriorityRepoID int64 IsArchived optional.Option[bool] - Org *organization.Organization // issues permission scope - Team *organization.Team // issues permission scope - User *user_model.User // issues permission scope + + // If combined with AllPublic, then private as well as public issues + // that matches the criteria will be returned, if AllPublic is false + // only the private issues will be returned. + Org *organization.Organization // issues permission scope + Team *organization.Team // issues permission scope + User *user_model.User // issues permission scope } // applySorts sort an issues-related session based on the provided @@ -196,7 +200,8 @@ func applyRepoConditions(sess *xorm.Session, opts *IssuesOptions) { } else if len(opts.RepoIDs) > 1 { opts.RepoCond = builder.In("issue.repo_id", opts.RepoIDs) } - if opts.AllPublic { + // If permission scoping is set, then we set this condition at a later stage. + if opts.AllPublic && opts.User == nil { if opts.RepoCond == nil { opts.RepoCond = builder.NewCond() } @@ -268,7 +273,14 @@ func applyConditions(sess *xorm.Session, opts *IssuesOptions) { applyLabelsCondition(sess, opts) if opts.User != nil { - sess.And(issuePullAccessibleRepoCond("issue.repo_id", opts.User.ID, opts.Org, opts.Team, opts.IsPull.Value())) + cond := issuePullAccessibleRepoCond("issue.repo_id", opts.User.ID, opts.Org, opts.Team, opts.IsPull.Value()) + // If AllPublic was set, then also consider all issues in public + // repositories in addition to the private repositories the user has access + // to. + if opts.AllPublic { + cond = cond.Or(builder.In("issue.repo_id", builder.Select("id").From("repository").Where(builder.Eq{"is_private": false}))) + } + sess.And(cond) } } @@ -329,6 +341,9 @@ func issuePullAccessibleRepoCond(repoIDstr string, userID int64, org *organizati builder.Or( repo_model.UserOrgUnitRepoCond(repoIDstr, userID, org.ID, unitType), // team member repos repo_model.UserOrgPublicUnitRepoCond(userID, org.ID), // user org public non-member repos, TODO: check repo has issues + builder.And( + builder.In("issue.repo_id", builder.Select("id").From("repository").Where(builder.Eq{"owner_id": org.ID})), + repo_model.UserAccessRepoCond(repoIDstr, userID)), // user can access org repo in a unit independent way ), ) } diff --git a/models/issues/issue_stats.go b/models/issues/issue_stats.go index dc634cf00e..eee8760b9f 100644 --- a/models/issues/issue_stats.go +++ b/models/issues/issue_stats.go @@ -7,7 +7,7 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" "xorm.io/builder" "xorm.io/xorm" @@ -15,13 +15,13 @@ import ( // IssueStats represents issue statistic information. type IssueStats struct { - OpenCount, ClosedCount int64 - YourRepositoriesCount int64 - AssignCount int64 - CreateCount int64 - MentionCount int64 - ReviewRequestedCount int64 - ReviewedCount int64 + OpenCount, ClosedCount, AllCount int64 + YourRepositoriesCount int64 + AssignCount int64 + CreateCount int64 + MentionCount int64 + ReviewRequestedCount int64 + ReviewedCount int64 } // Filter modes. @@ -104,6 +104,7 @@ func GetIssueStats(ctx context.Context, opts *IssuesOptions) (*IssueStats, error } accum.OpenCount += stats.OpenCount accum.ClosedCount += stats.ClosedCount + accum.AllCount += stats.AllCount accum.YourRepositoriesCount += stats.YourRepositoriesCount accum.AssignCount += stats.AssignCount accum.CreateCount += stats.CreateCount @@ -131,7 +132,13 @@ func getIssueStatsChunk(ctx context.Context, opts *IssuesOptions, issueIDs []int stats.ClosedCount, err = applyIssuesOptions(sess, opts, issueIDs). And("issue.is_closed = ?", true). Count(new(Issue)) - return stats, err + if err != nil { + return stats, err + } + + stats.AllCount = stats.OpenCount + stats.ClosedCount + + return stats, nil } func applyIssuesOptions(sess *xorm.Session, opts *IssuesOptions, issueIDs []int64) *xorm.Session { diff --git a/models/issues/issue_stats_test.go b/models/issues/issue_stats_test.go index fda75a6b47..549dc04433 100644 --- a/models/issues/issue_stats_test.go +++ b/models/issues/issue_stats_test.go @@ -6,9 +6,9 @@ package issues_test import ( "testing" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -25,6 +25,7 @@ func TestGetIssueStats(t *testing.T) { assert.Equal(t, int64(4), stats.OpenCount) assert.Equal(t, int64(1), stats.ClosedCount) + assert.Equal(t, int64(5), stats.AllCount) assert.Equal(t, int64(0), stats.YourRepositoriesCount) assert.Equal(t, int64(0), stats.AssignCount) assert.Equal(t, int64(0), stats.CreateCount) diff --git a/models/issues/issue_test.go b/models/issues/issue_test.go index 580be9663b..afca27dfcf 100644 --- a/models/issues/issue_test.go +++ b/models/issues/issue_test.go @@ -4,19 +4,18 @@ package issues_test import ( - "context" "fmt" "sort" "sync" "testing" "time" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/setting" + "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" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -309,7 +308,7 @@ func TestIssue_ResolveMentions(t *testing.T) { func TestResourceIndex(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) - beforeCount, err := issues_model.CountIssues(context.Background(), &issues_model.IssuesOptions{}) + beforeCount, err := issues_model.CountIssues(t.Context(), &issues_model.IssuesOptions{}) require.NoError(t, err) var wg sync.WaitGroup @@ -326,7 +325,7 @@ func TestResourceIndex(t *testing.T) { t.Parallel() wg.Wait() - afterCount, err := issues_model.CountIssues(context.Background(), &issues_model.IssuesOptions{}) + afterCount, err := issues_model.CountIssues(t.Context(), &issues_model.IssuesOptions{}) require.NoError(t, err) assert.EqualValues(t, 100, afterCount-beforeCount) }) @@ -354,7 +353,7 @@ func TestCorrectIssueStats(t *testing.T) { wg.Wait() // Now we will get all issueID's that match the "Bugs are nasty" query. - issues, err := issues_model.Issues(context.TODO(), &issues_model.IssuesOptions{ + issues, err := issues_model.Issues(t.Context(), &issues_model.IssuesOptions{ Paginator: &db.ListOptions{ PageSize: issueAmount, }, diff --git a/models/issues/issue_update.go b/models/issues/issue_update.go index dbfd2fc91b..9d0bc84454 100644 --- a/models/issues/issue_update.go +++ b/models/issues/issue_update.go @@ -8,19 +8,20 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/organization" - "code.gitea.io/gitea/models/perm" - access_model "code.gitea.io/gitea/models/perm/access" - project_model "code.gitea.io/gitea/models/project" - repo_model "code.gitea.io/gitea/models/repo" - system_model "code.gitea.io/gitea/models/system" - "code.gitea.io/gitea/models/unit" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/references" - api "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/models/organization" + "forgejo.org/models/perm" + access_model "forgejo.org/models/perm/access" + project_model "forgejo.org/models/project" + repo_model "forgejo.org/models/repo" + system_model "forgejo.org/models/system" + "forgejo.org/models/unit" + user_model "forgejo.org/models/user" + "forgejo.org/modules/git" + "forgejo.org/modules/references" + api "forgejo.org/modules/structs" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) @@ -63,6 +64,10 @@ func changeIssueStatus(ctx context.Context, issue *Issue, doer *user_model.User, } func doChangeIssueStatus(ctx context.Context, issue *Issue, doer *user_model.User, isMergePull bool) (*Comment, error) { + if user_model.IsBlockedMultiple(ctx, []int64{issue.Repo.OwnerID, issue.PosterID}, doer.ID) { + return nil, user_model.ErrBlockedByUser + } + // Check for open dependencies if issue.IsClosed && issue.Repo.IsDependenciesEnabled(ctx) { // only check if dependencies are enabled and we're about to close an issue, otherwise reopening an issue would fail when there are unsatisfied dependencies @@ -154,6 +159,7 @@ func ChangeIssueTitle(ctx context.Context, issue *Issue, doer *user_model.User, } defer committer.Close() + issue.Title, _ = util.SplitStringAtByteN(issue.Title, 255) if err = UpdateIssueCols(ctx, issue, "name"); err != nil { return fmt.Errorf("updateIssueCols: %w", err) } @@ -409,6 +415,7 @@ func NewIssueWithIndex(ctx context.Context, doer *user_model.User, opts NewIssue } // NewIssue creates new issue with labels for repository. +// The title will be cut off at 255 characters if it's longer than 255 characters. func NewIssue(ctx context.Context, repo *repo_model.Repository, issue *Issue, labelIDs []int64, uuids []string) (err error) { ctx, committer, err := db.TxContext(ctx) if err != nil { @@ -422,6 +429,7 @@ func NewIssue(ctx context.Context, repo *repo_model.Repository, issue *Issue, la } issue.Index = idx + issue.Title, _ = util.SplitStringAtByteN(issue.Title, 255) if err = NewIssueWithIndex(ctx, issue.Poster, NewIssueOptions{ Repo: repo, @@ -429,7 +437,7 @@ func NewIssue(ctx context.Context, repo *repo_model.Repository, issue *Issue, la LabelIDs: labelIDs, Attachments: uuids, }); err != nil { - if repo_model.IsErrUserDoesNotHaveAccessToRepo(err) || IsErrNewIssueInsert(err) { + if repo_model.IsErrUserDoesNotHaveAccessToRepo(err) { return err } return fmt.Errorf("newIssue: %w", err) diff --git a/models/issues/issue_user.go b/models/issues/issue_user.go index 6b59e0725e..70e162411f 100644 --- a/models/issues/issue_user.go +++ b/models/issues/issue_user.go @@ -7,8 +7,8 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" ) // IssueUser represents an issue-user relation. diff --git a/models/issues/issue_user_test.go b/models/issues/issue_user_test.go index e059e43e8b..77e6c5bc5a 100644 --- a/models/issues/issue_user_test.go +++ b/models/issues/issue_user_test.go @@ -6,10 +6,10 @@ package issues_test import ( "testing" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" "github.com/stretchr/testify/require" ) diff --git a/models/issues/issue_watch.go b/models/issues/issue_watch.go index 9e616a0eb1..ecc09e1e81 100644 --- a/models/issues/issue_watch.go +++ b/models/issues/issue_watch.go @@ -6,10 +6,10 @@ package issues import ( "context" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/timeutil" ) // IssueWatch is connection request for receiving issue notification. @@ -105,7 +105,7 @@ func GetIssueWatchers(ctx context.Context, issueID int64, listOptions db.ListOpt And("`user`.prohibit_login = ?", false). Join("INNER", "`user`", "`user`.id = `issue_watch`.user_id") - if listOptions.Page != 0 { + if listOptions.Page > 0 { sess = db.SetSessionPagination(sess, &listOptions) watches := make([]*IssueWatch, 0, listOptions.PageSize) return watches, sess.Find(&watches) diff --git a/models/issues/issue_watch_test.go b/models/issues/issue_watch_test.go index 573215d577..a5c01693fa 100644 --- a/models/issues/issue_watch_test.go +++ b/models/issues/issue_watch_test.go @@ -6,9 +6,9 @@ package issues_test import ( "testing" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/issues/issue_xref.go b/models/issues/issue_xref.go index 9c9d5d66cd..4c753a58eb 100644 --- a/models/issues/issue_xref.go +++ b/models/issues/issue_xref.go @@ -7,12 +7,12 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - access_model "code.gitea.io/gitea/models/perm/access" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/references" + "forgejo.org/models/db" + access_model "forgejo.org/models/perm/access" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/log" + "forgejo.org/modules/references" ) type crossReference struct { diff --git a/models/issues/issue_xref_test.go b/models/issues/issue_xref_test.go index a24d1b04ee..e74717be1e 100644 --- a/models/issues/issue_xref_test.go +++ b/models/issues/issue_xref_test.go @@ -7,12 +7,12 @@ import ( "fmt" "testing" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/references" + "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" + "forgejo.org/modules/references" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/issues/label.go b/models/issues/label.go index 61478e17ac..264ca8cc3d 100644 --- a/models/issues/label.go +++ b/models/issues/label.go @@ -11,11 +11,11 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/label" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/label" + "forgejo.org/modules/optional" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) @@ -303,6 +303,9 @@ func GetLabelByID(ctx context.Context, labelID int64) (*Label, error) { // GetLabelsByIDs returns a list of labels by IDs func GetLabelsByIDs(ctx context.Context, labelIDs []int64, cols ...string) ([]*Label, error) { labels := make([]*Label, 0, len(labelIDs)) + if len(labelIDs) == 0 { + return labels, nil + } return labels, db.GetEngine(ctx).Table("label"). In("id", labelIDs). Asc("name"). @@ -353,6 +356,17 @@ func GetLabelIDsInRepoByNames(ctx context.Context, repoID int64, labelNames []st Find(&labelIDs) } +// GetLabelIDsInOrgByNames returns a list of labelIDs by names in a given org. +func GetLabelIDsInOrgByNames(ctx context.Context, orgID int64, labelNames []string) ([]int64, error) { + labelIDs := make([]int64, 0, len(labelNames)) + return labelIDs, db.GetEngine(ctx).Table("label"). + Where("org_id = ?", orgID). + In("name", labelNames). + Asc("name"). + Cols("id"). + Find(&labelIDs) +} + // BuildLabelNamesIssueIDsCondition returns a builder where get issue ids match label names func BuildLabelNamesIssueIDsCondition(labelNames []string) *builder.Builder { return builder.Select("issue_label.issue_id"). @@ -368,6 +382,9 @@ func BuildLabelNamesIssueIDsCondition(labelNames []string) *builder.Builder { // it silently ignores label IDs that do not belong to the repository. func GetLabelsInRepoByIDs(ctx context.Context, repoID int64, labelIDs []int64) ([]*Label, error) { labels := make([]*Label, 0, len(labelIDs)) + if len(labelIDs) == 0 { + return labels, nil + } return labels, db.GetEngine(ctx). Where("repo_id = ?", repoID). In("id", labelIDs). @@ -394,7 +411,7 @@ func GetLabelsByRepoID(ctx context.Context, repoID int64, sortType string, listO sess.Asc("name") } - if listOptions.Page != 0 { + if listOptions.Page > 0 { sess = db.SetSessionPagination(sess, &listOptions) } @@ -440,6 +457,9 @@ func GetLabelInOrgByID(ctx context.Context, orgID, labelID int64) (*Label, error // it silently ignores label IDs that do not belong to the organization. func GetLabelsInOrgByIDs(ctx context.Context, orgID int64, labelIDs []int64) ([]*Label, error) { labels := make([]*Label, 0, len(labelIDs)) + if len(labelIDs) == 0 { + return labels, nil + } return labels, db.GetEngine(ctx). Where("org_id = ?", orgID). In("id", labelIDs). @@ -466,7 +486,7 @@ func GetLabelsByOrgID(ctx context.Context, orgID int64, sortType string, listOpt sess.Asc("name") } - if listOptions.Page != 0 { + if listOptions.Page > 0 { sess = db.SetSessionPagination(sess, &listOptions) } diff --git a/models/issues/label_test.go b/models/issues/label_test.go index b03fc1cd20..f2ba28a6d2 100644 --- a/models/issues/label_test.go +++ b/models/issues/label_test.go @@ -6,12 +6,12 @@ package issues_test import ( "testing" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/timeutil" + "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" + "forgejo.org/modules/timeutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -231,8 +231,7 @@ func TestGetLabelsByOrgID(t *testing.T) { testSuccess(3, "reversealphabetically", []int64{4, 3}) testSuccess(3, "default", []int64{3, 4}) - var err error - _, err = issues_model.GetLabelsByOrgID(db.DefaultContext, 0, "leastissues", db.ListOptions{}) + _, err := issues_model.GetLabelsByOrgID(db.DefaultContext, 0, "leastissues", db.ListOptions{}) assert.True(t, issues_model.IsErrOrgLabelNotExist(err)) _, err = issues_model.GetLabelsByOrgID(db.DefaultContext, -1, "leastissues", db.ListOptions{}) diff --git a/models/issues/main_test.go b/models/issues/main_test.go index baabd6646a..05d854c964 100644 --- a/models/issues/main_test.go +++ b/models/issues/main_test.go @@ -6,14 +6,14 @@ package issues_test import ( "testing" - issues_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/models/unittest" + issues_model "forgejo.org/models/issues" + "forgejo.org/models/unittest" - _ "code.gitea.io/gitea/models" - _ "code.gitea.io/gitea/models/actions" - _ "code.gitea.io/gitea/models/activities" - _ "code.gitea.io/gitea/models/repo" - _ "code.gitea.io/gitea/models/user" + _ "forgejo.org/models" + _ "forgejo.org/models/actions" + _ "forgejo.org/models/activities" + _ "forgejo.org/models/repo" + _ "forgejo.org/models/user" "github.com/stretchr/testify/require" ) diff --git a/models/issues/milestone.go b/models/issues/milestone.go index 4b3cb0e858..52433e735d 100644 --- a/models/issues/milestone.go +++ b/models/issues/milestone.go @@ -9,12 +9,12 @@ import ( "html/template" "strings" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/modules/optional" - api "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/modules/optional" + api "forgejo.org/modules/structs" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) @@ -251,21 +251,6 @@ func ChangeMilestoneStatusByRepoIDAndID(ctx context.Context, repoID, milestoneID return committer.Commit() } -// ChangeMilestoneStatus changes the milestone open/closed status. -func ChangeMilestoneStatus(ctx context.Context, m *Milestone, isClosed bool) (err error) { - ctx, committer, err := db.TxContext(ctx) - if err != nil { - return err - } - defer committer.Close() - - if err := changeMilestoneStatus(ctx, m, isClosed); err != nil { - return err - } - - return committer.Commit() -} - func changeMilestoneStatus(ctx context.Context, m *Milestone, isClosed bool) error { m.IsClosed = isClosed if isClosed { diff --git a/models/issues/milestone_list.go b/models/issues/milestone_list.go index 955ab2356d..e2079fb324 100644 --- a/models/issues/milestone_list.go +++ b/models/issues/milestone_list.go @@ -7,8 +7,8 @@ import ( "context" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/optional" + "forgejo.org/models/db" + "forgejo.org/modules/optional" "xorm.io/builder" ) diff --git a/models/issues/milestone_test.go b/models/issues/milestone_test.go index 314cba308c..bfb4f38ad0 100644 --- a/models/issues/milestone_test.go +++ b/models/issues/milestone_test.go @@ -7,14 +7,14 @@ import ( "sort" "testing" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/setting" - api "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" + "forgejo.org/modules/optional" + "forgejo.org/modules/setting" + api "forgejo.org/modules/structs" + "forgejo.org/modules/timeutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -298,17 +298,16 @@ func TestNewMilestone(t *testing.T) { unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: milestone.RepoID}, &issues_model.Milestone{}) } -func TestChangeMilestoneStatus(t *testing.T) { +func TestChangeMilestoneStatusByRepoIDAndID(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) - milestone := unittest.AssertExistsAndLoadBean(t, &issues_model.Milestone{ID: 1}) - require.NoError(t, issues_model.ChangeMilestoneStatus(db.DefaultContext, milestone, true)) - unittest.AssertExistsAndLoadBean(t, &issues_model.Milestone{ID: 1}, "is_closed=1") - unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: milestone.RepoID}, &issues_model.Milestone{}) + require.NoError(t, issues_model.ChangeMilestoneStatusByRepoIDAndID(db.DefaultContext, 1, 1, true)) + unittest.AssertExistsAndLoadBean(t, &issues_model.Milestone{ID: 1, IsClosed: true}) + unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: 1}, &issues_model.Milestone{}) - require.NoError(t, issues_model.ChangeMilestoneStatus(db.DefaultContext, milestone, false)) + require.NoError(t, issues_model.ChangeMilestoneStatusByRepoIDAndID(db.DefaultContext, 1, 1, false)) unittest.AssertExistsAndLoadBean(t, &issues_model.Milestone{ID: 1}, "is_closed=0") - unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: milestone.RepoID}, &issues_model.Milestone{}) + unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: 1}, &issues_model.Milestone{}) } func TestDeleteMilestoneByRepoID(t *testing.T) { diff --git a/models/issues/pull.go b/models/issues/pull.go index a035cad649..c46961447c 100644 --- a/models/issues/pull.go +++ b/models/issues/pull.go @@ -12,17 +12,17 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/models/db" - git_model "code.gitea.io/gitea/models/git" - org_model "code.gitea.io/gitea/models/organization" - pull_model "code.gitea.io/gitea/models/pull" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + git_model "forgejo.org/models/git" + org_model "forgejo.org/models/organization" + pull_model "forgejo.org/models/pull" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/git" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) @@ -408,7 +408,7 @@ func (pr *PullRequest) getReviewedByLines(ctx context.Context, writer io.Writer) // Note: This doesn't page as we only expect a very limited number of reviews reviews, err := FindLatestReviews(ctx, FindReviewOptions{ - Type: ReviewTypeApprove, + Types: []ReviewType{ReviewTypeApprove}, IssueID: pr.IssueID, OfficialOnly: setting.Repository.PullRequest.DefaultMergeMessageOfficialApproversOnly, }) @@ -566,6 +566,7 @@ func NewPullRequest(ctx context.Context, repo *repo_model.Repository, issue *Iss } issue.Index = idx + issue.Title, _ = util.SplitStringAtByteN(issue.Title, 255) if err = NewIssueWithIndex(ctx, issue.Poster, NewIssueOptions{ Repo: repo, @@ -574,7 +575,7 @@ func NewPullRequest(ctx context.Context, repo *repo_model.Repository, issue *Iss Attachments: uuids, IsPull: true, }); err != nil { - if repo_model.IsErrUserDoesNotHaveAccessToRepo(err) || IsErrNewIssueInsert(err) { + if repo_model.IsErrUserDoesNotHaveAccessToRepo(err) { return err } return fmt.Errorf("newIssue: %w", err) @@ -689,7 +690,7 @@ func GetPullRequestByIssueID(ctx context.Context, issueID int64) (*PullRequest, return pr, pr.LoadAttributes(ctx) } -// GetPullRequestsByBaseHeadInfo returns the pull request by given base and head +// GetPullRequestByBaseHeadInfo returns the pull request by given base and head func GetPullRequestByBaseHeadInfo(ctx context.Context, baseID, headID int64, base, head string) (*PullRequest, error) { pr := &PullRequest{} sess := db.GetEngine(ctx). diff --git a/models/issues/pull_list.go b/models/issues/pull_list.go index f3970fa93b..a448673454 100644 --- a/models/issues/pull_list.go +++ b/models/issues/pull_list.go @@ -7,14 +7,14 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - access_model "code.gitea.io/gitea/models/perm/access" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unit" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + access_model "forgejo.org/models/perm/access" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unit" + user_model "forgejo.org/models/user" + "forgejo.org/modules/container" + "forgejo.org/modules/log" + "forgejo.org/modules/util" "xorm.io/xorm" ) @@ -26,6 +26,7 @@ type PullRequestsOptions struct { SortType string Labels []int64 MilestoneID int64 + PosterID int64 } func listPullRequestStatement(ctx context.Context, baseRepoID int64, opts *PullRequestsOptions) *xorm.Session { @@ -46,6 +47,10 @@ func listPullRequestStatement(ctx context.Context, baseRepoID int64, opts *PullR sess.And("issue.milestone_id=?", opts.MilestoneID) } + if opts.PosterID > 0 { + sess.And("issue.poster_id=?", opts.PosterID) + } + return sess } diff --git a/models/issues/pull_test.go b/models/issues/pull_test.go index 8e0c020ad9..e85b626c83 100644 --- a/models/issues/pull_test.go +++ b/models/issues/pull_test.go @@ -8,13 +8,12 @@ import ( "testing" "time" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/tests" + "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" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -161,7 +160,7 @@ func TestGetUnmergedPullRequestsByHeadInfo(t *testing.T) { } func TestGetUnmergedPullRequestsByHeadInfoMax(t *testing.T) { - defer tests.AddFixtures("models/fixtures/TestGetUnmergedPullRequestsByHeadInfoMax/")() + defer unittest.OverrideFixtures("models/fixtures/TestGetUnmergedPullRequestsByHeadInfoMax")() require.NoError(t, unittest.PrepareTestDatabase()) repoID := int64(1) diff --git a/models/issues/reaction.go b/models/issues/reaction.go index eb7faefc79..522040c022 100644 --- a/models/issues/reaction.go +++ b/models/issues/reaction.go @@ -8,13 +8,13 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/container" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) @@ -163,7 +163,7 @@ func FindReactions(ctx context.Context, opts FindReactionsOptions) (ReactionList Where(opts.toConds()). In("reaction.`type`", setting.UI.Reactions). Asc("reaction.issue_id", "reaction.comment_id", "reaction.created_unix", "reaction.id") - if opts.Page != 0 { + if opts.Page > 0 { sess = db.SetSessionPagination(sess, &opts) reactions := make([]*Reaction, 0, opts.PageSize) diff --git a/models/issues/reaction_test.go b/models/issues/reaction_test.go index e02e6d7e0c..0ae201c500 100644 --- a/models/issues/reaction_test.go +++ b/models/issues/reaction_test.go @@ -6,12 +6,12 @@ package issues_test import ( "testing" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/setting" + "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" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/issues/review.go b/models/issues/review.go index ca6fd6035b..db5cd65e2e 100644 --- a/models/issues/review.go +++ b/models/issues/review.go @@ -9,16 +9,16 @@ import ( "slices" "strings" - "code.gitea.io/gitea/models/db" - git_model "code.gitea.io/gitea/models/git" - "code.gitea.io/gitea/models/organization" - "code.gitea.io/gitea/models/perm" - access_model "code.gitea.io/gitea/models/perm/access" - "code.gitea.io/gitea/models/unit" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + git_model "forgejo.org/models/git" + "forgejo.org/models/organization" + "forgejo.org/models/perm" + access_model "forgejo.org/models/perm/access" + "forgejo.org/models/unit" + user_model "forgejo.org/models/user" + "forgejo.org/modules/structs" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) @@ -364,7 +364,7 @@ func GetCurrentReview(ctx context.Context, reviewer *user_model.User, issue *Iss return nil, nil } reviews, err := FindReviews(ctx, FindReviewOptions{ - Type: ReviewTypePending, + Types: []ReviewType{ReviewTypePending}, IssueID: issue.ID, ReviewerID: reviewer.ID, }) @@ -614,6 +614,10 @@ func InsertReviews(ctx context.Context, reviews []*Review) error { return err } } + + if err := UpdateIssueNumComments(ctx, review.IssueID); err != nil { + return err + } } return committer.Commit() diff --git a/models/issues/review_list.go b/models/issues/review_list.go index 0ee28874ec..45480832d8 100644 --- a/models/issues/review_list.go +++ b/models/issues/review_list.go @@ -6,11 +6,11 @@ package issues import ( "context" - "code.gitea.io/gitea/models/db" - organization_model "code.gitea.io/gitea/models/organization" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/optional" + "forgejo.org/models/db" + organization_model "forgejo.org/models/organization" + user_model "forgejo.org/models/user" + "forgejo.org/modules/container" + "forgejo.org/modules/optional" "xorm.io/builder" ) @@ -92,7 +92,7 @@ func (reviews ReviewList) LoadIssues(ctx context.Context) error { // FindReviewOptions represent possible filters to find reviews type FindReviewOptions struct { db.ListOptions - Type ReviewType + Types []ReviewType IssueID int64 ReviewerID int64 OfficialOnly bool @@ -107,8 +107,8 @@ func (opts *FindReviewOptions) toCond() builder.Cond { if opts.ReviewerID > 0 { cond = cond.And(builder.Eq{"reviewer_id": opts.ReviewerID}) } - if opts.Type != ReviewTypeUnknown { - cond = cond.And(builder.Eq{"type": opts.Type}) + if len(opts.Types) > 0 { + cond = cond.And(builder.In("type", opts.Types)) } if opts.OfficialOnly { cond = cond.And(builder.Eq{"official": true}) diff --git a/models/issues/review_test.go b/models/issues/review_test.go index 43dc9ed2c1..33d131c225 100644 --- a/models/issues/review_test.go +++ b/models/issues/review_test.go @@ -6,11 +6,11 @@ package issues_test import ( "testing" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -64,7 +64,7 @@ func TestReviewType_Icon(t *testing.T) { func TestFindReviews(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) reviews, err := issues_model.FindReviews(db.DefaultContext, issues_model.FindReviewOptions{ - Type: issues_model.ReviewTypeApprove, + Types: []issues_model.ReviewType{issues_model.ReviewTypeApprove}, IssueID: 2, ReviewerID: 1, }) @@ -76,7 +76,7 @@ func TestFindReviews(t *testing.T) { func TestFindLatestReviews(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) reviews, err := issues_model.FindLatestReviews(db.DefaultContext, issues_model.FindReviewOptions{ - Type: issues_model.ReviewTypeApprove, + Types: []issues_model.ReviewType{issues_model.ReviewTypeApprove}, IssueID: 11, }) require.NoError(t, err) diff --git a/models/issues/stopwatch.go b/models/issues/stopwatch.go index fd9c7d7875..2ff2a17d92 100644 --- a/models/issues/stopwatch.go +++ b/models/issues/stopwatch.go @@ -8,11 +8,11 @@ import ( "fmt" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" ) // ErrIssueStopwatchNotExist represents an error that stopwatch is not exist @@ -60,34 +60,19 @@ func getStopwatch(ctx context.Context, userID, issueID int64) (sw *Stopwatch, ex return sw, exists, err } -// UserIDCount is a simple coalition of UserID and Count -type UserStopwatch struct { - UserID int64 - StopWatches []*Stopwatch -} - // GetUIDsAndNotificationCounts between the two provided times -func GetUIDsAndStopwatch(ctx context.Context) ([]*UserStopwatch, error) { +func GetUIDsAndStopwatch(ctx context.Context) (map[int64][]*Stopwatch, error) { sws := []*Stopwatch{} if err := db.GetEngine(ctx).Where("issue_id != 0").Find(&sws); err != nil { return nil, err } + res := map[int64][]*Stopwatch{} if len(sws) == 0 { - return []*UserStopwatch{}, nil + return res, nil } - lastUserID := int64(-1) - res := []*UserStopwatch{} for _, sw := range sws { - if lastUserID == sw.UserID { - lastUserStopwatch := res[len(res)-1] - lastUserStopwatch.StopWatches = append(lastUserStopwatch.StopWatches, sw) - } else { - res = append(res, &UserStopwatch{ - UserID: sw.UserID, - StopWatches: []*Stopwatch{sw}, - }) - } + res[sw.UserID] = append(res[sw.UserID], sw) } return res, nil } @@ -96,7 +81,7 @@ func GetUIDsAndStopwatch(ctx context.Context) ([]*UserStopwatch, error) { func GetUserStopwatches(ctx context.Context, userID int64, listOptions db.ListOptions) ([]*Stopwatch, error) { sws := make([]*Stopwatch, 0, 8) sess := db.GetEngine(ctx).Where("stopwatch.user_id = ?", userID) - if listOptions.Page != 0 { + if listOptions.Page > 0 { sess = db.SetSessionPagination(sess, &listOptions) } diff --git a/models/issues/stopwatch_test.go b/models/issues/stopwatch_test.go index 68a11acd96..3334ffea7d 100644 --- a/models/issues/stopwatch_test.go +++ b/models/issues/stopwatch_test.go @@ -6,11 +6,11 @@ package issues_test import ( "testing" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/timeutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -77,3 +77,35 @@ func TestCreateOrStopIssueStopwatch(t *testing.T) { unittest.AssertNotExistsBean(t, &issues_model.Stopwatch{UserID: 2, IssueID: 2}) unittest.AssertExistsAndLoadBean(t, &issues_model.TrackedTime{UserID: 2, IssueID: 2}) } + +func TestGetUIDsAndStopwatch(t *testing.T) { + defer unittest.OverrideFixtures("models/issues/TestGetUIDsAndStopwatch")() + require.NoError(t, unittest.PrepareTestDatabase()) + + uidStopwatches, err := issues_model.GetUIDsAndStopwatch(db.DefaultContext) + require.NoError(t, err) + assert.EqualValues(t, map[int64][]*issues_model.Stopwatch{ + 1: { + { + ID: 1, + UserID: 1, + IssueID: 1, + CreatedUnix: timeutil.TimeStamp(1500988001), + }, + { + ID: 3, + UserID: 1, + IssueID: 2, + CreatedUnix: timeutil.TimeStamp(1500988004), + }, + }, + 2: { + { + ID: 2, + UserID: 2, + IssueID: 2, + CreatedUnix: timeutil.TimeStamp(1500988002), + }, + }, + }, uidStopwatches) +} diff --git a/models/issues/tracked_time.go b/models/issues/tracked_time.go index caa582a9fc..05d7b15815 100644 --- a/models/issues/tracked_time.go +++ b/models/issues/tracked_time.go @@ -9,11 +9,11 @@ import ( "fmt" "time" - "code.gitea.io/gitea/models/db" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + user_model "forgejo.org/models/user" + "forgejo.org/modules/optional" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" "xorm.io/builder" "xorm.io/xorm" @@ -139,7 +139,7 @@ func (opts *FindTrackedTimesOptions) toSession(e db.Engine) db.Engine { sess = sess.Where(opts.ToConds()) - if opts.Page != 0 { + if opts.Page > 0 { sess = db.SetSessionPagination(sess, opts) } diff --git a/models/issues/tracked_time_test.go b/models/issues/tracked_time_test.go index 4d4e232012..770b43abd7 100644 --- a/models/issues/tracked_time_test.go +++ b/models/issues/tracked_time_test.go @@ -7,11 +7,11 @@ import ( "testing" "time" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/optional" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/optional" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/main_test.go b/models/main_test.go index a694130e53..0edcf8f49d 100644 --- a/models/main_test.go +++ b/models/main_test.go @@ -6,14 +6,15 @@ package models import ( "testing" - activities_model "code.gitea.io/gitea/models/activities" - "code.gitea.io/gitea/models/organization" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" + activities_model "forgejo.org/models/activities" + "forgejo.org/models/organization" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" - _ "code.gitea.io/gitea/models/actions" - _ "code.gitea.io/gitea/models/system" + _ "forgejo.org/models/actions" + _ "forgejo.org/models/forgefed" + _ "forgejo.org/models/system" "github.com/stretchr/testify/require" ) diff --git a/models/migrations/base/db.go b/models/migrations/base/db.go index 333fa3151f..897ad016ab 100644 --- a/models/migrations/base/db.go +++ b/models/migrations/base/db.go @@ -10,8 +10,8 @@ import ( "regexp" "strings" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" "xorm.io/xorm" "xorm.io/xorm/schemas" diff --git a/models/migrations/base/db_test.go b/models/migrations/base/db_test.go index 4010a14311..4a610e065d 100644 --- a/models/migrations/base/db_test.go +++ b/models/migrations/base/db_test.go @@ -6,8 +6,8 @@ package base import ( "testing" - migrations_tests "code.gitea.io/gitea/models/migrations/test" - "code.gitea.io/gitea/modules/timeutil" + migrations_tests "forgejo.org/models/migrations/test" + "forgejo.org/modules/timeutil" "xorm.io/xorm/names" ) diff --git a/models/migrations/base/main_test.go b/models/migrations/base/main_test.go index c625ef02b8..2b3889441a 100644 --- a/models/migrations/base/main_test.go +++ b/models/migrations/base/main_test.go @@ -6,7 +6,7 @@ package base import ( "testing" - migrations_tests "code.gitea.io/gitea/models/migrations/test" + migrations_tests "forgejo.org/models/migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/fixtures/Test_MigrateTwoFactorToKeying/two_factor.yml b/models/migrations/fixtures/Test_MigrateTwoFactorToKeying/two_factor.yml new file mode 100644 index 0000000000..91aa420340 --- /dev/null +++ b/models/migrations/fixtures/Test_MigrateTwoFactorToKeying/two_factor.yml @@ -0,0 +1,18 @@ +- + id: 1 + uid: 24 + secret: MrAed+7K+fKQKu1l3aU45oTDSWK/i5Ugtgk8CmORrKWTMwa2w97rniLU+h+2xq8ZF+16uuXGLzjWa0bOV5xg4NY6w5Ec/tkwQ5rEecOTvc/JZV5lrrlDi48B7Y5/lNcjAWBmH2nEUlM= + scratch_salt: Qb5bq2DyR2 + scratch_hash: 068eb9b8746e0bcfe332fac4457693df1bda55800eb0f6894d14ebb736ae6a24e0fc8fc5333c19f57f81599788f0b8e51ec1 + last_used_passcode: + created_unix: 1564253724 + updated_unix: 1564253724 +- + id: 2 + uid: 23 + secret: badbad + scratch_salt: badbad + scratch_hash: badbad + last_used_passcode: + created_unix: 1564253724 + updated_unix: 1564253724 diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index d7e951f8bc..11933014d7 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -8,29 +8,29 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/forgejo_migrations" - "code.gitea.io/gitea/models/migrations/v1_10" - "code.gitea.io/gitea/models/migrations/v1_11" - "code.gitea.io/gitea/models/migrations/v1_12" - "code.gitea.io/gitea/models/migrations/v1_13" - "code.gitea.io/gitea/models/migrations/v1_14" - "code.gitea.io/gitea/models/migrations/v1_15" - "code.gitea.io/gitea/models/migrations/v1_16" - "code.gitea.io/gitea/models/migrations/v1_17" - "code.gitea.io/gitea/models/migrations/v1_18" - "code.gitea.io/gitea/models/migrations/v1_19" - "code.gitea.io/gitea/models/migrations/v1_20" - "code.gitea.io/gitea/models/migrations/v1_21" - "code.gitea.io/gitea/models/migrations/v1_22" - "code.gitea.io/gitea/models/migrations/v1_23" - "code.gitea.io/gitea/models/migrations/v1_6" - "code.gitea.io/gitea/models/migrations/v1_7" - "code.gitea.io/gitea/models/migrations/v1_8" - "code.gitea.io/gitea/models/migrations/v1_9" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - forgejo_services "code.gitea.io/gitea/services/forgejo" + "forgejo.org/models/forgejo_migrations" + "forgejo.org/models/migrations/v1_10" + "forgejo.org/models/migrations/v1_11" + "forgejo.org/models/migrations/v1_12" + "forgejo.org/models/migrations/v1_13" + "forgejo.org/models/migrations/v1_14" + "forgejo.org/models/migrations/v1_15" + "forgejo.org/models/migrations/v1_16" + "forgejo.org/models/migrations/v1_17" + "forgejo.org/models/migrations/v1_18" + "forgejo.org/models/migrations/v1_19" + "forgejo.org/models/migrations/v1_20" + "forgejo.org/models/migrations/v1_21" + "forgejo.org/models/migrations/v1_22" + "forgejo.org/models/migrations/v1_23" + "forgejo.org/models/migrations/v1_6" + "forgejo.org/models/migrations/v1_7" + "forgejo.org/models/migrations/v1_8" + "forgejo.org/models/migrations/v1_9" + "forgejo.org/modules/git" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + forgejo_services "forgejo.org/services/forgejo" "xorm.io/xorm" "xorm.io/xorm/names" @@ -38,25 +38,15 @@ import ( const minDBVersion = 70 // Gitea 1.5.3 -// Migration describes on migration from lower version to high version -type Migration interface { - Description() string - Migrate(*xorm.Engine) error -} - type migration struct { + idNumber int64 // DB version is "the last migration's idNumber" + 1 description string migrate func(*xorm.Engine) error } -// NewMigration creates a new migration -func NewMigration(desc string, fn func(*xorm.Engine) error) Migration { - return &migration{desc, fn} -} - -// Description returns the migration's description -func (m *migration) Description() string { - return m.description +// newMigration creates a new migration +func newMigration(idNumber int64, desc string, fn func(*xorm.Engine) error) *migration { + return &migration{idNumber, desc, fn} } // Migrate executes the migration @@ -67,538 +57,317 @@ func (m *migration) Migrate(x *xorm.Engine) error { // Version describes the version table. Should have only one row with id==1 type Version struct { ID int64 `xorm:"pk autoincr"` - Version int64 + Version int64 // DB version is "the last migration's idNumber" + 1 } // Use noopMigration when there is a migration that has been no-oped var noopMigration = func(_ *xorm.Engine) error { return nil } +var preparedMigrations []*migration + // This is a sequence of migrations. Add new migrations to the bottom of the list. // If you want to "retire" a migration, remove it from the top of the list and // update minDBVersion accordingly -var migrations = []Migration{ - // Gitea 1.5.0 ends at v69 +func prepareMigrationTasks() []*migration { + if preparedMigrations != nil { + return preparedMigrations + } + preparedMigrations = []*migration{ + // Gitea 1.5.0 ends at database version 69 - // v70 -> v71 - NewMigration("add issue_dependencies", v1_6.AddIssueDependencies), - // v71 -> v72 - NewMigration("protect each scratch token", v1_6.AddScratchHash), - // v72 -> v73 - NewMigration("add review", v1_6.AddReview), + newMigration(70, "add issue_dependencies", v1_6.AddIssueDependencies), + newMigration(71, "protect each scratch token", v1_6.AddScratchHash), + newMigration(72, "add review", v1_6.AddReview), - // Gitea 1.6.0 ends at v73 + // Gitea 1.6.0 ends at database version 73 - // v73 -> v74 - NewMigration("add must_change_password column for users table", v1_7.AddMustChangePassword), - // v74 -> v75 - NewMigration("add approval whitelists to protected branches", v1_7.AddApprovalWhitelistsToProtectedBranches), - // v75 -> v76 - NewMigration("clear nonused data which not deleted when user was deleted", v1_7.ClearNonusedData), + newMigration(73, "add must_change_password column for users table", v1_7.AddMustChangePassword), + newMigration(74, "add approval whitelists to protected branches", v1_7.AddApprovalWhitelistsToProtectedBranches), + newMigration(75, "clear nonused data which not deleted when user was deleted", v1_7.ClearNonusedData), - // Gitea 1.7.0 ends at v76 + // Gitea 1.7.0 ends at database version 76 - // v76 -> v77 - NewMigration("add pull request rebase with merge commit", v1_8.AddPullRequestRebaseWithMerge), - // v77 -> v78 - NewMigration("add theme to users", v1_8.AddUserDefaultTheme), - // v78 -> v79 - NewMigration("rename repo is_bare to repo is_empty", v1_8.RenameRepoIsBareToIsEmpty), - // v79 -> v80 - NewMigration("add can close issues via commit in any branch", v1_8.AddCanCloseIssuesViaCommitInAnyBranch), - // v80 -> v81 - NewMigration("add is locked to issues", v1_8.AddIsLockedToIssues), - // v81 -> v82 - NewMigration("update U2F counter type", v1_8.ChangeU2FCounterType), + newMigration(76, "add pull request rebase with merge commit", v1_8.AddPullRequestRebaseWithMerge), + newMigration(77, "add theme to users", v1_8.AddUserDefaultTheme), + newMigration(78, "rename repo is_bare to repo is_empty", v1_8.RenameRepoIsBareToIsEmpty), + newMigration(79, "add can close issues via commit in any branch", v1_8.AddCanCloseIssuesViaCommitInAnyBranch), + newMigration(80, "add is locked to issues", v1_8.AddIsLockedToIssues), + newMigration(81, "update U2F counter type", v1_8.ChangeU2FCounterType), - // Gitea 1.8.0 ends at v82 + // Gitea 1.8.0 ends at database version 82 - // v82 -> v83 - NewMigration("hot fix for wrong release sha1 on release table", v1_9.FixReleaseSha1OnReleaseTable), - // v83 -> v84 - NewMigration("add uploader id for table attachment", v1_9.AddUploaderIDForAttachment), - // v84 -> v85 - NewMigration("add table to store original imported gpg keys", v1_9.AddGPGKeyImport), - // v85 -> v86 - NewMigration("hash application token", v1_9.HashAppToken), - // v86 -> v87 - NewMigration("add http method to webhook", v1_9.AddHTTPMethodToWebhook), - // v87 -> v88 - NewMigration("add avatar field to repository", v1_9.AddAvatarFieldToRepository), + newMigration(82, "hot fix for wrong release sha1 on release table", v1_9.FixReleaseSha1OnReleaseTable), + newMigration(83, "add uploader id for table attachment", v1_9.AddUploaderIDForAttachment), + newMigration(84, "add table to store original imported gpg keys", v1_9.AddGPGKeyImport), + newMigration(85, "hash application token", v1_9.HashAppToken), + newMigration(86, "add http method to webhook", v1_9.AddHTTPMethodToWebhook), + newMigration(87, "add avatar field to repository", v1_9.AddAvatarFieldToRepository), - // Gitea 1.9.0 ends at v88 + // Gitea 1.9.0 ends at database version 88 - // v88 -> v89 - NewMigration("add commit status context field to commit_status", v1_10.AddCommitStatusContext), - // v89 -> v90 - NewMigration("add original author/url migration info to issues, comments, and repo ", v1_10.AddOriginalMigrationInfo), - // v90 -> v91 - NewMigration("change length of some repository columns", v1_10.ChangeSomeColumnsLengthOfRepo), - // v91 -> v92 - NewMigration("add index on owner_id of repository and type, review_id of comment", v1_10.AddIndexOnRepositoryAndComment), - // v92 -> v93 - NewMigration("remove orphaned repository index statuses", v1_10.RemoveLingeringIndexStatus), - // v93 -> v94 - NewMigration("add email notification enabled preference to user", v1_10.AddEmailNotificationEnabledToUser), - // v94 -> v95 - NewMigration("add enable_status_check, status_check_contexts to protected_branch", v1_10.AddStatusCheckColumnsForProtectedBranches), - // v95 -> v96 - NewMigration("add table columns for cross referencing issues", v1_10.AddCrossReferenceColumns), - // v96 -> v97 - NewMigration("delete orphaned attachments", v1_10.DeleteOrphanedAttachments), - // v97 -> v98 - NewMigration("add repo_admin_change_team_access to user", v1_10.AddRepoAdminChangeTeamAccessColumnForUser), - // v98 -> v99 - NewMigration("add original author name and id on migrated release", v1_10.AddOriginalAuthorOnMigratedReleases), - // v99 -> v100 - NewMigration("add task table and status column for repository table", v1_10.AddTaskTable), - // v100 -> v101 - NewMigration("update migration repositories' service type", v1_10.UpdateMigrationServiceTypes), - // v101 -> v102 - NewMigration("change length of some external login users columns", v1_10.ChangeSomeColumnsLengthOfExternalLoginUser), + newMigration(88, "add commit status context field to commit_status", v1_10.AddCommitStatusContext), + newMigration(89, "add original author/url migration info to issues, comments, and repo ", v1_10.AddOriginalMigrationInfo), + newMigration(90, "change length of some repository columns", v1_10.ChangeSomeColumnsLengthOfRepo), + newMigration(91, "add index on owner_id of repository and type, review_id of comment", v1_10.AddIndexOnRepositoryAndComment), + newMigration(92, "remove orphaned repository index statuses", v1_10.RemoveLingeringIndexStatus), + newMigration(93, "add email notification enabled preference to user", v1_10.AddEmailNotificationEnabledToUser), + newMigration(94, "add enable_status_check, status_check_contexts to protected_branch", v1_10.AddStatusCheckColumnsForProtectedBranches), + newMigration(95, "add table columns for cross referencing issues", v1_10.AddCrossReferenceColumns), + newMigration(96, "delete orphaned attachments", v1_10.DeleteOrphanedAttachments), + newMigration(97, "add repo_admin_change_team_access to user", v1_10.AddRepoAdminChangeTeamAccessColumnForUser), + newMigration(98, "add original author name and id on migrated release", v1_10.AddOriginalAuthorOnMigratedReleases), + newMigration(99, "add task table and status column for repository table", v1_10.AddTaskTable), + newMigration(100, "update migration repositories' service type", v1_10.UpdateMigrationServiceTypes), + newMigration(101, "change length of some external login users columns", v1_10.ChangeSomeColumnsLengthOfExternalLoginUser), - // Gitea 1.10.0 ends at v102 + // Gitea 1.10.0 ends at database version 102 - // v102 -> v103 - NewMigration("update migration repositories' service type", v1_11.DropColumnHeadUserNameOnPullRequest), - // v103 -> v104 - NewMigration("Add WhitelistDeployKeys to protected branch", v1_11.AddWhitelistDeployKeysToBranches), - // v104 -> v105 - NewMigration("remove unnecessary columns from label", v1_11.RemoveLabelUneededCols), - // v105 -> v106 - NewMigration("add includes_all_repositories to teams", v1_11.AddTeamIncludesAllRepositories), - // v106 -> v107 - NewMigration("add column `mode` to table watch", v1_11.AddModeColumnToWatch), - // v107 -> v108 - NewMigration("Add template options to repository", v1_11.AddTemplateToRepo), - // v108 -> v109 - NewMigration("Add comment_id on table notification", v1_11.AddCommentIDOnNotification), - // v109 -> v110 - NewMigration("add can_create_org_repo to team", v1_11.AddCanCreateOrgRepoColumnForTeam), - // v110 -> v111 - NewMigration("change review content type to text", v1_11.ChangeReviewContentToText), - // v111 -> v112 - NewMigration("update branch protection for can push and whitelist enable", v1_11.AddBranchProtectionCanPushAndEnableWhitelist), - // v112 -> v113 - NewMigration("remove release attachments which repository deleted", v1_11.RemoveAttachmentMissedRepo), - // v113 -> v114 - NewMigration("new feature: change target branch of pull requests", v1_11.FeatureChangeTargetBranch), - // v114 -> v115 - NewMigration("Remove authentication credentials from stored URL", v1_11.SanitizeOriginalURL), - // v115 -> v116 - NewMigration("add user_id prefix to existing user avatar name", v1_11.RenameExistingUserAvatarName), - // v116 -> v117 - NewMigration("Extend TrackedTimes", v1_11.ExtendTrackedTimes), + newMigration(102, "update migration repositories' service type", v1_11.DropColumnHeadUserNameOnPullRequest), + newMigration(103, "Add WhitelistDeployKeys to protected branch", v1_11.AddWhitelistDeployKeysToBranches), + newMigration(104, "remove unnecessary columns from label", v1_11.RemoveLabelUneededCols), + newMigration(105, "add includes_all_repositories to teams", v1_11.AddTeamIncludesAllRepositories), + newMigration(106, "add column `mode` to table watch", v1_11.AddModeColumnToWatch), + newMigration(107, "Add template options to repository", v1_11.AddTemplateToRepo), + newMigration(108, "Add comment_id on table notification", v1_11.AddCommentIDOnNotification), + newMigration(109, "add can_create_org_repo to team", v1_11.AddCanCreateOrgRepoColumnForTeam), + newMigration(110, "change review content type to text", v1_11.ChangeReviewContentToText), + newMigration(111, "update branch protection for can push and whitelist enable", v1_11.AddBranchProtectionCanPushAndEnableWhitelist), + newMigration(112, "remove release attachments which repository deleted", v1_11.RemoveAttachmentMissedRepo), + newMigration(113, "new feature: change target branch of pull requests", v1_11.FeatureChangeTargetBranch), + newMigration(114, "Remove authentication credentials from stored URL", v1_11.SanitizeOriginalURL), + newMigration(115, "add user_id prefix to existing user avatar name", v1_11.RenameExistingUserAvatarName), + newMigration(116, "Extend TrackedTimes", v1_11.ExtendTrackedTimes), - // Gitea 1.11.0 ends at v117 + // Gitea 1.11.0 ends at database version 117 - // v117 -> v118 - NewMigration("Add block on rejected reviews branch protection", v1_12.AddBlockOnRejectedReviews), - // v118 -> v119 - NewMigration("Add commit id and stale to reviews", v1_12.AddReviewCommitAndStale), - // v119 -> v120 - NewMigration("Fix migrated repositories' git service type", v1_12.FixMigratedRepositoryServiceType), - // v120 -> v121 - NewMigration("Add owner_name on table repository", v1_12.AddOwnerNameOnRepository), - // v121 -> v122 - NewMigration("add is_restricted column for users table", v1_12.AddIsRestricted), - // v122 -> v123 - NewMigration("Add Require Signed Commits to ProtectedBranch", v1_12.AddRequireSignedCommits), - // v123 -> v124 - NewMigration("Add original information for reactions", v1_12.AddReactionOriginals), - // v124 -> v125 - NewMigration("Add columns to user and repository", v1_12.AddUserRepoMissingColumns), - // v125 -> v126 - NewMigration("Add some columns on review for migration", v1_12.AddReviewMigrateInfo), - // v126 -> v127 - NewMigration("Fix topic repository count", v1_12.FixTopicRepositoryCount), - // v127 -> v128 - NewMigration("add repository code language statistics", v1_12.AddLanguageStats), - // v128 -> v129 - NewMigration("fix merge base for pull requests", v1_12.FixMergeBase), - // v129 -> v130 - NewMigration("remove dependencies from deleted repositories", v1_12.PurgeUnusedDependencies), - // v130 -> v131 - NewMigration("Expand webhooks for more granularity", v1_12.ExpandWebhooks), - // v131 -> v132 - NewMigration("Add IsSystemWebhook column to webhooks table", v1_12.AddSystemWebhookColumn), - // v132 -> v133 - NewMigration("Add Branch Protection Protected Files Column", v1_12.AddBranchProtectionProtectedFilesColumn), - // v133 -> v134 - NewMigration("Add EmailHash Table", v1_12.AddEmailHashTable), - // v134 -> v135 - NewMigration("Refix merge base for merged pull requests", v1_12.RefixMergeBase), - // v135 -> v136 - NewMigration("Add OrgID column to Labels table", v1_12.AddOrgIDLabelColumn), - // v136 -> v137 - NewMigration("Add CommitsAhead and CommitsBehind Column to PullRequest Table", v1_12.AddCommitDivergenceToPulls), - // v137 -> v138 - NewMigration("Add Branch Protection Block Outdated Branch", v1_12.AddBlockOnOutdatedBranch), - // v138 -> v139 - NewMigration("Add ResolveDoerID to Comment table", v1_12.AddResolveDoerIDCommentColumn), - // v139 -> v140 - NewMigration("prepend refs/heads/ to issue refs", v1_12.PrependRefsHeadsToIssueRefs), + newMigration(117, "Add block on rejected reviews branch protection", v1_12.AddBlockOnRejectedReviews), + newMigration(118, "Add commit id and stale to reviews", v1_12.AddReviewCommitAndStale), + newMigration(119, "Fix migrated repositories' git service type", v1_12.FixMigratedRepositoryServiceType), + newMigration(120, "Add owner_name on table repository", v1_12.AddOwnerNameOnRepository), + newMigration(121, "add is_restricted column for users table", v1_12.AddIsRestricted), + newMigration(122, "Add Require Signed Commits to ProtectedBranch", v1_12.AddRequireSignedCommits), + newMigration(123, "Add original information for reactions", v1_12.AddReactionOriginals), + newMigration(124, "Add columns to user and repository", v1_12.AddUserRepoMissingColumns), + newMigration(125, "Add some columns on review for migration", v1_12.AddReviewMigrateInfo), + newMigration(126, "Fix topic repository count", v1_12.FixTopicRepositoryCount), + newMigration(127, "add repository code language statistics", v1_12.AddLanguageStats), + newMigration(128, "fix merge base for pull requests", v1_12.FixMergeBase), + newMigration(129, "remove dependencies from deleted repositories", v1_12.PurgeUnusedDependencies), + newMigration(130, "Expand webhooks for more granularity", v1_12.ExpandWebhooks), + newMigration(131, "Add IsSystemWebhook column to webhooks table", v1_12.AddSystemWebhookColumn), + newMigration(132, "Add Branch Protection Protected Files Column", v1_12.AddBranchProtectionProtectedFilesColumn), + newMigration(133, "Add EmailHash Table", v1_12.AddEmailHashTable), + newMigration(134, "Refix merge base for merged pull requests", v1_12.RefixMergeBase), + newMigration(135, "Add OrgID column to Labels table", v1_12.AddOrgIDLabelColumn), + newMigration(136, "Add CommitsAhead and CommitsBehind Column to PullRequest Table", v1_12.AddCommitDivergenceToPulls), + newMigration(137, "Add Branch Protection Block Outdated Branch", v1_12.AddBlockOnOutdatedBranch), + newMigration(138, "Add ResolveDoerID to Comment table", v1_12.AddResolveDoerIDCommentColumn), + newMigration(139, "prepend refs/heads/ to issue refs", v1_12.PrependRefsHeadsToIssueRefs), - // Gitea 1.12.0 ends at v140 + // Gitea 1.12.0 ends at database version 140 - // v140 -> v141 - NewMigration("Save detected language file size to database instead of percent", v1_13.FixLanguageStatsToSaveSize), - // v141 -> v142 - NewMigration("Add KeepActivityPrivate to User table", v1_13.AddKeepActivityPrivateUserColumn), - // v142 -> v143 - NewMigration("Ensure Repository.IsArchived is not null", v1_13.SetIsArchivedToFalse), - // v143 -> v144 - NewMigration("recalculate Stars number for all user", v1_13.RecalculateStars), - // v144 -> v145 - NewMigration("update Matrix Webhook http method to 'PUT'", v1_13.UpdateMatrixWebhookHTTPMethod), - // v145 -> v146 - NewMigration("Increase Language field to 50 in LanguageStats", v1_13.IncreaseLanguageField), - // v146 -> v147 - NewMigration("Add projects info to repository table", v1_13.AddProjectsInfo), - // v147 -> v148 - NewMigration("create review for 0 review id code comments", v1_13.CreateReviewsForCodeComments), - // v148 -> v149 - NewMigration("remove issue dependency comments who refer to non existing issues", v1_13.PurgeInvalidDependenciesComments), - // v149 -> v150 - NewMigration("Add Created and Updated to Milestone table", v1_13.AddCreatedAndUpdatedToMilestones), - // v150 -> v151 - NewMigration("add primary key to repo_topic", v1_13.AddPrimaryKeyToRepoTopic), - // v151 -> v152 - NewMigration("set default password algorithm to Argon2", v1_13.SetDefaultPasswordToArgon2), - // v152 -> v153 - NewMigration("add TrustModel field to Repository", v1_13.AddTrustModelToRepository), - // v153 > v154 - NewMigration("add Team review request support", v1_13.AddTeamReviewRequestSupport), - // v154 > v155 - NewMigration("add timestamps to Star, Label, Follow, Watch and Collaboration", v1_13.AddTimeStamps), + newMigration(140, "Save detected language file size to database instead of percent", v1_13.FixLanguageStatsToSaveSize), + newMigration(141, "Add KeepActivityPrivate to User table", v1_13.AddKeepActivityPrivateUserColumn), + newMigration(142, "Ensure Repository.IsArchived is not null", v1_13.SetIsArchivedToFalse), + newMigration(143, "recalculate Stars number for all user", v1_13.RecalculateStars), + newMigration(144, "update Matrix Webhook http method to 'PUT'", v1_13.UpdateMatrixWebhookHTTPMethod), + newMigration(145, "Increase Language field to 50 in LanguageStats", v1_13.IncreaseLanguageField), + newMigration(146, "Add projects info to repository table", v1_13.AddProjectsInfo), + newMigration(147, "create review for 0 review id code comments", v1_13.CreateReviewsForCodeComments), + newMigration(148, "remove issue dependency comments who refer to non existing issues", v1_13.PurgeInvalidDependenciesComments), + newMigration(149, "Add Created and Updated to Milestone table", v1_13.AddCreatedAndUpdatedToMilestones), + newMigration(150, "add primary key to repo_topic", v1_13.AddPrimaryKeyToRepoTopic), + newMigration(151, "set default password algorithm to Argon2", v1_13.SetDefaultPasswordToArgon2), + newMigration(152, "add TrustModel field to Repository", v1_13.AddTrustModelToRepository), + newMigration(153, "add Team review request support", v1_13.AddTeamReviewRequestSupport), + newMigration(154, "add timestamps to Star, Label, Follow, Watch and Collaboration", v1_13.AddTimeStamps), - // Gitea 1.13.0 ends at v155 + // Gitea 1.13.0 ends at database version 155 - // v155 -> v156 - NewMigration("add changed_protected_files column for pull_request table", v1_14.AddChangedProtectedFilesPullRequestColumn), - // v156 -> v157 - NewMigration("fix publisher ID for tag releases", v1_14.FixPublisherIDforTagReleases), - // v157 -> v158 - NewMigration("ensure repo topics are up-to-date", v1_14.FixRepoTopics), - // v158 -> v159 - NewMigration("code comment replies should have the commitID of the review they are replying to", v1_14.UpdateCodeCommentReplies), - // v159 -> v160 - NewMigration("update reactions constraint", v1_14.UpdateReactionConstraint), - // v160 -> v161 - NewMigration("Add block on official review requests branch protection", v1_14.AddBlockOnOfficialReviewRequests), - // v161 -> v162 - NewMigration("Convert task type from int to string", v1_14.ConvertTaskTypeToString), - // v162 -> v163 - NewMigration("Convert webhook task type from int to string", v1_14.ConvertWebhookTaskTypeToString), - // v163 -> v164 - NewMigration("Convert topic name from 25 to 50", v1_14.ConvertTopicNameFrom25To50), - // v164 -> v165 - NewMigration("Add scope and nonce columns to oauth2_grant table", v1_14.AddScopeAndNonceColumnsToOAuth2Grant), - // v165 -> v166 - NewMigration("Convert hook task type from char(16) to varchar(16) and trim the column", v1_14.ConvertHookTaskTypeToVarcharAndTrim), - // v166 -> v167 - NewMigration("Where Password is Valid with Empty String delete it", v1_14.RecalculateUserEmptyPWD), - // v167 -> v168 - NewMigration("Add user redirect", v1_14.AddUserRedirect), - // v168 -> v169 - NewMigration("Recreate user table to fix default values", v1_14.RecreateUserTableToFixDefaultValues), - // v169 -> v170 - NewMigration("Update DeleteBranch comments to set the old_ref to the commit_sha", v1_14.CommentTypeDeleteBranchUseOldRef), - // v170 -> v171 - NewMigration("Add Dismissed to Review table", v1_14.AddDismissedReviewColumn), - // v171 -> v172 - NewMigration("Add Sorting to ProjectBoard table", v1_14.AddSortingColToProjectBoard), - // v172 -> v173 - NewMigration("Add sessions table for go-chi/session", v1_14.AddSessionTable), - // v173 -> v174 - NewMigration("Add time_id column to Comment", v1_14.AddTimeIDCommentColumn), - // v174 -> v175 - NewMigration("Create repo transfer table", v1_14.AddRepoTransfer), - // v175 -> v176 - NewMigration("Fix Postgres ID Sequences broken by recreate-table", v1_14.FixPostgresIDSequences), - // v176 -> v177 - NewMigration("Remove invalid labels from comments", v1_14.RemoveInvalidLabels), - // v177 -> v178 - NewMigration("Delete orphaned IssueLabels", v1_14.DeleteOrphanedIssueLabels), + newMigration(155, "add changed_protected_files column for pull_request table", v1_14.AddChangedProtectedFilesPullRequestColumn), + newMigration(156, "fix publisher ID for tag releases", v1_14.FixPublisherIDforTagReleases), + newMigration(157, "ensure repo topics are up-to-date", v1_14.FixRepoTopics), + newMigration(158, "code comment replies should have the commitID of the review they are replying to", v1_14.UpdateCodeCommentReplies), + newMigration(159, "update reactions constraint", v1_14.UpdateReactionConstraint), + newMigration(160, "Add block on official review requests branch protection", v1_14.AddBlockOnOfficialReviewRequests), + newMigration(161, "Convert task type from int to string", v1_14.ConvertTaskTypeToString), + newMigration(162, "Convert webhook task type from int to string", v1_14.ConvertWebhookTaskTypeToString), + newMigration(163, "Convert topic name from 25 to 50", v1_14.ConvertTopicNameFrom25To50), + newMigration(164, "Add scope and nonce columns to oauth2_grant table", v1_14.AddScopeAndNonceColumnsToOAuth2Grant), + newMigration(165, "Convert hook task type from char(16) to varchar(16) and trim the column", v1_14.ConvertHookTaskTypeToVarcharAndTrim), + newMigration(166, "Where Password is Valid with Empty String delete it", v1_14.RecalculateUserEmptyPWD), + newMigration(167, "Add user redirect", v1_14.AddUserRedirect), + newMigration(168, "Recreate user table to fix default values", v1_14.RecreateUserTableToFixDefaultValues), + newMigration(169, "Update DeleteBranch comments to set the old_ref to the commit_sha", v1_14.CommentTypeDeleteBranchUseOldRef), + newMigration(170, "Add Dismissed to Review table", v1_14.AddDismissedReviewColumn), + newMigration(171, "Add Sorting to ProjectBoard table", v1_14.AddSortingColToProjectBoard), + newMigration(172, "Add sessions table for go-chi/session", v1_14.AddSessionTable), + newMigration(173, "Add time_id column to Comment", v1_14.AddTimeIDCommentColumn), + newMigration(174, "Create repo transfer table", v1_14.AddRepoTransfer), + newMigration(175, "Fix Postgres ID Sequences broken by recreate-table", v1_14.FixPostgresIDSequences), + newMigration(176, "Remove invalid labels from comments", v1_14.RemoveInvalidLabels), + newMigration(177, "Delete orphaned IssueLabels", v1_14.DeleteOrphanedIssueLabels), - // Gitea 1.14.0 ends at v178 + // Gitea 1.14.0 ends at database version 178 - // v178 -> v179 - NewMigration("Add LFS columns to Mirror", v1_15.AddLFSMirrorColumns), - // v179 -> v180 - NewMigration("Convert avatar url to text", v1_15.ConvertAvatarURLToText), - // v180 -> v181 - NewMigration("Delete credentials from past migrations", v1_15.DeleteMigrationCredentials), - // v181 -> v182 - NewMigration("Always save primary email on email address table", v1_15.AddPrimaryEmail2EmailAddress), - // v182 -> v183 - NewMigration("Add issue resource index table", v1_15.AddIssueResourceIndexTable), - // v183 -> v184 - NewMigration("Create PushMirror table", v1_15.CreatePushMirrorTable), - // v184 -> v185 - NewMigration("Rename Task errors to message", v1_15.RenameTaskErrorsToMessage), - // v185 -> v186 - NewMigration("Add new table repo_archiver", v1_15.AddRepoArchiver), - // v186 -> v187 - NewMigration("Create protected tag table", v1_15.CreateProtectedTagTable), - // v187 -> v188 - NewMigration("Drop unneeded webhook related columns", v1_15.DropWebhookColumns), - // v188 -> v189 - NewMigration("Add key is verified to gpg key", v1_15.AddKeyIsVerified), + newMigration(178, "Add LFS columns to Mirror", v1_15.AddLFSMirrorColumns), + newMigration(179, "Convert avatar url to text", v1_15.ConvertAvatarURLToText), + newMigration(180, "Delete credentials from past migrations", v1_15.DeleteMigrationCredentials), + newMigration(181, "Always save primary email on email address table", v1_15.AddPrimaryEmail2EmailAddress), + newMigration(182, "Add issue resource index table", v1_15.AddIssueResourceIndexTable), + newMigration(183, "Create PushMirror table", v1_15.CreatePushMirrorTable), + newMigration(184, "Rename Task errors to message", v1_15.RenameTaskErrorsToMessage), + newMigration(185, "Add new table repo_archiver", v1_15.AddRepoArchiver), + newMigration(186, "Create protected tag table", v1_15.CreateProtectedTagTable), + newMigration(187, "Drop unneeded webhook related columns", v1_15.DropWebhookColumns), + newMigration(188, "Add key is verified to gpg key", v1_15.AddKeyIsVerified), - // Gitea 1.15.0 ends at v189 + // Gitea 1.15.0 ends at database version 189 - // v189 -> v190 - NewMigration("Unwrap ldap.Sources", v1_16.UnwrapLDAPSourceCfg), - // v190 -> v191 - NewMigration("Add agit flow pull request support", v1_16.AddAgitFlowPullRequest), - // v191 -> v192 - NewMigration("Alter issue/comment table TEXT fields to LONGTEXT", v1_16.AlterIssueAndCommentTextFieldsToLongText), - // v192 -> v193 - NewMigration("RecreateIssueResourceIndexTable to have a primary key instead of an unique index", v1_16.RecreateIssueResourceIndexTable), - // v193 -> v194 - NewMigration("Add repo id column for attachment table", v1_16.AddRepoIDForAttachment), - // v194 -> v195 - NewMigration("Add Branch Protection Unprotected Files Column", v1_16.AddBranchProtectionUnprotectedFilesColumn), - // v195 -> v196 - NewMigration("Add table commit_status_index", v1_16.AddTableCommitStatusIndex), - // v196 -> v197 - NewMigration("Add Color to ProjectBoard table", v1_16.AddColorColToProjectBoard), - // v197 -> v198 - NewMigration("Add renamed_branch table", v1_16.AddRenamedBranchTable), - // v198 -> v199 - NewMigration("Add issue content history table", v1_16.AddTableIssueContentHistory), - // v199 -> v200 - NewMigration("No-op (remote version is using AppState now)", noopMigration), - // v200 -> v201 - NewMigration("Add table app_state", v1_16.AddTableAppState), - // v201 -> v202 - NewMigration("Drop table remote_version (if exists)", v1_16.DropTableRemoteVersion), - // v202 -> v203 - NewMigration("Create key/value table for user settings", v1_16.CreateUserSettingsTable), - // v203 -> v204 - NewMigration("Add Sorting to ProjectIssue table", v1_16.AddProjectIssueSorting), - // v204 -> v205 - NewMigration("Add key is verified to ssh key", v1_16.AddSSHKeyIsVerified), - // v205 -> v206 - NewMigration("Migrate to higher varchar on user struct", v1_16.MigrateUserPasswordSalt), - // v206 -> v207 - NewMigration("Add authorize column to team_unit table", v1_16.AddAuthorizeColForTeamUnit), - // v207 -> v208 - NewMigration("Add webauthn table and migrate u2f data to webauthn - NO-OPED", v1_16.AddWebAuthnCred), - // v208 -> v209 - NewMigration("Use base32.HexEncoding instead of base64 encoding for cred ID as it is case insensitive - NO-OPED", v1_16.UseBase32HexForCredIDInWebAuthnCredential), - // v209 -> v210 - NewMigration("Increase WebAuthentication CredentialID size to 410 - NO-OPED", v1_16.IncreaseCredentialIDTo410), - // v210 -> v211 - NewMigration("v208 was completely broken - remigrate", v1_16.RemigrateU2FCredentials), + newMigration(189, "Unwrap ldap.Sources", v1_16.UnwrapLDAPSourceCfg), + newMigration(190, "Add agit flow pull request support", v1_16.AddAgitFlowPullRequest), + newMigration(191, "Alter issue/comment table TEXT fields to LONGTEXT", v1_16.AlterIssueAndCommentTextFieldsToLongText), + newMigration(192, "RecreateIssueResourceIndexTable to have a primary key instead of an unique index", v1_16.RecreateIssueResourceIndexTable), + newMigration(193, "Add repo id column for attachment table", v1_16.AddRepoIDForAttachment), + newMigration(194, "Add Branch Protection Unprotected Files Column", v1_16.AddBranchProtectionUnprotectedFilesColumn), + newMigration(195, "Add table commit_status_index", v1_16.AddTableCommitStatusIndex), + newMigration(196, "Add Color to ProjectBoard table", v1_16.AddColorColToProjectBoard), + newMigration(197, "Add renamed_branch table", v1_16.AddRenamedBranchTable), + newMigration(198, "Add issue content history table", v1_16.AddTableIssueContentHistory), + newMigration(199, "No-op (remote version is using AppState now)", noopMigration), + newMigration(200, "Add table app_state", v1_16.AddTableAppState), + newMigration(201, "Drop table remote_version (if exists)", v1_16.DropTableRemoteVersion), + newMigration(202, "Create key/value table for user settings", v1_16.CreateUserSettingsTable), + newMigration(203, "Add Sorting to ProjectIssue table", v1_16.AddProjectIssueSorting), + newMigration(204, "Add key is verified to ssh key", v1_16.AddSSHKeyIsVerified), + newMigration(205, "Migrate to higher varchar on user struct", v1_16.MigrateUserPasswordSalt), + newMigration(206, "Add authorize column to team_unit table", v1_16.AddAuthorizeColForTeamUnit), + newMigration(207, "Add webauthn table and migrate u2f data to webauthn - NO-OPED", v1_16.AddWebAuthnCred), + newMigration(208, "Use base32.HexEncoding instead of base64 encoding for cred ID as it is case insensitive - NO-OPED", v1_16.UseBase32HexForCredIDInWebAuthnCredential), + newMigration(209, "Increase WebAuthentication CredentialID size to 410 - NO-OPED", v1_16.IncreaseCredentialIDTo410), + newMigration(210, "v208 was completely broken - remigrate", v1_16.RemigrateU2FCredentials), - // Gitea 1.16.2 ends at v211 + // Gitea 1.16.2 ends at database version 211 - // v211 -> v212 - NewMigration("Create ForeignReference table", v1_17.CreateForeignReferenceTable), - // v212 -> v213 - NewMigration("Add package tables", v1_17.AddPackageTables), - // v213 -> v214 - NewMigration("Add allow edits from maintainers to PullRequest table", v1_17.AddAllowMaintainerEdit), - // v214 -> v215 - NewMigration("Add auto merge table", v1_17.AddAutoMergeTable), - // v215 -> v216 - NewMigration("allow to view files in PRs", v1_17.AddReviewViewedFiles), - // v216 -> v217 - NewMigration("No-op (Improve Action table indices v1)", noopMigration), - // v217 -> v218 - NewMigration("Alter hook_task table TEXT fields to LONGTEXT", v1_17.AlterHookTaskTextFieldsToLongText), - // v218 -> v219 - NewMigration("Improve Action table indices v2", v1_17.ImproveActionTableIndices), - // v219 -> v220 - NewMigration("Add sync_on_commit column to push_mirror table", v1_17.AddSyncOnCommitColForPushMirror), - // v220 -> v221 - NewMigration("Add container repository property", v1_17.AddContainerRepositoryProperty), - // v221 -> v222 - NewMigration("Store WebAuthentication CredentialID as bytes and increase size to at least 1024", v1_17.StoreWebauthnCredentialIDAsBytes), - // v222 -> v223 - NewMigration("Drop old CredentialID column", v1_17.DropOldCredentialIDColumn), - // v223 -> v224 - NewMigration("Rename CredentialIDBytes column to CredentialID", v1_17.RenameCredentialIDBytes), + newMigration(211, "Create ForeignReference table", v1_17.CreateForeignReferenceTable), + newMigration(212, "Add package tables", v1_17.AddPackageTables), + newMigration(213, "Add allow edits from maintainers to PullRequest table", v1_17.AddAllowMaintainerEdit), + newMigration(214, "Add auto merge table", v1_17.AddAutoMergeTable), + newMigration(215, "allow to view files in PRs", v1_17.AddReviewViewedFiles), + newMigration(216, "No-op (Improve Action table indices v1)", noopMigration), + newMigration(217, "Alter hook_task table TEXT fields to LONGTEXT", v1_17.AlterHookTaskTextFieldsToLongText), + newMigration(218, "Improve Action table indices v2", v1_17.ImproveActionTableIndices), + newMigration(219, "Add sync_on_commit column to push_mirror table", v1_17.AddSyncOnCommitColForPushMirror), + newMigration(220, "Add container repository property", v1_17.AddContainerRepositoryProperty), + newMigration(221, "Store WebAuthentication CredentialID as bytes and increase size to at least 1024", v1_17.StoreWebauthnCredentialIDAsBytes), + newMigration(222, "Drop old CredentialID column", v1_17.DropOldCredentialIDColumn), + newMigration(223, "Rename CredentialIDBytes column to CredentialID", v1_17.RenameCredentialIDBytes), - // Gitea 1.17.0 ends at v224 + // Gitea 1.17.0 ends at database version 224 - // v224 -> v225 - NewMigration("Add badges to users", v1_18.CreateUserBadgesTable), - // v225 -> v226 - NewMigration("Alter gpg_key/public_key content TEXT fields to MEDIUMTEXT", v1_18.AlterPublicGPGKeyContentFieldsToMediumText), - // v226 -> v227 - NewMigration("Conan and generic packages do not need to be semantically versioned", v1_18.FixPackageSemverField), - // v227 -> v228 - NewMigration("Create key/value table for system settings", v1_18.CreateSystemSettingsTable), - // v228 -> v229 - NewMigration("Add TeamInvite table", v1_18.AddTeamInviteTable), - // v229 -> v230 - NewMigration("Update counts of all open milestones", v1_18.UpdateOpenMilestoneCounts), - // v230 -> v231 - NewMigration("Add ConfidentialClient column (default true) to OAuth2Application table", v1_18.AddConfidentialClientColumnToOAuth2ApplicationTable), + newMigration(224, "Add badges to users", v1_18.CreateUserBadgesTable), + newMigration(225, "Alter gpg_key/public_key content TEXT fields to MEDIUMTEXT", v1_18.AlterPublicGPGKeyContentFieldsToMediumText), + newMigration(226, "Conan and generic packages do not need to be semantically versioned", v1_18.FixPackageSemverField), + newMigration(227, "Create key/value table for system settings", v1_18.CreateSystemSettingsTable), + newMigration(228, "Add TeamInvite table", v1_18.AddTeamInviteTable), + newMigration(229, "Update counts of all open milestones", v1_18.UpdateOpenMilestoneCounts), + newMigration(230, "Add ConfidentialClient column (default true) to OAuth2Application table", v1_18.AddConfidentialClientColumnToOAuth2ApplicationTable), - // Gitea 1.18.0 ends at v231 + // Gitea 1.18.0 ends at database version 231 - // v231 -> v232 - NewMigration("Add index for hook_task", v1_19.AddIndexForHookTask), - // v232 -> v233 - NewMigration("Alter package_version.metadata_json to LONGTEXT", v1_19.AlterPackageVersionMetadataToLongText), - // v233 -> v234 - NewMigration("Add header_authorization_encrypted column to webhook table", v1_19.AddHeaderAuthorizationEncryptedColWebhook), - // v234 -> v235 - NewMigration("Add package cleanup rule table", v1_19.CreatePackageCleanupRuleTable), - // v235 -> v236 - NewMigration("Add index for access_token", v1_19.AddIndexForAccessToken), - // v236 -> v237 - NewMigration("Create secrets table", v1_19.CreateSecretsTable), - // v237 -> v238 - NewMigration("Drop ForeignReference table", v1_19.DropForeignReferenceTable), - // v238 -> v239 - NewMigration("Add updated unix to LFSMetaObject", v1_19.AddUpdatedUnixToLFSMetaObject), - // v239 -> v240 - NewMigration("Add scope for access_token", v1_19.AddScopeForAccessTokens), - // v240 -> v241 - NewMigration("Add actions tables", v1_19.AddActionsTables), - // v241 -> v242 - NewMigration("Add card_type column to project table", v1_19.AddCardTypeToProjectTable), - // v242 -> v243 - NewMigration("Alter gpg_key_import content TEXT field to MEDIUMTEXT", v1_19.AlterPublicGPGKeyImportContentFieldToMediumText), - // v243 -> v244 - NewMigration("Add exclusive label", v1_19.AddExclusiveLabel), + newMigration(231, "Add index for hook_task", v1_19.AddIndexForHookTask), + newMigration(232, "Alter package_version.metadata_json to LONGTEXT", v1_19.AlterPackageVersionMetadataToLongText), + newMigration(233, "Add header_authorization_encrypted column to webhook table", v1_19.AddHeaderAuthorizationEncryptedColWebhook), + newMigration(234, "Add package cleanup rule table", v1_19.CreatePackageCleanupRuleTable), + newMigration(235, "Add index for access_token", v1_19.AddIndexForAccessToken), + newMigration(236, "Create secrets table", v1_19.CreateSecretsTable), + newMigration(237, "Drop ForeignReference table", v1_19.DropForeignReferenceTable), + newMigration(238, "Add updated unix to LFSMetaObject", v1_19.AddUpdatedUnixToLFSMetaObject), + newMigration(239, "Add scope for access_token", v1_19.AddScopeForAccessTokens), + newMigration(240, "Add actions tables", v1_19.AddActionsTables), + newMigration(241, "Add card_type column to project table", v1_19.AddCardTypeToProjectTable), + newMigration(242, "Alter gpg_key_import content TEXT field to MEDIUMTEXT", v1_19.AlterPublicGPGKeyImportContentFieldToMediumText), + newMigration(243, "Add exclusive label", v1_19.AddExclusiveLabel), - // Gitea 1.19.0 ends at v244 + // Gitea 1.19.0 ends at database version 244 - // v244 -> v245 - NewMigration("Add NeedApproval to actions tables", v1_20.AddNeedApprovalToActionRun), - // v245 -> v246 - NewMigration("Rename Webhook org_id to owner_id", v1_20.RenameWebhookOrgToOwner), - // v246 -> v247 - NewMigration("Add missed column owner_id for project table", v1_20.AddNewColumnForProject), - // v247 -> v248 - NewMigration("Fix incorrect project type", v1_20.FixIncorrectProjectType), - // v248 -> v249 - NewMigration("Add version column to action_runner table", v1_20.AddVersionToActionRunner), - // v249 -> v250 - NewMigration("Improve Action table indices v3", v1_20.ImproveActionTableIndices), - // v250 -> v251 - NewMigration("Change Container Metadata", v1_20.ChangeContainerMetadataMultiArch), - // v251 -> v252 - NewMigration("Fix incorrect owner team unit access mode", v1_20.FixIncorrectOwnerTeamUnitAccessMode), - // v252 -> v253 - NewMigration("Fix incorrect admin team unit access mode", v1_20.FixIncorrectAdminTeamUnitAccessMode), - // v253 -> v254 - NewMigration("Fix ExternalTracker and ExternalWiki accessMode in owner and admin team", v1_20.FixExternalTrackerAndExternalWikiAccessModeInOwnerAndAdminTeam), - // v254 -> v255 - NewMigration("Add ActionTaskOutput table", v1_20.AddActionTaskOutputTable), - // v255 -> v256 - NewMigration("Add ArchivedUnix Column", v1_20.AddArchivedUnixToRepository), - // v256 -> v257 - NewMigration("Add is_internal column to package", v1_20.AddIsInternalColumnToPackage), - // v257 -> v258 - NewMigration("Add Actions Artifact table", v1_20.CreateActionArtifactTable), - // v258 -> v259 - NewMigration("Add PinOrder Column", v1_20.AddPinOrderToIssue), - // v259 -> v260 - NewMigration("Convert scoped access tokens", v1_20.ConvertScopedAccessTokens), + newMigration(244, "Add NeedApproval to actions tables", v1_20.AddNeedApprovalToActionRun), + newMigration(245, "Rename Webhook org_id to owner_id", v1_20.RenameWebhookOrgToOwner), + newMigration(246, "Add missed column owner_id for project table", v1_20.AddNewColumnForProject), + newMigration(247, "Fix incorrect project type", v1_20.FixIncorrectProjectType), + newMigration(248, "Add version column to action_runner table", v1_20.AddVersionToActionRunner), + newMigration(249, "Improve Action table indices v3", v1_20.ImproveActionTableIndices), + newMigration(250, "Change Container Metadata", v1_20.ChangeContainerMetadataMultiArch), + newMigration(251, "Fix incorrect owner team unit access mode", v1_20.FixIncorrectOwnerTeamUnitAccessMode), + newMigration(252, "Fix incorrect admin team unit access mode", v1_20.FixIncorrectAdminTeamUnitAccessMode), + newMigration(253, "Fix ExternalTracker and ExternalWiki accessMode in owner and admin team", v1_20.FixExternalTrackerAndExternalWikiAccessModeInOwnerAndAdminTeam), + newMigration(254, "Add ActionTaskOutput table", v1_20.AddActionTaskOutputTable), + newMigration(255, "Add ArchivedUnix Column", v1_20.AddArchivedUnixToRepository), + newMigration(256, "Add is_internal column to package", v1_20.AddIsInternalColumnToPackage), + newMigration(257, "Add Actions Artifact table", v1_20.CreateActionArtifactTable), + newMigration(258, "Add PinOrder Column", v1_20.AddPinOrderToIssue), + newMigration(259, "Convert scoped access tokens", v1_20.ConvertScopedAccessTokens), - // Gitea 1.20.0 ends at 260 + // Gitea 1.20.0 ends at database version 260 - // v260 -> v261 - NewMigration("Drop custom_labels column of action_runner table", v1_21.DropCustomLabelsColumnOfActionRunner), - // v261 -> v262 - NewMigration("Add variable table", v1_21.CreateVariableTable), - // v262 -> v263 - NewMigration("Add TriggerEvent to action_run table", v1_21.AddTriggerEventToActionRun), - // v263 -> v264 - NewMigration("Add git_size and lfs_size columns to repository table", v1_21.AddGitSizeAndLFSSizeToRepositoryTable), - // v264 -> v265 - NewMigration("Add branch table", v1_21.AddBranchTable), - // v265 -> v266 - NewMigration("Alter Actions Artifact table", v1_21.AlterActionArtifactTable), - // v266 -> v267 - NewMigration("Reduce commit status", v1_21.ReduceCommitStatus), - // v267 -> v268 - NewMigration("Add action_tasks_version table", v1_21.CreateActionTasksVersionTable), - // v268 -> v269 - NewMigration("Update Action Ref", v1_21.UpdateActionsRefIndex), - // v269 -> v270 - NewMigration("Drop deleted branch table", v1_21.DropDeletedBranchTable), - // v270 -> v271 - NewMigration("Fix PackageProperty typo", v1_21.FixPackagePropertyTypo), - // v271 -> v272 - NewMigration("Allow archiving labels", v1_21.AddArchivedUnixColumInLabelTable), - // v272 -> v273 - NewMigration("Add Version to ActionRun table", v1_21.AddVersionToActionRunTable), - // v273 -> v274 - NewMigration("Add Action Schedule Table", v1_21.AddActionScheduleTable), - // v274 -> v275 - NewMigration("Add Actions artifacts expiration date", v1_21.AddExpiredUnixColumnInActionArtifactTable), - // v275 -> v276 - NewMigration("Add ScheduleID for ActionRun", v1_21.AddScheduleIDForActionRun), - // v276 -> v277 - NewMigration("Add RemoteAddress to mirrors", v1_21.AddRemoteAddressToMirrors), - // v277 -> v278 - NewMigration("Add Index to issue_user.issue_id", v1_21.AddIndexToIssueUserIssueID), - // v278 -> v279 - NewMigration("Add Index to comment.dependent_issue_id", v1_21.AddIndexToCommentDependentIssueID), - // v279 -> v280 - NewMigration("Add Index to action.user_id", v1_21.AddIndexToActionUserID), + newMigration(260, "Drop custom_labels column of action_runner table", v1_21.DropCustomLabelsColumnOfActionRunner), + newMigration(261, "Add variable table", v1_21.CreateVariableTable), + newMigration(262, "Add TriggerEvent to action_run table", v1_21.AddTriggerEventToActionRun), + newMigration(263, "Add git_size and lfs_size columns to repository table", v1_21.AddGitSizeAndLFSSizeToRepositoryTable), + newMigration(264, "Add branch table", v1_21.AddBranchTable), + newMigration(265, "Alter Actions Artifact table", v1_21.AlterActionArtifactTable), + newMigration(266, "Reduce commit status", v1_21.ReduceCommitStatus), + newMigration(267, "Add action_tasks_version table", v1_21.CreateActionTasksVersionTable), + newMigration(268, "Update Action Ref", v1_21.UpdateActionsRefIndex), + newMigration(269, "Drop deleted branch table", v1_21.DropDeletedBranchTable), + newMigration(270, "Fix PackageProperty typo", v1_21.FixPackagePropertyTypo), + newMigration(271, "Allow archiving labels", v1_21.AddArchivedUnixColumInLabelTable), + newMigration(272, "Add Version to ActionRun table", v1_21.AddVersionToActionRunTable), + newMigration(273, "Add Action Schedule Table", v1_21.AddActionScheduleTable), + newMigration(274, "Add Actions artifacts expiration date", v1_21.AddExpiredUnixColumnInActionArtifactTable), + newMigration(275, "Add ScheduleID for ActionRun", v1_21.AddScheduleIDForActionRun), + newMigration(276, "Add RemoteAddress to mirrors", v1_21.AddRemoteAddressToMirrors), + newMigration(277, "Add Index to issue_user.issue_id", v1_21.AddIndexToIssueUserIssueID), + newMigration(278, "Add Index to comment.dependent_issue_id", v1_21.AddIndexToCommentDependentIssueID), + newMigration(279, "Add Index to action.user_id", v1_21.AddIndexToActionUserID), - // Gitea 1.21.0 ends at 280 + // Gitea 1.21.0 ends at database version 280 - // v280 -> v281 - NewMigration("Rename user themes", v1_22.RenameUserThemes), - // v281 -> v282 - NewMigration("Add auth_token table", v1_22.CreateAuthTokenTable), - // v282 -> v283 - NewMigration("Add Index to pull_auto_merge.doer_id", v1_22.AddIndexToPullAutoMergeDoerID), - // v283 -> v284 - NewMigration("Add combined Index to issue_user.uid and issue_id", v1_22.AddCombinedIndexToIssueUser), - // v284 -> v285 - NewMigration("Add ignore stale approval column on branch table", v1_22.AddIgnoreStaleApprovalsColumnToProtectedBranchTable), - // v285 -> v286 - NewMigration("Add PreviousDuration to ActionRun", v1_22.AddPreviousDurationToActionRun), - // v286 -> v287 - NewMigration("Add support for SHA256 git repositories", v1_22.AdjustDBForSha256), - // v287 -> v288 - NewMigration("Use Slug instead of ID for Badges", v1_22.UseSlugInsteadOfIDForBadges), - // v288 -> v289 - NewMigration("Add user_blocking table", v1_22.AddUserBlockingTable), - // v289 -> v290 - NewMigration("Add default_wiki_branch to repository table", v1_22.AddDefaultWikiBranch), - // v290 -> v291 - NewMigration("Add PayloadVersion to HookTask", v1_22.AddPayloadVersionToHookTaskTable), - // v291 -> v292 - NewMigration("Add Index to attachment.comment_id", v1_22.AddCommentIDIndexofAttachment), - // v292 -> v293 - NewMigration("Ensure every project has exactly one default column - No Op", noopMigration), - // v293 -> v294 - NewMigration("Ensure every project has exactly one default column", v1_22.CheckProjectColumnsConsistency), + newMigration(280, "Rename user themes", v1_22.RenameUserThemes), + newMigration(281, "Add auth_token table", v1_22.CreateAuthTokenTable), + newMigration(282, "Add Index to pull_auto_merge.doer_id", v1_22.AddIndexToPullAutoMergeDoerID), + newMigration(283, "Add combined Index to issue_user.uid and issue_id", v1_22.AddCombinedIndexToIssueUser), + newMigration(284, "Add ignore stale approval column on branch table", v1_22.AddIgnoreStaleApprovalsColumnToProtectedBranchTable), + newMigration(285, "Add PreviousDuration to ActionRun", v1_22.AddPreviousDurationToActionRun), + newMigration(286, "Add support for SHA256 git repositories", v1_22.AdjustDBForSha256), + newMigration(287, "Use Slug instead of ID for Badges", v1_22.UseSlugInsteadOfIDForBadges), + newMigration(288, "Add user_blocking table", v1_22.AddUserBlockingTable), + newMigration(289, "Add default_wiki_branch to repository table", v1_22.AddDefaultWikiBranch), + newMigration(290, "Add PayloadVersion to HookTask", v1_22.AddPayloadVersionToHookTaskTable), + newMigration(291, "Add Index to attachment.comment_id", v1_22.AddCommentIDIndexofAttachment), + newMigration(292, "Ensure every project has exactly one default column - No Op", noopMigration), + newMigration(293, "Ensure every project has exactly one default column", v1_22.CheckProjectColumnsConsistency), - // Gitea 1.22.0-rc0 ends at 294 + // Gitea 1.22.0-rc0 ends at database version 294 - // v294 -> v295 - NewMigration("Add unique index for project issue table", v1_22.AddUniqueIndexForProjectIssue), - // v295 -> v296 - NewMigration("Add commit status summary table", v1_22.AddCommitStatusSummary), - // v296 -> v297 - NewMigration("Add missing field of commit status summary table", v1_22.AddCommitStatusSummary2), - // v297 -> v298 - NewMigration("Add everyone_access_mode for repo_unit", noopMigration), - // v298 -> v299 - NewMigration("Drop wrongly created table o_auth2_application", v1_22.DropWronglyCreatedTable), + newMigration(294, "Add unique index for project issue table", v1_22.AddUniqueIndexForProjectIssue), + newMigration(295, "Add commit status summary table", v1_22.AddCommitStatusSummary), + newMigration(296, "Add missing field of commit status summary table", v1_22.AddCommitStatusSummary2), + newMigration(297, "Add everyone_access_mode for repo_unit", noopMigration), + newMigration(298, "Drop wrongly created table o_auth2_application", v1_22.DropWronglyCreatedTable), - // Gitea 1.22.0-rc1 ends at 299 + // Gitea 1.22.0-rc1 ends at migration ID number 298 (database version 299) - // v299 -> v300 - NewMigration("Add content version to issue and comment table", v1_23.AddContentVersionToIssueAndComment), - // v300 -> v301 - NewMigration("Add force-push branch protection support", v1_23.AddForcePushBranchProtection), - // v301 -> v302 - NewMigration("Add skip_secondary_authorization option to oauth2 application table", v1_23.AddSkipSecondaryAuthColumnToOAuth2ApplicationTable), - // v302 -> v303 - NewMigration("Add index to action_task stopped log_expired", v1_23.AddIndexToActionTaskStoppedLogExpired), + newMigration(299, "Add content version to issue and comment table", v1_23.AddContentVersionToIssueAndComment), + newMigration(300, "Add force-push branch protection support", v1_23.AddForcePushBranchProtection), + newMigration(301, "Add skip_secondary_authorization option to oauth2 application table", v1_23.AddSkipSecondaryAuthColumnToOAuth2ApplicationTable), + newMigration(302, "Add index to action_task stopped log_expired", v1_23.AddIndexToActionTaskStoppedLogExpired), + + // Migration to Forgejo v10 + newMigration(303, "Gitea last drop", v1_23.GiteaLastDrop), + newMigration(304, "Migrate `secret` column to store keying material", forgejo_migrations.MigrateTwoFactorToKeying), + } + return preparedMigrations } // GetCurrentDBVersion returns the current db version @@ -618,9 +387,20 @@ func GetCurrentDBVersion(x *xorm.Engine) (int64, error) { return currentVersion.Version, nil } -// ExpectedVersion returns the expected db version -func ExpectedVersion() int64 { - return int64(minDBVersion + len(migrations)) +func calcDBVersion(migrations []*migration) int64 { + dbVer := int64(minDBVersion + len(migrations)) + if migrations[0].idNumber != minDBVersion { + panic("migrations should start at minDBVersion") + } + if dbVer != migrations[len(migrations)-1].idNumber+1 { + panic("migrations are not in order") + } + return dbVer +} + +// ExpectedDBVersion returns the expected db version +func ExpectedDBVersion() int64 { + return calcDBVersion(prepareMigrationTasks()) } // EnsureUpToDate will check if the db is at the correct version @@ -631,24 +411,35 @@ func EnsureUpToDate(x *xorm.Engine) error { } if currentDB < 0 { - return fmt.Errorf("Database has not been initialized") + return fmt.Errorf("database has not been initialized") } if minDBVersion > currentDB { return fmt.Errorf("DB version %d (<= %d) is too old for auto-migration. Upgrade to Gitea 1.6.4 first then upgrade to this version", currentDB, minDBVersion) } - expected := ExpectedVersion() + expectedDB := ExpectedDBVersion() - if currentDB != expected { - return fmt.Errorf(`Current database version %d is not equal to the expected version %d. Please run "forgejo [--config /path/to/app.ini] migrate" to update the database version`, currentDB, expected) + if currentDB != expectedDB { + return fmt.Errorf(`current database version %d is not equal to the expected version %d. Please run "forgejo [--config /path/to/app.ini] migrate" to update the database version`, currentDB, expectedDB) } return forgejo_migrations.EnsureUpToDate(x) } +func getPendingMigrations(curDBVer int64, migrations []*migration) []*migration { + return migrations[curDBVer-minDBVersion:] +} + +func migrationIDNumberToDBVersion(idNumber int64) int64 { + return idNumber + 1 +} + // Migrate database to current version func Migrate(x *xorm.Engine) error { + migrations := prepareMigrationTasks() + maxDBVer := calcDBVersion(migrations) + // Set a new clean the default mapper to GonicMapper as that is the default for Gitea. x.SetMapper(names.GonicMapper{}) if err := x.Sync(new(Version)); err != nil { @@ -661,11 +452,10 @@ func Migrate(x *xorm.Engine) error { if err != nil { return fmt.Errorf("get: %w", err) } else if !has { - // If the version record does not exist we think - // it is a fresh installation and we can skip all migrations. + // If the version record does not exist, it is a fresh installation, and we can skip all migrations. + // XORM model framework will create all tables when initializing. currentVersion.ID = 0 - currentVersion.Version = int64(minDBVersion + len(migrations)) - + currentVersion.Version = maxDBVer if _, err = x.InsertOne(currentVersion); err != nil { return fmt.Errorf("insert: %w", err) } @@ -673,19 +463,20 @@ func Migrate(x *xorm.Engine) error { previousVersion = currentVersion.Version } - v := currentVersion.Version - if minDBVersion > v { + curDBVer := currentVersion.Version + // Outdated Forgejo database version is not supported + if curDBVer < minDBVersion { log.Fatal(`Forgejo no longer supports auto-migration from your previously installed version. Please try upgrading to a lower version first (suggested v1.6.4), then upgrade to this version.`) return nil } - // Downgrading Forgejo database version is not supported - if int(v-minDBVersion) > len(migrations) { - msg := fmt.Sprintf("Your database (migration version: %d) is for a newer Forgejo, you can not use the newer database for this old Forgejo release (%d).", v, minDBVersion+len(migrations)) + // Downgrading Forgejo's database version not supported + if maxDBVer < curDBVer { + msg := fmt.Sprintf("Your database (migration version: %d) is for a newer Forgejo, you can not use the newer database for this old Forgejo release (%d).", curDBVer, maxDBVer) msg += "\nForgejo will exit to keep your database safe and unchanged. Please use the correct Forgejo release, do not change the migration version manually (incorrect manual operation may lose data)." if !setting.IsProd { - msg += fmt.Sprintf("\nIf you are in development and really know what you're doing, you can force changing the migration version by executing: UPDATE version SET version=%d WHERE id=1;", minDBVersion+len(migrations)) + msg += fmt.Sprintf("\nIf you are in development and really know what you're doing, you can force changing the migration version by executing: UPDATE version SET version=%d WHERE id=1;", maxDBVer) } log.Fatal("Migration Error: %s", msg) return nil @@ -703,14 +494,14 @@ Please try upgrading to a lower version first (suggested v1.6.4), then upgrade t } // Migrate - for i, m := range migrations[v-minDBVersion:] { - log.Info("Migration[%d]: %s", v+int64(i), m.Description()) + for _, m := range getPendingMigrations(curDBVer, migrations) { + log.Info("Migration[%d]: %s", m.idNumber, m.description) // Reset the mapper between each migration - migrations are not supposed to depend on each other x.SetMapper(names.GonicMapper{}) if err = m.Migrate(x); err != nil { - return fmt.Errorf("migration[%d]: %s failed: %w", v+int64(i), m.Description(), err) + return fmt.Errorf("migration[%d]: %s failed: %w", m.idNumber, m.description, err) } - currentVersion.Version = v + int64(i) + 1 + currentVersion.Version = migrationIDNumberToDBVersion(m.idNumber) if _, err = x.ID(1).Update(currentVersion); err != nil { return err } diff --git a/models/migrations/migrations_test.go b/models/migrations/migrations_test.go new file mode 100644 index 0000000000..ea941b9a09 --- /dev/null +++ b/models/migrations/migrations_test.go @@ -0,0 +1,27 @@ +// Copyright 2024 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package migrations + +import ( + "testing" + + "forgejo.org/modules/test" + + "github.com/stretchr/testify/assert" +) + +func TestMigrations(t *testing.T) { + defer test.MockVariableValue(&preparedMigrations, []*migration{ + {idNumber: 70}, + {idNumber: 71}, + })() + assert.EqualValues(t, 72, calcDBVersion(preparedMigrations)) + assert.EqualValues(t, 72, ExpectedDBVersion()) + + assert.EqualValues(t, 71, migrationIDNumberToDBVersion(70)) + + assert.EqualValues(t, []*migration{{idNumber: 70}, {idNumber: 71}}, getPendingMigrations(70, preparedMigrations)) + assert.EqualValues(t, []*migration{{idNumber: 71}}, getPendingMigrations(71, preparedMigrations)) + assert.EqualValues(t, []*migration{}, getPendingMigrations(72, preparedMigrations)) +} diff --git a/models/migrations/test/tests.go b/models/migrations/test/tests.go index 0e37233471..07487cf58a 100644 --- a/models/migrations/test/tests.go +++ b/models/migrations/test/tests.go @@ -11,19 +11,18 @@ import ( "os" "path" "path/filepath" - "runtime" "strings" "testing" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/base" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/testlogger" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + "forgejo.org/modules/base" + "forgejo.org/modules/git" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/testlogger" + "forgejo.org/modules/util" "github.com/stretchr/testify/require" "xorm.io/xorm" @@ -123,9 +122,6 @@ func MainTest(m *testing.M) { os.Exit(1) } giteaBinary := "gitea" - if runtime.GOOS == "windows" { - giteaBinary += ".exe" - } setting.AppPath = path.Join(giteaRoot, giteaBinary) if _, err := os.Stat(setting.AppPath); err != nil { fmt.Printf("Could not find gitea binary at %s\n", setting.AppPath) diff --git a/models/migrations/v1_10/v96.go b/models/migrations/v1_10/v96.go index 34c8240031..3bfb770f24 100644 --- a/models/migrations/v1_10/v96.go +++ b/models/migrations/v1_10/v96.go @@ -6,8 +6,8 @@ package v1_10 //nolint import ( "path/filepath" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" "xorm.io/xorm" ) diff --git a/models/migrations/v1_10/v99.go b/models/migrations/v1_10/v99.go index ebe6597f7c..7f287b77aa 100644 --- a/models/migrations/v1_10/v99.go +++ b/models/migrations/v1_10/v99.go @@ -4,7 +4,7 @@ package v1_10 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_11/v102.go b/models/migrations/v1_11/v102.go index 9358e4cef3..a585d9c423 100644 --- a/models/migrations/v1_11/v102.go +++ b/models/migrations/v1_11/v102.go @@ -4,7 +4,7 @@ package v1_11 //nolint import ( - "code.gitea.io/gitea/models/migrations/base" + "forgejo.org/models/migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_11/v104.go b/models/migrations/v1_11/v104.go index 3e8ee64bc1..af3578ca4a 100644 --- a/models/migrations/v1_11/v104.go +++ b/models/migrations/v1_11/v104.go @@ -4,7 +4,7 @@ package v1_11 //nolint import ( - "code.gitea.io/gitea/models/migrations/base" + "forgejo.org/models/migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_11/v112.go b/models/migrations/v1_11/v112.go index 0857663119..6112ab51a5 100644 --- a/models/migrations/v1_11/v112.go +++ b/models/migrations/v1_11/v112.go @@ -7,8 +7,8 @@ import ( "fmt" "path/filepath" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" "xorm.io/builder" "xorm.io/xorm" diff --git a/models/migrations/v1_11/v115.go b/models/migrations/v1_11/v115.go index 8c631cfd0b..3d4b41017b 100644 --- a/models/migrations/v1_11/v115.go +++ b/models/migrations/v1_11/v115.go @@ -12,10 +12,10 @@ import ( "path/filepath" "time" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/container" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" "xorm.io/xorm" ) diff --git a/models/migrations/v1_12/v127.go b/models/migrations/v1_12/v127.go index 00e391dc87..11a4042973 100644 --- a/models/migrations/v1_12/v127.go +++ b/models/migrations/v1_12/v127.go @@ -6,7 +6,7 @@ package v1_12 //nolint import ( "fmt" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_12/v128.go b/models/migrations/v1_12/v128.go index 6eea1337ef..6d7307f470 100644 --- a/models/migrations/v1_12/v128.go +++ b/models/migrations/v1_12/v128.go @@ -10,9 +10,9 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/git" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_12/v130.go b/models/migrations/v1_12/v130.go index 391810c7ca..bfa856796a 100644 --- a/models/migrations/v1_12/v130.go +++ b/models/migrations/v1_12/v130.go @@ -4,8 +4,8 @@ package v1_12 //nolint import ( - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/json" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_12/v134.go b/models/migrations/v1_12/v134.go index 23c2916ba8..bba996fd40 100644 --- a/models/migrations/v1_12/v134.go +++ b/models/migrations/v1_12/v134.go @@ -10,9 +10,9 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/git" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_12/v136.go b/models/migrations/v1_12/v136.go index d91ff92feb..db6fc6dea1 100644 --- a/models/migrations/v1_12/v136.go +++ b/models/migrations/v1_12/v136.go @@ -10,10 +10,10 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/graceful" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/git" + "forgejo.org/modules/graceful" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_12/v139.go b/models/migrations/v1_12/v139.go index 5b6576951d..cd7963524e 100644 --- a/models/migrations/v1_12/v139.go +++ b/models/migrations/v1_12/v139.go @@ -4,7 +4,7 @@ package v1_12 //nolint import ( - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_13/v140.go b/models/migrations/v1_13/v140.go index 2d3337012d..d74f808e9f 100644 --- a/models/migrations/v1_13/v140.go +++ b/models/migrations/v1_13/v140.go @@ -6,8 +6,8 @@ package v1_13 //nolint import ( "fmt" - "code.gitea.io/gitea/models/migrations/base" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/migrations/base" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_13/v142.go b/models/migrations/v1_13/v142.go index 7c7c01ad47..7490e0f3b4 100644 --- a/models/migrations/v1_13/v142.go +++ b/models/migrations/v1_13/v142.go @@ -4,7 +4,7 @@ package v1_13 //nolint import ( - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" "xorm.io/builder" "xorm.io/xorm" diff --git a/models/migrations/v1_13/v143.go b/models/migrations/v1_13/v143.go index 885768dff3..1f9120e2ba 100644 --- a/models/migrations/v1_13/v143.go +++ b/models/migrations/v1_13/v143.go @@ -4,7 +4,7 @@ package v1_13 //nolint import ( - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" "xorm.io/xorm" ) diff --git a/models/migrations/v1_13/v144.go b/models/migrations/v1_13/v144.go index f5a0bc5751..7e801eab8a 100644 --- a/models/migrations/v1_13/v144.go +++ b/models/migrations/v1_13/v144.go @@ -4,7 +4,7 @@ package v1_13 //nolint import ( - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" "xorm.io/builder" "xorm.io/xorm" diff --git a/models/migrations/v1_13/v145.go b/models/migrations/v1_13/v145.go index 5b38f1cd80..a01f577ed1 100644 --- a/models/migrations/v1_13/v145.go +++ b/models/migrations/v1_13/v145.go @@ -6,7 +6,7 @@ package v1_13 //nolint import ( "fmt" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_13/v146.go b/models/migrations/v1_13/v146.go index 7d9a878704..a1b54ee3aa 100644 --- a/models/migrations/v1_13/v146.go +++ b/models/migrations/v1_13/v146.go @@ -4,7 +4,7 @@ package v1_13 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_13/v147.go b/models/migrations/v1_13/v147.go index 510ef39b28..cc57504c74 100644 --- a/models/migrations/v1_13/v147.go +++ b/models/migrations/v1_13/v147.go @@ -4,7 +4,7 @@ package v1_13 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_13/v149.go b/models/migrations/v1_13/v149.go index 2a1db04cbb..3a0c5909d5 100644 --- a/models/migrations/v1_13/v149.go +++ b/models/migrations/v1_13/v149.go @@ -6,7 +6,7 @@ package v1_13 //nolint import ( "fmt" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_13/v150.go b/models/migrations/v1_13/v150.go index d5ba489566..be14fd130c 100644 --- a/models/migrations/v1_13/v150.go +++ b/models/migrations/v1_13/v150.go @@ -4,8 +4,8 @@ package v1_13 //nolint import ( - "code.gitea.io/gitea/models/migrations/base" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/migrations/base" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_13/v151.go b/models/migrations/v1_13/v151.go index ea4a8eae31..60339962cb 100644 --- a/models/migrations/v1_13/v151.go +++ b/models/migrations/v1_13/v151.go @@ -8,8 +8,8 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" "xorm.io/xorm" "xorm.io/xorm/schemas" diff --git a/models/migrations/v1_13/v154.go b/models/migrations/v1_13/v154.go index 60cc56713e..cf31190781 100644 --- a/models/migrations/v1_13/v154.go +++ b/models/migrations/v1_13/v154.go @@ -4,7 +4,7 @@ package v1_13 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_14/main_test.go b/models/migrations/v1_14/main_test.go index cf7fcb56a6..c01faedc35 100644 --- a/models/migrations/v1_14/main_test.go +++ b/models/migrations/v1_14/main_test.go @@ -6,7 +6,7 @@ package v1_14 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/v1_14/v156.go b/models/migrations/v1_14/v156.go index 2cf4954a15..b6dc91a054 100644 --- a/models/migrations/v1_14/v156.go +++ b/models/migrations/v1_14/v156.go @@ -8,9 +8,9 @@ import ( "path/filepath" "strings" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/git" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_14/v158.go b/models/migrations/v1_14/v158.go index 2d688b1706..9849d5a9ea 100644 --- a/models/migrations/v1_14/v158.go +++ b/models/migrations/v1_14/v158.go @@ -7,8 +7,8 @@ import ( "fmt" "strconv" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_14/v159.go b/models/migrations/v1_14/v159.go index 149ae0f6a8..fdd7e12449 100644 --- a/models/migrations/v1_14/v159.go +++ b/models/migrations/v1_14/v159.go @@ -4,8 +4,8 @@ package v1_14 //nolint import ( - "code.gitea.io/gitea/models/migrations/base" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/migrations/base" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_14/v161.go b/models/migrations/v1_14/v161.go index ac7e821a80..6e904cfab6 100644 --- a/models/migrations/v1_14/v161.go +++ b/models/migrations/v1_14/v161.go @@ -6,7 +6,7 @@ package v1_14 //nolint import ( "context" - "code.gitea.io/gitea/models/migrations/base" + "forgejo.org/models/migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_14/v162.go b/models/migrations/v1_14/v162.go index 2e4e0b8eb0..5d6d7c2e3f 100644 --- a/models/migrations/v1_14/v162.go +++ b/models/migrations/v1_14/v162.go @@ -4,7 +4,7 @@ package v1_14 //nolint import ( - "code.gitea.io/gitea/models/migrations/base" + "forgejo.org/models/migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_14/v163.go b/models/migrations/v1_14/v163.go index 0cd8ba68c8..60fc98c0a4 100644 --- a/models/migrations/v1_14/v163.go +++ b/models/migrations/v1_14/v163.go @@ -4,7 +4,7 @@ package v1_14 //nolint import ( - "code.gitea.io/gitea/models/migrations/base" + "forgejo.org/models/migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_14/v165.go b/models/migrations/v1_14/v165.go index 5b1a779294..9315e44197 100644 --- a/models/migrations/v1_14/v165.go +++ b/models/migrations/v1_14/v165.go @@ -4,7 +4,7 @@ package v1_14 //nolint import ( - "code.gitea.io/gitea/models/migrations/base" + "forgejo.org/models/migrations/base" "xorm.io/xorm" "xorm.io/xorm/schemas" diff --git a/models/migrations/v1_14/v172.go b/models/migrations/v1_14/v172.go index 0f9bef902a..d49b70f5ad 100644 --- a/models/migrations/v1_14/v172.go +++ b/models/migrations/v1_14/v172.go @@ -4,7 +4,7 @@ package v1_14 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_14/v175.go b/models/migrations/v1_14/v175.go index 70d72b2600..3cda5772a0 100644 --- a/models/migrations/v1_14/v175.go +++ b/models/migrations/v1_14/v175.go @@ -7,8 +7,8 @@ import ( "fmt" "regexp" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_14/v176_test.go b/models/migrations/v1_14/v176_test.go index f5e644e501..d88ff207e7 100644 --- a/models/migrations/v1_14/v176_test.go +++ b/models/migrations/v1_14/v176_test.go @@ -6,7 +6,7 @@ package v1_14 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" "github.com/stretchr/testify/assert" ) diff --git a/models/migrations/v1_14/v177_test.go b/models/migrations/v1_14/v177_test.go index cf5e745d39..199a71186a 100644 --- a/models/migrations/v1_14/v177_test.go +++ b/models/migrations/v1_14/v177_test.go @@ -6,8 +6,8 @@ package v1_14 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" - "code.gitea.io/gitea/modules/timeutil" + migration_tests "forgejo.org/models/migrations/test" + "forgejo.org/modules/timeutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_15/main_test.go b/models/migrations/v1_15/main_test.go index e4960658d3..6c04d3f5ee 100644 --- a/models/migrations/v1_15/main_test.go +++ b/models/migrations/v1_15/main_test.go @@ -6,7 +6,7 @@ package v1_15 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/v1_15/v179.go b/models/migrations/v1_15/v179.go index f6b142eb42..b990583303 100644 --- a/models/migrations/v1_15/v179.go +++ b/models/migrations/v1_15/v179.go @@ -4,7 +4,7 @@ package v1_15 //nolint import ( - "code.gitea.io/gitea/models/migrations/base" + "forgejo.org/models/migrations/base" "xorm.io/xorm" "xorm.io/xorm/schemas" diff --git a/models/migrations/v1_15/v180.go b/models/migrations/v1_15/v180.go index c71e771861..02fbd57cdb 100644 --- a/models/migrations/v1_15/v180.go +++ b/models/migrations/v1_15/v180.go @@ -4,8 +4,8 @@ package v1_15 //nolint import ( - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/json" + "forgejo.org/modules/util" "xorm.io/builder" "xorm.io/xorm" diff --git a/models/migrations/v1_15/v181_test.go b/models/migrations/v1_15/v181_test.go index ead26f5fcf..4544ca6520 100644 --- a/models/migrations/v1_15/v181_test.go +++ b/models/migrations/v1_15/v181_test.go @@ -7,7 +7,7 @@ import ( "strings" "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_15/v182_test.go b/models/migrations/v1_15/v182_test.go index eb21311339..6865cafac4 100644 --- a/models/migrations/v1_15/v182_test.go +++ b/models/migrations/v1_15/v182_test.go @@ -6,7 +6,7 @@ package v1_15 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_15/v183.go b/models/migrations/v1_15/v183.go index effad1b467..aaad64c220 100644 --- a/models/migrations/v1_15/v183.go +++ b/models/migrations/v1_15/v183.go @@ -7,7 +7,7 @@ import ( "fmt" "time" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_15/v184.go b/models/migrations/v1_15/v184.go index 871c9db18a..41b64d4743 100644 --- a/models/migrations/v1_15/v184.go +++ b/models/migrations/v1_15/v184.go @@ -7,8 +7,8 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/migrations/base" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/migrations/base" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_15/v186.go b/models/migrations/v1_15/v186.go index 01aab3add5..ad75822de5 100644 --- a/models/migrations/v1_15/v186.go +++ b/models/migrations/v1_15/v186.go @@ -4,7 +4,7 @@ package v1_15 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_15/v187.go b/models/migrations/v1_15/v187.go index 21cd6772b7..b573fc52ef 100644 --- a/models/migrations/v1_15/v187.go +++ b/models/migrations/v1_15/v187.go @@ -4,7 +4,7 @@ package v1_15 //nolint import ( - "code.gitea.io/gitea/models/migrations/base" + "forgejo.org/models/migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_16/main_test.go b/models/migrations/v1_16/main_test.go index 49611776dd..6f891f3e94 100644 --- a/models/migrations/v1_16/main_test.go +++ b/models/migrations/v1_16/main_test.go @@ -6,7 +6,7 @@ package v1_16 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/v1_16/v189.go b/models/migrations/v1_16/v189.go index 5649645051..1ee72d9c39 100644 --- a/models/migrations/v1_16/v189.go +++ b/models/migrations/v1_16/v189.go @@ -7,8 +7,8 @@ import ( "encoding/binary" "fmt" - "code.gitea.io/gitea/models/migrations/base" - "code.gitea.io/gitea/modules/json" + "forgejo.org/models/migrations/base" + "forgejo.org/modules/json" "xorm.io/xorm" ) diff --git a/models/migrations/v1_16/v189_test.go b/models/migrations/v1_16/v189_test.go index 88c6ebd2b1..e72c385168 100644 --- a/models/migrations/v1_16/v189_test.go +++ b/models/migrations/v1_16/v189_test.go @@ -6,8 +6,8 @@ package v1_16 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" - "code.gitea.io/gitea/modules/json" + migration_tests "forgejo.org/models/migrations/test" + "forgejo.org/modules/json" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_16/v191.go b/models/migrations/v1_16/v191.go index c618783c08..567f88d6d1 100644 --- a/models/migrations/v1_16/v191.go +++ b/models/migrations/v1_16/v191.go @@ -4,7 +4,7 @@ package v1_16 //nolint import ( - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_16/v192.go b/models/migrations/v1_16/v192.go index 2d5d158a09..731b9fb43a 100644 --- a/models/migrations/v1_16/v192.go +++ b/models/migrations/v1_16/v192.go @@ -4,7 +4,7 @@ package v1_16 //nolint import ( - "code.gitea.io/gitea/models/migrations/base" + "forgejo.org/models/migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_16/v193_test.go b/models/migrations/v1_16/v193_test.go index 0da670888b..ab39bcd98c 100644 --- a/models/migrations/v1_16/v193_test.go +++ b/models/migrations/v1_16/v193_test.go @@ -6,7 +6,7 @@ package v1_16 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_16/v195_test.go b/models/migrations/v1_16/v195_test.go index 9a62fc9649..71234a6fb3 100644 --- a/models/migrations/v1_16/v195_test.go +++ b/models/migrations/v1_16/v195_test.go @@ -6,7 +6,7 @@ package v1_16 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_16/v198.go b/models/migrations/v1_16/v198.go index 115bb313a0..8b3c73addc 100644 --- a/models/migrations/v1_16/v198.go +++ b/models/migrations/v1_16/v198.go @@ -6,7 +6,7 @@ package v1_16 //nolint import ( "fmt" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_16/v205.go b/models/migrations/v1_16/v205.go index d6c577083c..a064b9830d 100644 --- a/models/migrations/v1_16/v205.go +++ b/models/migrations/v1_16/v205.go @@ -4,7 +4,7 @@ package v1_16 //nolint import ( - "code.gitea.io/gitea/models/migrations/base" + "forgejo.org/models/migrations/base" "xorm.io/xorm" "xorm.io/xorm/schemas" diff --git a/models/migrations/v1_16/v210.go b/models/migrations/v1_16/v210.go index db45b11aed..375a008e18 100644 --- a/models/migrations/v1_16/v210.go +++ b/models/migrations/v1_16/v210.go @@ -10,7 +10,7 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" "xorm.io/xorm/schemas" diff --git a/models/migrations/v1_16/v210_test.go b/models/migrations/v1_16/v210_test.go index 7321350de2..010cd8a770 100644 --- a/models/migrations/v1_16/v210_test.go +++ b/models/migrations/v1_16/v210_test.go @@ -7,8 +7,8 @@ import ( "encoding/hex" "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" - "code.gitea.io/gitea/modules/timeutil" + migration_tests "forgejo.org/models/migrations/test" + "forgejo.org/modules/timeutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_17/main_test.go b/models/migrations/v1_17/main_test.go index 8a787f68b6..0a8e05ab5f 100644 --- a/models/migrations/v1_17/main_test.go +++ b/models/migrations/v1_17/main_test.go @@ -6,7 +6,7 @@ package v1_17 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/v1_17/v212.go b/models/migrations/v1_17/v212.go index e3f9437121..2337adcc80 100644 --- a/models/migrations/v1_17/v212.go +++ b/models/migrations/v1_17/v212.go @@ -4,7 +4,7 @@ package v1_17 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_17/v215.go b/models/migrations/v1_17/v215.go index b338f85417..5aae798562 100644 --- a/models/migrations/v1_17/v215.go +++ b/models/migrations/v1_17/v215.go @@ -4,8 +4,8 @@ package v1_17 //nolint import ( - "code.gitea.io/gitea/models/pull" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/pull" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_17/v217.go b/models/migrations/v1_17/v217.go index 3f970b68a5..5f096d4824 100644 --- a/models/migrations/v1_17/v217.go +++ b/models/migrations/v1_17/v217.go @@ -4,7 +4,7 @@ package v1_17 //nolint import ( - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_17/v218.go b/models/migrations/v1_17/v218.go index 4c05a9b539..5e3dcd0841 100644 --- a/models/migrations/v1_17/v218.go +++ b/models/migrations/v1_17/v218.go @@ -4,8 +4,8 @@ package v1_17 //nolint import ( - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" "xorm.io/xorm" "xorm.io/xorm/schemas" diff --git a/models/migrations/v1_17/v219.go b/models/migrations/v1_17/v219.go index d266029fd9..e90656090f 100644 --- a/models/migrations/v1_17/v219.go +++ b/models/migrations/v1_17/v219.go @@ -6,8 +6,8 @@ package v1_17 //nolint import ( "time" - "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/repo" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_17/v220.go b/models/migrations/v1_17/v220.go index d4007163ab..61bbf19725 100644 --- a/models/migrations/v1_17/v220.go +++ b/models/migrations/v1_17/v220.go @@ -4,8 +4,8 @@ package v1_17 //nolint import ( - packages_model "code.gitea.io/gitea/models/packages" - container_module "code.gitea.io/gitea/modules/packages/container" + packages_model "forgejo.org/models/packages" + container_module "forgejo.org/modules/packages/container" "xorm.io/xorm" "xorm.io/xorm/schemas" diff --git a/models/migrations/v1_17/v221.go b/models/migrations/v1_17/v221.go index 9e159388bd..84e9a238af 100644 --- a/models/migrations/v1_17/v221.go +++ b/models/migrations/v1_17/v221.go @@ -7,7 +7,7 @@ import ( "encoding/base32" "fmt" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_17/v221_test.go b/models/migrations/v1_17/v221_test.go index 0f6db2a54f..02607d6b32 100644 --- a/models/migrations/v1_17/v221_test.go +++ b/models/migrations/v1_17/v221_test.go @@ -7,7 +7,7 @@ import ( "encoding/base32" "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_17/v222.go b/models/migrations/v1_17/v222.go index 2ffb94eb1c..c9a33f007d 100644 --- a/models/migrations/v1_17/v222.go +++ b/models/migrations/v1_17/v222.go @@ -7,8 +7,8 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/migrations/base" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/migrations/base" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_17/v223.go b/models/migrations/v1_17/v223.go index 3592eb1be6..7d92dcf5ae 100644 --- a/models/migrations/v1_17/v223.go +++ b/models/migrations/v1_17/v223.go @@ -7,9 +7,9 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/migrations/base" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/migrations/base" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_18/main_test.go b/models/migrations/v1_18/main_test.go index 329aa2003a..33f5c51222 100644 --- a/models/migrations/v1_18/main_test.go +++ b/models/migrations/v1_18/main_test.go @@ -6,7 +6,7 @@ package v1_18 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/v1_18/v225.go b/models/migrations/v1_18/v225.go index b0ac3777fc..86bcb1323d 100644 --- a/models/migrations/v1_18/v225.go +++ b/models/migrations/v1_18/v225.go @@ -4,7 +4,7 @@ package v1_18 //nolint import ( - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_18/v227.go b/models/migrations/v1_18/v227.go index 5fe5dcd0c9..b6250fb76c 100644 --- a/models/migrations/v1_18/v227.go +++ b/models/migrations/v1_18/v227.go @@ -4,7 +4,7 @@ package v1_18 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_18/v228.go b/models/migrations/v1_18/v228.go index 3e7a36de15..1161c8a4c9 100644 --- a/models/migrations/v1_18/v228.go +++ b/models/migrations/v1_18/v228.go @@ -4,7 +4,7 @@ package v1_18 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_18/v229.go b/models/migrations/v1_18/v229.go index 10d9f35097..f96dde9840 100644 --- a/models/migrations/v1_18/v229.go +++ b/models/migrations/v1_18/v229.go @@ -6,7 +6,7 @@ package v1_18 //nolint import ( "fmt" - "code.gitea.io/gitea/models/issues" + "forgejo.org/models/issues" "xorm.io/builder" "xorm.io/xorm" diff --git a/models/migrations/v1_18/v229_test.go b/models/migrations/v1_18/v229_test.go index b20d0ff3a2..ac5e726a79 100644 --- a/models/migrations/v1_18/v229_test.go +++ b/models/migrations/v1_18/v229_test.go @@ -6,8 +6,8 @@ package v1_18 //nolint import ( "testing" - "code.gitea.io/gitea/models/issues" - migration_tests "code.gitea.io/gitea/models/migrations/test" + "forgejo.org/models/issues" + migration_tests "forgejo.org/models/migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_18/v230_test.go b/models/migrations/v1_18/v230_test.go index 82b3b8f2b0..7dd6675673 100644 --- a/models/migrations/v1_18/v230_test.go +++ b/models/migrations/v1_18/v230_test.go @@ -6,7 +6,7 @@ package v1_18 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_19/main_test.go b/models/migrations/v1_19/main_test.go index 18696a7f69..7c56926f4c 100644 --- a/models/migrations/v1_19/main_test.go +++ b/models/migrations/v1_19/main_test.go @@ -6,7 +6,7 @@ package v1_19 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/v1_19/v232.go b/models/migrations/v1_19/v232.go index 9caf587c1e..7fb4a5ac8d 100644 --- a/models/migrations/v1_19/v232.go +++ b/models/migrations/v1_19/v232.go @@ -4,7 +4,7 @@ package v1_19 //nolint import ( - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_19/v233.go b/models/migrations/v1_19/v233.go index ba4cd8e20b..191afd4868 100644 --- a/models/migrations/v1_19/v233.go +++ b/models/migrations/v1_19/v233.go @@ -6,10 +6,10 @@ package v1_19 //nolint import ( "fmt" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/secret" - "code.gitea.io/gitea/modules/setting" - api "code.gitea.io/gitea/modules/structs" + "forgejo.org/modules/json" + "forgejo.org/modules/secret" + "forgejo.org/modules/setting" + api "forgejo.org/modules/structs" "xorm.io/builder" "xorm.io/xorm" diff --git a/models/migrations/v1_19/v233_test.go b/models/migrations/v1_19/v233_test.go index 94e9bc3a11..de025ca2b7 100644 --- a/models/migrations/v1_19/v233_test.go +++ b/models/migrations/v1_19/v233_test.go @@ -6,11 +6,11 @@ package v1_19 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/secret" - "code.gitea.io/gitea/modules/setting" - webhook_module "code.gitea.io/gitea/modules/webhook" + migration_tests "forgejo.org/models/migrations/test" + "forgejo.org/modules/json" + "forgejo.org/modules/secret" + "forgejo.org/modules/setting" + webhook_module "forgejo.org/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_19/v234.go b/models/migrations/v1_19/v234.go index 728a580807..c610a423dd 100644 --- a/models/migrations/v1_19/v234.go +++ b/models/migrations/v1_19/v234.go @@ -4,7 +4,7 @@ package v1_19 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_19/v236.go b/models/migrations/v1_19/v236.go index f172a85b1f..fa01a6ab80 100644 --- a/models/migrations/v1_19/v236.go +++ b/models/migrations/v1_19/v236.go @@ -4,7 +4,7 @@ package v1_19 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_19/v238.go b/models/migrations/v1_19/v238.go index 266e6cea58..7c912a8341 100644 --- a/models/migrations/v1_19/v238.go +++ b/models/migrations/v1_19/v238.go @@ -4,7 +4,7 @@ package v1_19 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_19/v240.go b/models/migrations/v1_19/v240.go index 4505f86299..4ca5becede 100644 --- a/models/migrations/v1_19/v240.go +++ b/models/migrations/v1_19/v240.go @@ -4,8 +4,8 @@ package v1_19 //nolint import ( - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_19/v242.go b/models/migrations/v1_19/v242.go index 4470835214..bbf227ef77 100644 --- a/models/migrations/v1_19/v242.go +++ b/models/migrations/v1_19/v242.go @@ -4,7 +4,7 @@ package v1_19 //nolint import ( - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_20/main_test.go b/models/migrations/v1_20/main_test.go index e8d95b0e1e..f870dca429 100644 --- a/models/migrations/v1_20/main_test.go +++ b/models/migrations/v1_20/main_test.go @@ -6,7 +6,7 @@ package v1_20 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/v1_20/v245.go b/models/migrations/v1_20/v245.go index b0d4c21502..7e6585388b 100644 --- a/models/migrations/v1_20/v245.go +++ b/models/migrations/v1_20/v245.go @@ -7,8 +7,8 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/migrations/base" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/migrations/base" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_20/v247.go b/models/migrations/v1_20/v247.go index 59fc5c46b5..9ed810a623 100644 --- a/models/migrations/v1_20/v247.go +++ b/models/migrations/v1_20/v247.go @@ -4,7 +4,7 @@ package v1_20 //nolint import ( - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" "xorm.io/xorm" ) diff --git a/models/migrations/v1_20/v249.go b/models/migrations/v1_20/v249.go index 02951a74d6..d2b096bf58 100644 --- a/models/migrations/v1_20/v249.go +++ b/models/migrations/v1_20/v249.go @@ -4,7 +4,7 @@ package v1_20 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" "xorm.io/xorm/schemas" diff --git a/models/migrations/v1_20/v250.go b/models/migrations/v1_20/v250.go index 86388ef0b8..cfcde2fc9b 100644 --- a/models/migrations/v1_20/v250.go +++ b/models/migrations/v1_20/v250.go @@ -6,7 +6,7 @@ package v1_20 //nolint import ( "strings" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" "xorm.io/xorm" ) diff --git a/models/migrations/v1_20/v251.go b/models/migrations/v1_20/v251.go index 7743248a3f..c8665ba7eb 100644 --- a/models/migrations/v1_20/v251.go +++ b/models/migrations/v1_20/v251.go @@ -4,7 +4,7 @@ package v1_20 //nolint import ( - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" "xorm.io/xorm" ) diff --git a/models/migrations/v1_20/v252.go b/models/migrations/v1_20/v252.go index ab61cd9b8b..bb85c78309 100644 --- a/models/migrations/v1_20/v252.go +++ b/models/migrations/v1_20/v252.go @@ -4,7 +4,7 @@ package v1_20 //nolint import ( - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" "xorm.io/xorm" ) diff --git a/models/migrations/v1_20/v253.go b/models/migrations/v1_20/v253.go index 96c494bd8d..5f4057e9d9 100644 --- a/models/migrations/v1_20/v253.go +++ b/models/migrations/v1_20/v253.go @@ -4,7 +4,7 @@ package v1_20 //nolint import ( - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" "xorm.io/xorm" ) diff --git a/models/migrations/v1_20/v255.go b/models/migrations/v1_20/v255.go index 14b70f8f96..49b0ecf220 100644 --- a/models/migrations/v1_20/v255.go +++ b/models/migrations/v1_20/v255.go @@ -4,7 +4,7 @@ package v1_20 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_20/v257.go b/models/migrations/v1_20/v257.go index 6c6ca4c748..70f229d73f 100644 --- a/models/migrations/v1_20/v257.go +++ b/models/migrations/v1_20/v257.go @@ -4,7 +4,7 @@ package v1_20 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_20/v259.go b/models/migrations/v1_20/v259.go index 5b8ced4ad7..f10b94fa9c 100644 --- a/models/migrations/v1_20/v259.go +++ b/models/migrations/v1_20/v259.go @@ -7,7 +7,7 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" "xorm.io/xorm" ) diff --git a/models/migrations/v1_20/v259_test.go b/models/migrations/v1_20/v259_test.go index ae219ea814..d67cc9dd81 100644 --- a/models/migrations/v1_20/v259_test.go +++ b/models/migrations/v1_20/v259_test.go @@ -8,7 +8,7 @@ import ( "strings" "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_21/main_test.go b/models/migrations/v1_21/main_test.go index 0148170458..7104887afb 100644 --- a/models/migrations/v1_21/main_test.go +++ b/models/migrations/v1_21/main_test.go @@ -6,7 +6,7 @@ package v1_21 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/v1_21/v260.go b/models/migrations/v1_21/v260.go index 6ca52c5998..245f3011ab 100644 --- a/models/migrations/v1_21/v260.go +++ b/models/migrations/v1_21/v260.go @@ -4,7 +4,7 @@ package v1_21 //nolint import ( - "code.gitea.io/gitea/models/migrations/base" + "forgejo.org/models/migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_21/v261.go b/models/migrations/v1_21/v261.go index 4ec1160d0b..743bef152d 100644 --- a/models/migrations/v1_21/v261.go +++ b/models/migrations/v1_21/v261.go @@ -4,7 +4,7 @@ package v1_21 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_21/v264.go b/models/migrations/v1_21/v264.go index e81a17ad6d..88eaf0d918 100644 --- a/models/migrations/v1_21/v264.go +++ b/models/migrations/v1_21/v264.go @@ -7,8 +7,8 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_21/v267.go b/models/migrations/v1_21/v267.go index bc0e954bdc..f94696a22b 100644 --- a/models/migrations/v1_21/v267.go +++ b/models/migrations/v1_21/v267.go @@ -4,7 +4,7 @@ package v1_21 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_21/v271.go b/models/migrations/v1_21/v271.go index 098f6499d5..f45c113c1f 100644 --- a/models/migrations/v1_21/v271.go +++ b/models/migrations/v1_21/v271.go @@ -3,7 +3,7 @@ package v1_21 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_21/v273.go b/models/migrations/v1_21/v273.go index 61c79f4a76..1ec6ade566 100644 --- a/models/migrations/v1_21/v273.go +++ b/models/migrations/v1_21/v273.go @@ -3,7 +3,7 @@ package v1_21 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_21/v274.go b/models/migrations/v1_21/v274.go index df5994f159..b74e5fed51 100644 --- a/models/migrations/v1_21/v274.go +++ b/models/migrations/v1_21/v274.go @@ -5,7 +5,7 @@ package v1_21 //nolint import ( "time" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_21/v276.go b/models/migrations/v1_21/v276.go index 67e950177d..0830c3bd92 100644 --- a/models/migrations/v1_21/v276.go +++ b/models/migrations/v1_21/v276.go @@ -4,8 +4,8 @@ package v1_21 //nolint import ( - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/modules/setting" + repo_model "forgejo.org/models/repo" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_22/main_test.go b/models/migrations/v1_22/main_test.go index 2005789b6d..dc991b78fe 100644 --- a/models/migrations/v1_22/main_test.go +++ b/models/migrations/v1_22/main_test.go @@ -6,7 +6,7 @@ package v1_22 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/v1_22/v281.go b/models/migrations/v1_22/v281.go index fc1866aa83..5271c786be 100644 --- a/models/migrations/v1_22/v281.go +++ b/models/migrations/v1_22/v281.go @@ -4,7 +4,7 @@ package v1_22 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_22/v283_test.go b/models/migrations/v1_22/v283_test.go index 5f6c04a881..d8e147a131 100644 --- a/models/migrations/v1_22/v283_test.go +++ b/models/migrations/v1_22/v283_test.go @@ -6,7 +6,7 @@ package v1_22 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" "github.com/stretchr/testify/require" ) diff --git a/models/migrations/v1_22/v286.go b/models/migrations/v1_22/v286.go index 97ff649dca..d0489e7aeb 100644 --- a/models/migrations/v1_22/v286.go +++ b/models/migrations/v1_22/v286.go @@ -5,8 +5,8 @@ package v1_22 //nolint import ( "fmt" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_22/v286_test.go b/models/migrations/v1_22/v286_test.go index 76b00e5b14..e6f8d4096e 100644 --- a/models/migrations/v1_22/v286_test.go +++ b/models/migrations/v1_22/v286_test.go @@ -6,7 +6,7 @@ package v1_22 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_22/v288.go b/models/migrations/v1_22/v288.go index 7c93bfcc66..44e4991851 100644 --- a/models/migrations/v1_22/v288.go +++ b/models/migrations/v1_22/v288.go @@ -4,7 +4,7 @@ package v1_22 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_22/v290.go b/models/migrations/v1_22/v290.go index e3c58b0515..594e417644 100644 --- a/models/migrations/v1_22/v290.go +++ b/models/migrations/v1_22/v290.go @@ -4,8 +4,8 @@ package v1_22 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" - webhook_module "code.gitea.io/gitea/modules/webhook" + "forgejo.org/modules/timeutil" + webhook_module "forgejo.org/modules/webhook" "xorm.io/xorm" ) diff --git a/models/migrations/v1_22/v290_test.go b/models/migrations/v1_22/v290_test.go index ced200f83f..569d77bc16 100644 --- a/models/migrations/v1_22/v290_test.go +++ b/models/migrations/v1_22/v290_test.go @@ -7,9 +7,9 @@ import ( "strconv" "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" - "code.gitea.io/gitea/modules/timeutil" - webhook_module "code.gitea.io/gitea/modules/webhook" + migration_tests "forgejo.org/models/migrations/test" + "forgejo.org/modules/timeutil" + webhook_module "forgejo.org/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_22/v293.go b/models/migrations/v1_22/v293.go index 53cc719294..9f38c3db56 100644 --- a/models/migrations/v1_22/v293.go +++ b/models/migrations/v1_22/v293.go @@ -4,8 +4,8 @@ package v1_22 //nolint import ( - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_22/v293_test.go b/models/migrations/v1_22/v293_test.go index 85bb46421b..444146737d 100644 --- a/models/migrations/v1_22/v293_test.go +++ b/models/migrations/v1_22/v293_test.go @@ -6,9 +6,9 @@ package v1_22 //nolint import ( "testing" - "code.gitea.io/gitea/models/db" - migration_tests "code.gitea.io/gitea/models/migrations/test" - "code.gitea.io/gitea/models/project" + "forgejo.org/models/db" + migration_tests "forgejo.org/models/migrations/test" + "forgejo.org/models/project" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_22/v294_test.go b/models/migrations/v1_22/v294_test.go index c465d53738..ef7b67ca5b 100644 --- a/models/migrations/v1_22/v294_test.go +++ b/models/migrations/v1_22/v294_test.go @@ -7,7 +7,7 @@ import ( "slices" "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/migrations/v1_23/main_test.go b/models/migrations/v1_23/main_test.go index e3425e4625..0fd90a4a67 100644 --- a/models/migrations/v1_23/main_test.go +++ b/models/migrations/v1_23/main_test.go @@ -6,7 +6,7 @@ package v1_23 //nolint import ( "testing" - migration_tests "code.gitea.io/gitea/models/migrations/test" + migration_tests "forgejo.org/models/migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/migrations/v1_23/v302.go b/models/migrations/v1_23/v302.go index d7ea03eb3d..c8ed786d63 100644 --- a/models/migrations/v1_23/v302.go +++ b/models/migrations/v1_23/v302.go @@ -4,7 +4,7 @@ package v1_23 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_23/v303.go b/models/migrations/v1_23/v303.go new file mode 100644 index 0000000000..fae0131bdd --- /dev/null +++ b/models/migrations/v1_23/v303.go @@ -0,0 +1,60 @@ +// Copyright 2025 The Forgejo Authors. +// SPDX-License-Identifier: GPL-3.0-or-later + +package v1_23 //nolint + +import ( + "forgejo.org/models/migrations/base" + + "xorm.io/xorm" + "xorm.io/xorm/schemas" +) + +func GiteaLastDrop(x *xorm.Engine) error { + tables, err := x.DBMetas() + if err != nil { + return err + } + + sess := x.NewSession() + defer sess.Close() + + for _, drop := range []struct { + table string + column string + }{ + {"badge", "slug"}, + {"oauth2_application", "skip_secondary_authorization"}, + {"repository", "default_wiki_branch"}, + {"repo_unit", "everyone_access_mode"}, + {"protected_branch", "can_force_push"}, + {"protected_branch", "enable_force_push_allowlist"}, + {"protected_branch", "force_push_allowlist_user_i_ds"}, + {"protected_branch", "force_push_allowlist_team_i_ds"}, + {"protected_branch", "force_push_allowlist_deploy_keys"}, + } { + var table *schemas.Table + found := false + + for _, table = range tables { + if table.Name == drop.table { + found = true + break + } + } + + if !found { + continue + } + + if table.GetColumn(drop.column) == nil { + continue + } + + if err := base.DropTableColumns(sess, drop.table, drop.column); err != nil { + return err + } + } + + return sess.Commit() +} diff --git a/models/migrations/v1_23/v303_test.go b/models/migrations/v1_23/v303_test.go new file mode 100644 index 0000000000..f105d11830 --- /dev/null +++ b/models/migrations/v1_23/v303_test.go @@ -0,0 +1,41 @@ +// Copyright 2025 The Forgejo Authors. +// SPDX-License-Identifier: GPL-3.0-or-later + +package v1_23 //nolint + +import ( + "testing" + + migration_tests "forgejo.org/models/migrations/test" + + "github.com/stretchr/testify/require" + "xorm.io/xorm/schemas" +) + +func Test_GiteaLastDrop(t *testing.T) { + type Badge struct { + ID int64 `xorm:"pk autoincr"` + Slug string + } + + x, deferable := migration_tests.PrepareTestEnv(t, 0, new(Badge)) + defer deferable() + if x == nil || t.Failed() { + return + } + + getColumn := func() *schemas.Column { + tables, err := x.DBMetas() + require.NoError(t, err) + require.Len(t, tables, 1) + table := tables[0] + require.Equal(t, "badge", table.Name) + return table.GetColumn("slug") + } + + require.NotNil(t, getColumn(), "slug column exists") + require.NoError(t, GiteaLastDrop(x)) + require.Nil(t, getColumn(), "slug column was deleted") + // idempotent + require.NoError(t, GiteaLastDrop(x)) +} diff --git a/models/migrations/v1_6/v70.go b/models/migrations/v1_6/v70.go index 74434a84a1..ec6bd09bb5 100644 --- a/models/migrations/v1_6/v70.go +++ b/models/migrations/v1_6/v70.go @@ -7,7 +7,7 @@ import ( "fmt" "time" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_6/v71.go b/models/migrations/v1_6/v71.go index 586187228b..3706ad4406 100644 --- a/models/migrations/v1_6/v71.go +++ b/models/migrations/v1_6/v71.go @@ -6,9 +6,9 @@ package v1_6 //nolint import ( "fmt" - "code.gitea.io/gitea/models/migrations/base" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/migrations/base" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/xorm" ) diff --git a/models/migrations/v1_6/v72.go b/models/migrations/v1_6/v72.go index 04cef9a170..4df2a0f6e9 100644 --- a/models/migrations/v1_6/v72.go +++ b/models/migrations/v1_6/v72.go @@ -6,7 +6,7 @@ package v1_6 //nolint import ( "fmt" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_8/v76.go b/models/migrations/v1_8/v76.go index d3fbd94deb..61ad006a47 100644 --- a/models/migrations/v1_8/v76.go +++ b/models/migrations/v1_8/v76.go @@ -6,7 +6,7 @@ package v1_8 //nolint import ( "fmt" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_8/v78.go b/models/migrations/v1_8/v78.go index 8f041c1484..8102b19335 100644 --- a/models/migrations/v1_8/v78.go +++ b/models/migrations/v1_8/v78.go @@ -4,7 +4,7 @@ package v1_8 //nolint import ( - "code.gitea.io/gitea/models/migrations/base" + "forgejo.org/models/migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_8/v79.go b/models/migrations/v1_8/v79.go index eb3a9ed0f4..f7d2d68f96 100644 --- a/models/migrations/v1_8/v79.go +++ b/models/migrations/v1_8/v79.go @@ -4,7 +4,7 @@ package v1_8 //nolint import ( - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_9/v82.go b/models/migrations/v1_9/v82.go index 26806dd645..78a90bdde9 100644 --- a/models/migrations/v1_9/v82.go +++ b/models/migrations/v1_9/v82.go @@ -8,8 +8,8 @@ import ( "path/filepath" "strings" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/git" + "forgejo.org/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_9/v83.go b/models/migrations/v1_9/v83.go index 10e6c45875..fa24a92d28 100644 --- a/models/migrations/v1_9/v83.go +++ b/models/migrations/v1_9/v83.go @@ -4,7 +4,7 @@ package v1_9 //nolint import ( - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_9/v85.go b/models/migrations/v1_9/v85.go index a23d7c5d6e..d8e9d91840 100644 --- a/models/migrations/v1_9/v85.go +++ b/models/migrations/v1_9/v85.go @@ -6,10 +6,10 @@ package v1_9 //nolint import ( "fmt" - "code.gitea.io/gitea/models/migrations/base" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/migrations/base" + "forgejo.org/modules/log" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/xorm" ) diff --git a/models/org.go b/models/org.go index 5f61f05b16..6e191acff0 100644 --- a/models/org.go +++ b/models/org.go @@ -8,10 +8,10 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/organization" - access_model "code.gitea.io/gitea/models/perm/access" - repo_model "code.gitea.io/gitea/models/repo" + "forgejo.org/models/db" + "forgejo.org/models/organization" + access_model "forgejo.org/models/perm/access" + repo_model "forgejo.org/models/repo" ) // RemoveOrgUser removes user from given organization. diff --git a/models/org_team.go b/models/org_team.go index 1a452436c3..ecda43f0a9 100644 --- a/models/org_team.go +++ b/models/org_team.go @@ -9,16 +9,16 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/models/db" - git_model "code.gitea.io/gitea/models/git" - issues_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/models/organization" - access_model "code.gitea.io/gitea/models/perm/access" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + git_model "forgejo.org/models/git" + issues_model "forgejo.org/models/issues" + "forgejo.org/models/organization" + access_model "forgejo.org/models/perm/access" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" "xorm.io/builder" ) diff --git a/models/org_team_test.go b/models/org_team_test.go index 2819607e12..dc1fdb4b3b 100644 --- a/models/org_team_test.go +++ b/models/org_team_test.go @@ -7,13 +7,13 @@ import ( "strings" "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/organization" - "code.gitea.io/gitea/models/perm" - access_model "code.gitea.io/gitea/models/perm/access" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + "forgejo.org/models/organization" + "forgejo.org/models/perm" + access_model "forgejo.org/models/perm/access" + 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" diff --git a/models/org_test.go b/models/org_test.go index bb5e524ec9..45e21da0e0 100644 --- a/models/org_test.go +++ b/models/org_test.go @@ -6,10 +6,10 @@ package models import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/organization" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + "forgejo.org/models/organization" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/organization/TestFindOrgs/org_user.yml b/models/organization/TestFindOrgs/org_user.yml new file mode 100644 index 0000000000..79b6fc613e --- /dev/null +++ b/models/organization/TestFindOrgs/org_user.yml @@ -0,0 +1,5 @@ +- + id: 1000 + uid: 4 + org_id: 22 + is_public: true diff --git a/models/organization/TestInconsistentOwnerTeam/team.yml b/models/organization/TestInconsistentOwnerTeam/team.yml new file mode 100644 index 0000000000..90e3ad43b0 --- /dev/null +++ b/models/organization/TestInconsistentOwnerTeam/team.yml @@ -0,0 +1,10 @@ +- + id: 1000 + org_id: 1000 + lower_name: owners + name: Owners + authorize: 4 # owner + num_repos: 0 + num_members: 0 + includes_all_repositories: true + can_create_org_repo: true diff --git a/models/organization/TestInconsistentOwnerTeam/team_unit.yml b/models/organization/TestInconsistentOwnerTeam/team_unit.yml new file mode 100644 index 0000000000..91e03d6a9a --- /dev/null +++ b/models/organization/TestInconsistentOwnerTeam/team_unit.yml @@ -0,0 +1,59 @@ +- + id: 1000 + team_id: 1000 + type: 1 + access_mode: 0 # None + +- + id: 1001 + team_id: 1000 + type: 2 + access_mode: 0 + +- + id: 1002 + team_id: 1000 + type: 3 + access_mode: 0 + +- + id: 1003 + team_id: 1000 + type: 4 + access_mode: 0 + +- + id: 1004 + team_id: 1000 + type: 5 + access_mode: 0 + +- + id: 1005 + team_id: 1000 + type: 6 + access_mode: 0 + +- + id: 1006 + team_id: 1000 + type: 7 + access_mode: 0 + +- + id: 1007 + team_id: 1000 + type: 8 + access_mode: 0 + +- + id: 1008 + team_id: 1000 + type: 9 + access_mode: 0 + +- + id: 1009 + team_id: 1000 + type: 10 + access_mode: 0 diff --git a/models/organization/main_test.go b/models/organization/main_test.go index c35898a465..dd10b60d30 100644 --- a/models/organization/main_test.go +++ b/models/organization/main_test.go @@ -6,14 +6,15 @@ package organization_test import ( "testing" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/unittest" - _ "code.gitea.io/gitea/models" - _ "code.gitea.io/gitea/models/actions" - _ "code.gitea.io/gitea/models/activities" - _ "code.gitea.io/gitea/models/organization" - _ "code.gitea.io/gitea/models/repo" - _ "code.gitea.io/gitea/models/user" + _ "forgejo.org/models" + _ "forgejo.org/models/actions" + _ "forgejo.org/models/activities" + _ "forgejo.org/models/forgefed" + _ "forgejo.org/models/organization" + _ "forgejo.org/models/repo" + _ "forgejo.org/models/user" ) func TestMain(m *testing.M) { diff --git a/models/organization/mini_org.go b/models/organization/mini_org.go deleted file mode 100644 index b1b24624c5..0000000000 --- a/models/organization/mini_org.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2022 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package organization - -import ( - "context" - "fmt" - "strings" - - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unit" - user_model "code.gitea.io/gitea/models/user" - - "xorm.io/builder" -) - -// MinimalOrg represents a simple organization with only the needed columns -type MinimalOrg = Organization - -// GetUserOrgsList returns all organizations the given user has access to -func GetUserOrgsList(ctx context.Context, user *user_model.User) ([]*MinimalOrg, error) { - schema, err := db.TableInfo(new(user_model.User)) - if err != nil { - return nil, err - } - - outputCols := []string{ - "id", - "name", - "full_name", - "visibility", - "avatar", - "avatar_email", - "use_custom_avatar", - } - - groupByCols := &strings.Builder{} - for _, col := range outputCols { - fmt.Fprintf(groupByCols, "`%s`.%s,", schema.Name, col) - } - groupByStr := groupByCols.String() - groupByStr = groupByStr[0 : len(groupByStr)-1] - - sess := db.GetEngine(ctx) - sess = sess.Select(groupByStr+", count(distinct repo_id) as org_count"). - Table("user"). - Join("INNER", "team", "`team`.org_id = `user`.id"). - Join("INNER", "team_user", "`team`.id = `team_user`.team_id"). - Join("LEFT", builder. - Select("id as repo_id, owner_id as repo_owner_id"). - From("repository"). - Where(repo_model.AccessibleRepositoryCondition(user, unit.TypeInvalid)), "`repository`.repo_owner_id = `team`.org_id"). - Where("`team_user`.uid = ?", user.ID). - GroupBy(groupByStr) - - type OrgCount struct { - Organization `xorm:"extends"` - OrgCount int - } - - orgCounts := make([]*OrgCount, 0, 10) - - if err := sess. - Asc("`user`.name"). - Find(&orgCounts); err != nil { - return nil, err - } - - orgs := make([]*MinimalOrg, len(orgCounts)) - for i, orgCount := range orgCounts { - orgCount.Organization.NumRepos = orgCount.OrgCount - orgs[i] = &orgCount.Organization - } - - return orgs, nil -} diff --git a/models/organization/org.go b/models/organization/org.go index 45f19c7696..1339f7415d 100644 --- a/models/organization/org.go +++ b/models/organization/org.go @@ -9,28 +9,21 @@ import ( "fmt" "strings" - actions_model "code.gitea.io/gitea/models/actions" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/perm" - repo_model "code.gitea.io/gitea/models/repo" - secret_model "code.gitea.io/gitea/models/secret" - "code.gitea.io/gitea/models/unit" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/util" + actions_model "forgejo.org/models/actions" + "forgejo.org/models/db" + "forgejo.org/models/perm" + repo_model "forgejo.org/models/repo" + secret_model "forgejo.org/models/secret" + "forgejo.org/models/unit" + user_model "forgejo.org/models/user" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/structs" + "forgejo.org/modules/util" "xorm.io/builder" ) -// ________ .__ __ .__ -// \_____ \_______ _________ ____ |__|____________ _/ |_|__| ____ ____ -// / | \_ __ \/ ___\__ \ / \| \___ /\__ \\ __\ |/ _ \ / \ -// / | \ | \/ /_/ > __ \| | \ |/ / / __ \| | | ( <_> ) | \ -// \_______ /__| \___ (____ /___| /__/_____ \(____ /__| |__|\____/|___| / -// \/ /_____/ \/ \/ \/ \/ \/ - // ErrOrgNotExist represents a "OrgNotExist" kind of error. type ErrOrgNotExist struct { ID int64 @@ -141,8 +134,9 @@ func (org *Organization) LoadTeams(ctx context.Context) ([]*Team, error) { } // GetMembers returns all members of organization. -func (org *Organization) GetMembers(ctx context.Context) (user_model.UserList, map[int64]bool, error) { +func (org *Organization) GetMembers(ctx context.Context, doer *user_model.User) (user_model.UserList, map[int64]bool, error) { return FindOrgMembers(ctx, &FindOrgMembersOpts{ + Doer: doer, OrgID: org.ID, }) } @@ -195,16 +189,22 @@ func (org *Organization) CanCreateRepo() bool { // FindOrgMembersOpts represensts find org members conditions type FindOrgMembersOpts struct { db.ListOptions - OrgID int64 - PublicOnly bool + Doer *user_model.User + IsDoerMember bool + OrgID int64 +} + +func (opts FindOrgMembersOpts) PublicOnly() bool { + return opts.Doer == nil || !(opts.IsDoerMember || opts.Doer.IsAdmin) } // CountOrgMembers counts the organization's members func CountOrgMembers(ctx context.Context, opts *FindOrgMembersOpts) (int64, error) { sess := db.GetEngine(ctx).Where("org_id=?", opts.OrgID) - if opts.PublicOnly { + if opts.PublicOnly() { sess.And("is_public = ?", true) } + return sess.Count(new(OrgUser)) } @@ -264,7 +264,7 @@ func (org *Organization) UnitPermission(ctx context.Context, doer *user_model.Us } } - if org.Visibility.IsPublic() { + if org.Visibility.IsPublic() || (org.Visibility.IsLimited() && doer != nil) { return perm.AccessModeRead } @@ -439,42 +439,6 @@ func GetUsersWhoCanCreateOrgRepo(ctx context.Context, orgID int64) (map[int64]*u And("team_user.org_id = ?", orgID).Find(&users) } -// SearchOrganizationsOptions options to filter organizations -type SearchOrganizationsOptions struct { - db.ListOptions - All bool -} - -// FindOrgOptions finds orgs options -type FindOrgOptions struct { - db.ListOptions - UserID int64 - IncludePrivate bool -} - -func queryUserOrgIDs(userID int64, includePrivate bool) *builder.Builder { - cond := builder.Eq{"uid": userID} - if !includePrivate { - cond["is_public"] = true - } - return builder.Select("org_id").From("org_user").Where(cond) -} - -func (opts FindOrgOptions) ToConds() builder.Cond { - var cond builder.Cond = builder.Eq{"`user`.`type`": user_model.UserTypeOrganization} - if opts.UserID > 0 { - cond = cond.And(builder.In("`user`.`id`", queryUserOrgIDs(opts.UserID, opts.IncludePrivate))) - } - if !opts.IncludePrivate { - cond = cond.And(builder.Eq{"`user`.visibility": structs.VisibleTypePublic}) - } - return cond -} - -func (opts FindOrgOptions) ToOrders() string { - return "`user`.name ASC" -} - // HasOrgOrUserVisible tells if the given user can see the given org or user func HasOrgOrUserVisible(ctx context.Context, orgOrUser, user *user_model.User) bool { // If user is nil, it's an anonymous user/request. @@ -507,26 +471,13 @@ func HasOrgsVisible(ctx context.Context, orgs []*Organization, user *user_model. return false } -// GetOrgsCanCreateRepoByUserID returns a list of organizations where given user ID -// are allowed to create repos. -func GetOrgsCanCreateRepoByUserID(ctx context.Context, userID int64) ([]*Organization, error) { - orgs := make([]*Organization, 0, 10) - - return orgs, db.GetEngine(ctx).Where(builder.In("id", builder.Select("`user`.id").From("`user`"). - Join("INNER", "`team_user`", "`team_user`.org_id = `user`.id"). - Join("INNER", "`team`", "`team`.id = `team_user`.team_id"). - Where(builder.Eq{"`team_user`.uid": userID}). - And(builder.Eq{"`team`.authorize": perm.AccessModeOwner}.Or(builder.Eq{"`team`.can_create_org_repo": true})))). - Asc("`user`.name"). - Find(&orgs) -} - // GetOrgUsersByOrgID returns all organization-user relations by organization ID. func GetOrgUsersByOrgID(ctx context.Context, opts *FindOrgMembersOpts) ([]*OrgUser, error) { sess := db.GetEngine(ctx).Where("org_id=?", opts.OrgID) - if opts.PublicOnly { + if opts.PublicOnly() { sess.And("is_public = ?", true) } + if opts.ListOptions.PageSize > 0 { sess = db.SetSessionPagination(sess, opts) diff --git a/models/organization/org_list.go b/models/organization/org_list.go new file mode 100644 index 0000000000..e387936473 --- /dev/null +++ b/models/organization/org_list.go @@ -0,0 +1,144 @@ +// Copyright 2024 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package organization + +import ( + "context" + "fmt" + "strings" + + "forgejo.org/models/db" + "forgejo.org/models/perm" + user_model "forgejo.org/models/user" + "forgejo.org/modules/structs" + + "xorm.io/builder" +) + +// SearchOrganizationsOptions options to filter organizations +type SearchOrganizationsOptions struct { + db.ListOptions + All bool +} + +// FindOrgOptions finds orgs options +type FindOrgOptions struct { + db.ListOptions + UserID int64 + IncludeLimited bool + IncludePrivate bool +} + +func queryUserOrgIDs(userID int64, includePrivate bool) *builder.Builder { + cond := builder.Eq{"uid": userID} + if !includePrivate { + cond["is_public"] = true + } + return builder.Select("org_id").From("org_user").Where(cond) +} + +func (opts FindOrgOptions) ToConds() builder.Cond { + var cond builder.Cond = builder.Eq{"`user`.`type`": user_model.UserTypeOrganization} + if opts.UserID > 0 { + cond = cond.And(builder.In("`user`.`id`", queryUserOrgIDs(opts.UserID, opts.IncludePrivate))) + } + if !opts.IncludePrivate { + if !opts.IncludeLimited { + cond = cond.And(builder.Eq{"`user`.visibility": structs.VisibleTypePublic}) + } else { + cond = cond.And(builder.In("`user`.visibility", structs.VisibleTypePublic, structs.VisibleTypeLimited)) + } + } + return cond +} + +func (opts FindOrgOptions) ToOrders() string { + return "`user`.lower_name ASC" +} + +// GetOrgsCanCreateRepoByUserID returns a list of organizations where given user ID +// are allowed to create repos. +func GetOrgsCanCreateRepoByUserID(ctx context.Context, userID int64) ([]*Organization, error) { + orgs := make([]*Organization, 0, 10) + + return orgs, db.GetEngine(ctx).Select("DISTINCT `user`.id, `user`.*").Table("`user`"). + Join("INNER", "`team_user`", "`team_user`.org_id = `user`.id"). + Join("INNER", "`team`", "`team`.id = `team_user`.team_id"). + Where(builder.Eq{"`team_user`.uid": userID}). + And(builder.Eq{"`team`.authorize": perm.AccessModeOwner}.Or(builder.Eq{"`team`.can_create_org_repo": true})). + Asc("`user`.name"). + Find(&orgs) +} + +// MinimalOrg represents a simple organization with only the needed columns +type MinimalOrg = Organization + +// GetUserOrgsList returns all organizations the given user has access to +func GetUserOrgsList(ctx context.Context, user *user_model.User) ([]*MinimalOrg, error) { + schema, err := db.TableInfo(new(user_model.User)) + if err != nil { + return nil, err + } + + outputCols := []string{ + "id", + "name", + "full_name", + "visibility", + "avatar", + "avatar_email", + "use_custom_avatar", + } + + selectColumns := &strings.Builder{} + for i, col := range outputCols { + fmt.Fprintf(selectColumns, "`%s`.%s", schema.Name, col) + if i < len(outputCols)-1 { + selectColumns.WriteString(", ") + } + } + columnsStr := selectColumns.String() + + var orgs []*MinimalOrg + if err := db.GetEngine(ctx).Select(columnsStr). + Table("user"). + Where(builder.In("`user`.`id`", queryUserOrgIDs(user.ID, true))). + OrderBy("`user`.lower_name ASC"). + Find(&orgs); err != nil { + return nil, err + } + + type orgCount struct { + OrgID int64 + RepoCount int + } + var orgCounts []orgCount + if err := db.GetEngine(ctx). + Select("owner_id AS org_id, COUNT(DISTINCT(repository.id)) as repo_count"). + Table("repository"). + Join("INNER", "org_user", "owner_id = org_user.org_id"). + Where("org_user.uid = ?", user.ID). + And(builder.Or( + builder.Eq{"repository.is_private": false}, + builder.In("repository.id", builder.Select("repo_id").From("team_repo"). + InnerJoin("team_user", "team_user.team_id = team_repo.team_id"). + Where(builder.Eq{"team_user.uid": user.ID})), + builder.In("repository.id", builder.Select("repo_id").From("collaboration"). + Where(builder.Eq{"user_id": user.ID})), + )). + GroupBy("owner_id").Find(&orgCounts); err != nil { + return nil, err + } + + orgCountMap := make(map[int64]int, len(orgCounts)) + for _, orgCount := range orgCounts { + orgCountMap[orgCount.OrgID] = orgCount.RepoCount + } + + for _, org := range orgs { + org.NumRepos = orgCountMap[org.ID] + } + + return orgs, nil +} diff --git a/models/organization/org_list_test.go b/models/organization/org_list_test.go new file mode 100644 index 0000000000..619427a719 --- /dev/null +++ b/models/organization/org_list_test.go @@ -0,0 +1,105 @@ +// Copyright 2024 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package organization_test + +import ( + "slices" + "strings" + "testing" + + "forgejo.org/models/db" + "forgejo.org/models/organization" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestCountOrganizations(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + expected, err := db.GetEngine(db.DefaultContext).Where("type=?", user_model.UserTypeOrganization).Count(&organization.Organization{}) + require.NoError(t, err) + cnt, err := db.Count[organization.Organization](db.DefaultContext, organization.FindOrgOptions{IncludePrivate: true}) + require.NoError(t, err) + assert.Equal(t, expected, cnt) +} + +func TestFindOrgs(t *testing.T) { + defer unittest.OverrideFixtures("models/organization/TestFindOrgs")() + require.NoError(t, unittest.PrepareTestDatabase()) + + orgs, err := db.Find[organization.Organization](db.DefaultContext, organization.FindOrgOptions{ + UserID: 4, + IncludePrivate: true, + }) + require.NoError(t, err) + if assert.Len(t, orgs, 2) { + if orgs[0].ID == 22 { + assert.EqualValues(t, 22, orgs[0].ID) + assert.EqualValues(t, 3, orgs[1].ID) + } else { + assert.EqualValues(t, 3, orgs[0].ID) + assert.EqualValues(t, 22, orgs[1].ID) + } + } + + orgs, err = db.Find[organization.Organization](db.DefaultContext, organization.FindOrgOptions{ + UserID: 4, + IncludePrivate: false, + }) + require.NoError(t, err) + assert.Empty(t, orgs) + + total, err := db.Count[organization.Organization](db.DefaultContext, organization.FindOrgOptions{ + UserID: 4, + IncludePrivate: true, + }) + require.NoError(t, err) + assert.EqualValues(t, 2, total) + + total, err = db.Count[organization.Organization](db.DefaultContext, organization.FindOrgOptions{ + UserID: 4, + IncludePrivate: false, + IncludeLimited: true, + }) + require.NoError(t, err) + assert.EqualValues(t, 1, total) +} + +func TestGetOrgsCanCreateRepoByUserID(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + orgs, err := organization.GetOrgsCanCreateRepoByUserID(db.DefaultContext, 2) + require.NoError(t, err) + assert.Len(t, orgs, 1) + assert.EqualValues(t, 3, orgs[0].ID) + orgs, err = organization.GetOrgsCanCreateRepoByUserID(db.DefaultContext, 1) + require.NoError(t, err) + assert.Len(t, orgs, 2) + assert.EqualValues(t, 36, orgs[0].ID) + assert.EqualValues(t, 35, orgs[1].ID) +} + +func TestGetUserOrgsList(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + orgs, err := organization.GetUserOrgsList(db.DefaultContext, &user_model.User{ID: 4}) + require.NoError(t, err) + if assert.Len(t, orgs, 1) { + assert.EqualValues(t, 3, orgs[0].ID) + // repo_id: 3 is in the team, 32 is public, 5 is private with no team + assert.EqualValues(t, 2, orgs[0].NumRepos) + } +} + +func TestGetUserOrgsListSorting(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + orgs, err := organization.GetUserOrgsList(db.DefaultContext, &user_model.User{ID: 1}) + require.NoError(t, err) + + isSorted := slices.IsSortedFunc(orgs, func(a, b *organization.MinimalOrg) int { + return strings.Compare(strings.ToLower(a.Name), strings.ToLower(b.Name)) + }) + + assert.True(t, isSorted) +} diff --git a/models/organization/org_repo.go b/models/organization/org_repo.go index f7e59928f4..f190a38bda 100644 --- a/models/organization/org_repo.go +++ b/models/organization/org_repo.go @@ -6,8 +6,8 @@ package organization import ( "context" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" ) // GetOrgRepositories get repos belonging to the given organization diff --git a/models/organization/org_test.go b/models/organization/org_test.go index fa4c512189..212b893a42 100644 --- a/models/organization/org_test.go +++ b/models/organization/org_test.go @@ -4,14 +4,17 @@ package organization_test import ( + "sort" "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/organization" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/structs" + "forgejo.org/models/db" + "forgejo.org/models/organization" + "forgejo.org/models/perm" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unit" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/structs" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -104,7 +107,7 @@ func TestUser_GetTeams(t *testing.T) { func TestUser_GetMembers(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3}) - members, _, err := org.GetMembers(db.DefaultContext) + members, _, err := org.GetMembers(db.DefaultContext, &user_model.User{IsAdmin: true}) require.NoError(t, err) if assert.Len(t, members, 3) { assert.Equal(t, int64(2), members[0].ID) @@ -128,15 +131,6 @@ func TestGetOrgByName(t *testing.T) { assert.True(t, organization.IsErrOrgNotExist(err)) } -func TestCountOrganizations(t *testing.T) { - require.NoError(t, unittest.PrepareTestDatabase()) - expected, err := db.GetEngine(db.DefaultContext).Where("type=?", user_model.UserTypeOrganization).Count(&organization.Organization{}) - require.NoError(t, err) - cnt, err := db.Count[organization.Organization](db.DefaultContext, organization.FindOrgOptions{IncludePrivate: true}) - require.NoError(t, err) - assert.Equal(t, expected, cnt) -} - func TestIsOrganizationOwner(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) test := func(orgID, userID int64, expected bool) { @@ -181,67 +175,45 @@ func TestIsPublicMembership(t *testing.T) { test(unittest.NonexistentID, unittest.NonexistentID, false) } -func TestFindOrgs(t *testing.T) { - require.NoError(t, unittest.PrepareTestDatabase()) - - orgs, err := db.Find[organization.Organization](db.DefaultContext, organization.FindOrgOptions{ - UserID: 4, - IncludePrivate: true, - }) - require.NoError(t, err) - if assert.Len(t, orgs, 1) { - assert.EqualValues(t, 3, orgs[0].ID) - } - - orgs, err = db.Find[organization.Organization](db.DefaultContext, organization.FindOrgOptions{ - UserID: 4, - IncludePrivate: false, - }) - require.NoError(t, err) - assert.Empty(t, orgs) - - total, err := db.Count[organization.Organization](db.DefaultContext, organization.FindOrgOptions{ - UserID: 4, - IncludePrivate: true, - }) - require.NoError(t, err) - assert.EqualValues(t, 1, total) -} - func TestGetOrgUsersByOrgID(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) - orgUsers, err := organization.GetOrgUsersByOrgID(db.DefaultContext, &organization.FindOrgMembersOpts{ - ListOptions: db.ListOptions{}, - OrgID: 3, - PublicOnly: false, - }) - require.NoError(t, err) - if assert.Len(t, orgUsers, 3) { - assert.Equal(t, organization.OrgUser{ - ID: orgUsers[0].ID, - OrgID: 3, - UID: 2, - IsPublic: true, - }, *orgUsers[0]) - assert.Equal(t, organization.OrgUser{ - ID: orgUsers[1].ID, - OrgID: 3, - UID: 4, - IsPublic: false, - }, *orgUsers[1]) - assert.Equal(t, organization.OrgUser{ - ID: orgUsers[2].ID, - OrgID: 3, - UID: 28, - IsPublic: true, - }, *orgUsers[2]) + opts := &organization.FindOrgMembersOpts{ + Doer: &user_model.User{IsAdmin: true}, + OrgID: 3, } + assert.False(t, opts.PublicOnly()) + orgUsers, err := organization.GetOrgUsersByOrgID(db.DefaultContext, opts) + require.NoError(t, err) + sort.Slice(orgUsers, func(i, j int) bool { + return orgUsers[i].ID < orgUsers[j].ID + }) + assert.EqualValues(t, []*organization.OrgUser{{ + ID: 1, + OrgID: 3, + UID: 2, + IsPublic: true, + }, { + ID: 2, + OrgID: 3, + UID: 4, + IsPublic: false, + }, { + ID: 9, + OrgID: 3, + UID: 28, + IsPublic: true, + }}, orgUsers) + + opts = &organization.FindOrgMembersOpts{OrgID: 3} + assert.True(t, opts.PublicOnly()) + orgUsers, err = organization.GetOrgUsersByOrgID(db.DefaultContext, opts) + require.NoError(t, err) + assert.Len(t, orgUsers, 2) orgUsers, err = organization.GetOrgUsersByOrgID(db.DefaultContext, &organization.FindOrgMembersOpts{ ListOptions: db.ListOptions{}, OrgID: unittest.NonexistentID, - PublicOnly: false, }) require.NoError(t, err) assert.Empty(t, orgUsers) @@ -299,8 +271,8 @@ func TestAccessibleReposEnv_RepoIDs(t *testing.T) { require.NoError(t, err) assert.Equal(t, expectedRepoIDs, repoIDs) } - testSuccess(2, []int64{3, 5, 32}) - testSuccess(4, []int64{3, 32}) + testSuccess(2, []int64{32, 5, 3}) + testSuccess(4, []int64{32, 3}) } func TestAccessibleReposEnv_Repos(t *testing.T) { @@ -318,8 +290,8 @@ func TestAccessibleReposEnv_Repos(t *testing.T) { } assert.Equal(t, expectedRepos, repos) } - testSuccess(2, []int64{3, 5, 32}) - testSuccess(4, []int64{3, 32}) + testSuccess(2, []int64{32, 5, 3}) + testSuccess(4, []int64{32, 3}) } func TestAccessibleReposEnv_MirrorRepos(t *testing.T) { @@ -512,3 +484,35 @@ func TestCreateOrganization4(t *testing.T) { assert.True(t, db.IsErrNameReserved(err)) unittest.CheckConsistencyFor(t, &organization.Organization{}, &organization.Team{}) } + +func TestUnitPermission(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + publicOrg := &organization.Organization{ID: 1001, Visibility: structs.VisibleTypePublic} + limitedOrg := &organization.Organization{ID: 1001, Visibility: structs.VisibleTypeLimited} + privateOrg := &organization.Organization{ID: 1001, Visibility: structs.VisibleTypePrivate} + user := &user_model.User{ID: 1001} + t.Run("Anonymous", func(t *testing.T) { + t.Run("Public", func(t *testing.T) { + assert.EqualValues(t, perm.AccessModeRead, publicOrg.UnitPermission(db.DefaultContext, nil, unit.TypeCode)) + }) + t.Run("Limited", func(t *testing.T) { + assert.EqualValues(t, perm.AccessModeNone, limitedOrg.UnitPermission(db.DefaultContext, nil, unit.TypeCode)) + }) + t.Run("Private", func(t *testing.T) { + assert.EqualValues(t, perm.AccessModeNone, privateOrg.UnitPermission(db.DefaultContext, nil, unit.TypeCode)) + }) + }) + + t.Run("Logged in", func(t *testing.T) { + t.Run("Public", func(t *testing.T) { + assert.EqualValues(t, perm.AccessModeRead, publicOrg.UnitPermission(db.DefaultContext, user, unit.TypeCode)) + }) + t.Run("Limited", func(t *testing.T) { + assert.EqualValues(t, perm.AccessModeRead, limitedOrg.UnitPermission(db.DefaultContext, user, unit.TypeCode)) + }) + t.Run("Private", func(t *testing.T) { + assert.EqualValues(t, perm.AccessModeNone, privateOrg.UnitPermission(db.DefaultContext, user, unit.TypeCode)) + }) + }) +} diff --git a/models/organization/org_user.go b/models/organization/org_user.go index 5fe3a178d2..81671c5cf5 100644 --- a/models/organization/org_user.go +++ b/models/organization/org_user.go @@ -7,10 +7,10 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/perm" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/log" + "forgejo.org/models/db" + "forgejo.org/models/perm" + user_model "forgejo.org/models/user" + "forgejo.org/modules/log" "xorm.io/builder" ) diff --git a/models/organization/org_user_test.go b/models/organization/org_user_test.go index 07d07ce3b8..3f6799e8a1 100644 --- a/models/organization/org_user_test.go +++ b/models/organization/org_user_test.go @@ -7,11 +7,11 @@ import ( "fmt" "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/organization" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/db" + "forgejo.org/models/organization" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -95,7 +95,7 @@ func TestUserListIsPublicMember(t *testing.T) { func testUserListIsPublicMember(t *testing.T, orgID int64, expected map[int64]bool) { org, err := organization.GetOrgByID(db.DefaultContext, orgID) require.NoError(t, err) - _, membersIsPublic, err := org.GetMembers(db.DefaultContext) + _, membersIsPublic, err := org.GetMembers(db.DefaultContext, &user_model.User{IsAdmin: true}) require.NoError(t, err) assert.Equal(t, expected, membersIsPublic) } @@ -122,7 +122,7 @@ func TestUserListIsUserOrgOwner(t *testing.T) { func testUserListIsUserOrgOwner(t *testing.T, orgID int64, expected map[int64]bool) { org, err := organization.GetOrgByID(db.DefaultContext, orgID) require.NoError(t, err) - members, _, err := org.GetMembers(db.DefaultContext) + members, _, err := org.GetMembers(db.DefaultContext, &user_model.User{IsAdmin: true}) require.NoError(t, err) assert.Equal(t, expected, organization.IsUserOrgOwner(db.DefaultContext, members, orgID)) } diff --git a/models/organization/team.go b/models/organization/team.go index 1b737c2d3d..c78eff39fb 100644 --- a/models/organization/team.go +++ b/models/organization/team.go @@ -9,13 +9,13 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/perm" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unit" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/models/perm" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unit" + user_model "forgejo.org/models/user" + "forgejo.org/modules/log" + "forgejo.org/modules/util" "xorm.io/builder" ) @@ -247,24 +247,56 @@ func GetTeamByID(ctx context.Context, teamID int64) (*Team, error) { return t, nil } -// GetTeamNamesByID returns team's lower name from a list of team ids. -func GetTeamNamesByID(ctx context.Context, teamIDs []int64) ([]string, error) { - if len(teamIDs) == 0 { - return []string{}, nil - } - - var teamNames []string - err := db.GetEngine(ctx).Table("team"). - Select("lower_name"). - In("id", teamIDs). - Asc("name"). - Find(&teamNames) - - return teamNames, err -} - // IncrTeamRepoNum increases the number of repos for the given team by 1 func IncrTeamRepoNum(ctx context.Context, teamID int64) error { _, err := db.GetEngine(ctx).Incr("num_repos").ID(teamID).Update(new(Team)) return err } + +// CountInconsistentOwnerTeams returns the amount of owner teams that have all of +// their access modes set to "None". +func CountInconsistentOwnerTeams(ctx context.Context) (int64, error) { + return db.GetEngine(ctx).Table("team"). + Join("INNER", "team_unit", "`team`.id = `team_unit`.team_id"). + Where("`team`.lower_name = ?", strings.ToLower(OwnerTeamName)). + GroupBy("`team_unit`.team_id"). + Having("SUM(`team_unit`.access_mode) = 0"). + Count() +} + +// FixInconsistentOwnerTeams fixes inconsistent owner teams that have all of +// their access modes set to "None", it sets it back to "Owner". +func FixInconsistentOwnerTeams(ctx context.Context) (int64, error) { + teamIDs := []int64{} + if err := db.GetEngine(ctx).Table("team"). + Select("`team`.id"). + Join("INNER", "team_unit", "`team`.id = `team_unit`.team_id"). + Where("`team`.lower_name = ?", strings.ToLower(OwnerTeamName)). + GroupBy("`team_unit`.team_id"). + Having("SUM(`team_unit`.access_mode) = 0"). + Find(&teamIDs); err != nil { + return 0, err + } + + if err := db.Iterate(ctx, builder.In("team_id", teamIDs), func(ctx context.Context, bean *TeamUnit) error { + if bean.Type == unit.TypeExternalTracker || bean.Type == unit.TypeExternalWiki { + bean.AccessMode = perm.AccessModeRead + } else { + bean.AccessMode = perm.AccessModeOwner + } + _, err := db.GetEngine(ctx).ID(bean.ID).Table("team_unit").Cols("access_mode").Update(bean) + return err + }); err != nil { + return 0, err + } + + return int64(len(teamIDs)), nil +} + +func NewGhostTeam() *Team { + return &Team{ + ID: -1, + Name: "Ghost team", + LowerName: "ghost team", + } +} diff --git a/models/organization/team_invite.go b/models/organization/team_invite.go index 17f6c59610..45be6c4c64 100644 --- a/models/organization/team_invite.go +++ b/models/organization/team_invite.go @@ -7,10 +7,10 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + user_model "forgejo.org/models/user" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) diff --git a/models/organization/team_invite_test.go b/models/organization/team_invite_test.go index cbabf79b49..8d55864237 100644 --- a/models/organization/team_invite_test.go +++ b/models/organization/team_invite_test.go @@ -6,10 +6,10 @@ package organization_test import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/organization" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + "forgejo.org/models/organization" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/organization/team_list.go b/models/organization/team_list.go index 5b45429acf..573fd4ef96 100644 --- a/models/organization/team_list.go +++ b/models/organization/team_list.go @@ -7,10 +7,10 @@ import ( "context" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/perm" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unit" + "forgejo.org/models/db" + "forgejo.org/models/perm" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unit" "xorm.io/builder" ) diff --git a/models/organization/team_repo.go b/models/organization/team_repo.go index 1184e39263..334b139808 100644 --- a/models/organization/team_repo.go +++ b/models/organization/team_repo.go @@ -6,9 +6,9 @@ package organization import ( "context" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/perm" - repo_model "code.gitea.io/gitea/models/repo" + "forgejo.org/models/db" + "forgejo.org/models/perm" + repo_model "forgejo.org/models/repo" "xorm.io/builder" ) diff --git a/models/organization/team_test.go b/models/organization/team_test.go index c14c1f181d..1be96b6a01 100644 --- a/models/organization/team_test.go +++ b/models/organization/team_test.go @@ -6,9 +6,10 @@ package organization_test import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/organization" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + "forgejo.org/models/organization" + "forgejo.org/models/perm" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -185,16 +186,43 @@ func TestHasTeamRepo(t *testing.T) { test(2, 5, false) } -func TestUsersInTeamsCount(t *testing.T) { +func TestInconsistentOwnerTeam(t *testing.T) { + defer unittest.OverrideFixtures("models/organization/TestInconsistentOwnerTeam")() require.NoError(t, unittest.PrepareTestDatabase()) - test := func(teamIDs, userIDs []int64, expected int64) { - count, err := organization.UsersInTeamsCount(db.DefaultContext, teamIDs, userIDs) - require.NoError(t, err) - assert.Equal(t, expected, count) - } + unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1000, TeamID: 1000, AccessMode: perm.AccessModeNone}) + unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1001, TeamID: 1000, AccessMode: perm.AccessModeNone}) + unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1002, TeamID: 1000, AccessMode: perm.AccessModeNone}) + unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1003, TeamID: 1000, AccessMode: perm.AccessModeNone}) + unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1004, TeamID: 1000, AccessMode: perm.AccessModeNone}) + unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1005, TeamID: 1000, AccessMode: perm.AccessModeNone}) + unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1006, TeamID: 1000, AccessMode: perm.AccessModeNone}) + unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1007, TeamID: 1000, AccessMode: perm.AccessModeNone}) + unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1008, TeamID: 1000, AccessMode: perm.AccessModeNone}) + unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1009, TeamID: 1000, AccessMode: perm.AccessModeNone}) - test([]int64{2}, []int64{1, 2, 3, 4}, 1) // only userid 2 - test([]int64{1, 2, 3, 4, 5}, []int64{2, 5}, 2) // userid 2,4 - test([]int64{1, 2, 3, 4, 5}, []int64{2, 3, 5}, 3) // userid 2,4,5 + count, err := organization.CountInconsistentOwnerTeams(db.DefaultContext) + require.NoError(t, err) + require.EqualValues(t, 1, count) + + count, err = organization.FixInconsistentOwnerTeams(db.DefaultContext) + require.NoError(t, err) + require.EqualValues(t, 1, count) + + count, err = organization.CountInconsistentOwnerTeams(db.DefaultContext) + require.NoError(t, err) + require.EqualValues(t, 0, count) + + unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1000, AccessMode: perm.AccessModeOwner}) + unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1001, AccessMode: perm.AccessModeOwner}) + unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1002, AccessMode: perm.AccessModeOwner}) + unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1003, AccessMode: perm.AccessModeOwner}) + unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1004, AccessMode: perm.AccessModeOwner}) + unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1007, AccessMode: perm.AccessModeOwner}) + unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1008, AccessMode: perm.AccessModeOwner}) + unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1009, AccessMode: perm.AccessModeOwner}) + + // External wiki and issue + unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1005, AccessMode: perm.AccessModeRead}) + unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1006, AccessMode: perm.AccessModeRead}) } diff --git a/models/organization/team_unit.go b/models/organization/team_unit.go index 3087b70770..b45ac2fc07 100644 --- a/models/organization/team_unit.go +++ b/models/organization/team_unit.go @@ -6,9 +6,9 @@ package organization import ( "context" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/perm" - "code.gitea.io/gitea/models/unit" + "forgejo.org/models/db" + "forgejo.org/models/perm" + "forgejo.org/models/unit" ) // TeamUnit describes all units of a repository @@ -28,24 +28,3 @@ func (t *TeamUnit) Unit() unit.Unit { func getUnitsByTeamID(ctx context.Context, teamID int64) (units []*TeamUnit, err error) { return units, db.GetEngine(ctx).Where("team_id = ?", teamID).Find(&units) } - -// UpdateTeamUnits updates a teams's units -func UpdateTeamUnits(ctx context.Context, team *Team, units []TeamUnit) (err error) { - ctx, committer, err := db.TxContext(ctx) - if err != nil { - return err - } - defer committer.Close() - - if _, err = db.GetEngine(ctx).Where("team_id = ?", team.ID).Delete(new(TeamUnit)); err != nil { - return err - } - - if len(units) > 0 { - if err = db.Insert(ctx, units); err != nil { - return err - } - } - - return committer.Commit() -} diff --git a/models/organization/team_user.go b/models/organization/team_user.go index ab767db200..a954e94767 100644 --- a/models/organization/team_user.go +++ b/models/organization/team_user.go @@ -6,8 +6,8 @@ package organization import ( "context" - "code.gitea.io/gitea/models/db" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + user_model "forgejo.org/models/user" "xorm.io/builder" ) @@ -76,14 +76,3 @@ func GetTeamMembers(ctx context.Context, opts *SearchMembersOptions) ([]*user_mo func IsUserInTeams(ctx context.Context, userID int64, teamIDs []int64) (bool, error) { return db.GetEngine(ctx).Where("uid=?", userID).In("team_id", teamIDs).Exist(new(TeamUser)) } - -// UsersInTeamsCount counts the number of users which are in userIDs and teamIDs -func UsersInTeamsCount(ctx context.Context, userIDs, teamIDs []int64) (int64, error) { - var ids []int64 - if err := db.GetEngine(ctx).In("uid", userIDs).In("team_id", teamIDs). - Table("team_user"). - Cols("uid").GroupBy("uid").Find(&ids); err != nil { - return 0, err - } - return int64(len(ids)), nil -} diff --git a/models/packages/alpine/search.go b/models/packages/alpine/search.go index 77eccb90ed..1cc808d18d 100644 --- a/models/packages/alpine/search.go +++ b/models/packages/alpine/search.go @@ -6,8 +6,8 @@ package alpine import ( "context" - packages_model "code.gitea.io/gitea/models/packages" - alpine_module "code.gitea.io/gitea/modules/packages/alpine" + packages_model "forgejo.org/models/packages" + alpine_module "forgejo.org/modules/packages/alpine" ) // GetBranches gets all available branches diff --git a/models/packages/alt/search.go b/models/packages/alt/search.go new file mode 100644 index 0000000000..0bfba77e0e --- /dev/null +++ b/models/packages/alt/search.go @@ -0,0 +1,29 @@ +// Copyright 2024 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package alt + +import ( + "context" + + packages_model "forgejo.org/models/packages" + rpm_module "forgejo.org/modules/packages/rpm" +) + +type PackageSearchOptions struct { + OwnerID int64 + GroupID int64 + Architecture string +} + +// GetGroups gets all available groups +func GetGroups(ctx context.Context, ownerID int64) ([]string, error) { + return packages_model.GetDistinctPropertyValues( + ctx, + packages_model.TypeAlt, + ownerID, + packages_model.PropertyTypeFile, + rpm_module.PropertyGroup, + nil, + ) +} diff --git a/models/packages/conan/references.go b/models/packages/conan/references.go index 0d888a1ec8..5e09c4b63f 100644 --- a/models/packages/conan/references.go +++ b/models/packages/conan/references.go @@ -8,11 +8,11 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/packages" - conan_module "code.gitea.io/gitea/modules/packages/conan" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/models/packages" + conan_module "forgejo.org/modules/packages/conan" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) diff --git a/models/packages/conan/search.go b/models/packages/conan/search.go index ab0bff5968..3ef8b4cceb 100644 --- a/models/packages/conan/search.go +++ b/models/packages/conan/search.go @@ -9,10 +9,10 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/packages" - "code.gitea.io/gitea/modules/container" - conan_module "code.gitea.io/gitea/modules/packages/conan" + "forgejo.org/models/db" + "forgejo.org/models/packages" + "forgejo.org/modules/container" + conan_module "forgejo.org/modules/packages/conan" "xorm.io/builder" ) diff --git a/models/packages/conda/search.go b/models/packages/conda/search.go index 887441e3b2..147de1aa02 100644 --- a/models/packages/conda/search.go +++ b/models/packages/conda/search.go @@ -7,9 +7,9 @@ import ( "context" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/packages" - conda_module "code.gitea.io/gitea/modules/packages/conda" + "forgejo.org/models/db" + "forgejo.org/models/packages" + conda_module "forgejo.org/modules/packages/conda" "xorm.io/builder" ) diff --git a/models/packages/container/search.go b/models/packages/container/search.go index 5df35117ce..1dab7c7b79 100644 --- a/models/packages/container/search.go +++ b/models/packages/container/search.go @@ -8,11 +8,11 @@ import ( "strings" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/packages" - user_model "code.gitea.io/gitea/models/user" - container_module "code.gitea.io/gitea/modules/packages/container" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/models/packages" + user_model "forgejo.org/models/user" + container_module "forgejo.org/modules/packages/container" + "forgejo.org/modules/util" "xorm.io/builder" ) diff --git a/models/packages/cran/search.go b/models/packages/cran/search.go index 8a8b52a35e..35525dfd55 100644 --- a/models/packages/cran/search.go +++ b/models/packages/cran/search.go @@ -8,9 +8,9 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/packages" - cran_module "code.gitea.io/gitea/modules/packages/cran" + "forgejo.org/models/db" + "forgejo.org/models/packages" + cran_module "forgejo.org/modules/packages/cran" "xorm.io/builder" ) diff --git a/models/packages/debian/search.go b/models/packages/debian/search.go index 77c4a18462..a434a06d2a 100644 --- a/models/packages/debian/search.go +++ b/models/packages/debian/search.go @@ -7,9 +7,10 @@ import ( "context" "strconv" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/packages" - debian_module "code.gitea.io/gitea/modules/packages/debian" + "forgejo.org/models/db" + "forgejo.org/models/packages" + debian_module "forgejo.org/modules/packages/debian" + "forgejo.org/modules/setting" "xorm.io/builder" ) @@ -76,25 +77,41 @@ func ExistPackages(ctx context.Context, opts *PackageSearchOptions) (bool, error // SearchPackages gets the packages matching the search options func SearchPackages(ctx context.Context, opts *PackageSearchOptions, iter func(*packages.PackageFileDescriptor)) error { - return db.GetEngine(ctx). - Table("package_file"). - Select("package_file.*"). - Join("INNER", "package_version", "package_version.id = package_file.version_id"). - Join("INNER", "package", "package.id = package_version.package_id"). - Where(opts.toCond()). - Asc("package.lower_name", "package_version.created_unix"). - Iterate(new(packages.PackageFile), func(_ int, bean any) error { - pf := bean.(*packages.PackageFile) + var start int + batchSize := setting.Database.IterateBufferSize + for { + select { + case <-ctx.Done(): + return ctx.Err() + default: + beans := make([]*packages.PackageFile, 0, batchSize) - pfd, err := packages.GetPackageFileDescriptor(ctx, pf) - if err != nil { + if err := db.GetEngine(ctx). + Table("package_file"). + Select("package_file.*"). + Join("INNER", "package_version", "package_version.id = package_file.version_id"). + Join("INNER", "package", "package.id = package_version.package_id"). + Where(opts.toCond()). + Asc("package.lower_name", "package_version.created_unix"). + Limit(batchSize, start). + Find(&beans); err != nil { return err } + if len(beans) == 0 { + return nil + } + start += len(beans) - iter(pfd) + for _, bean := range beans { + pfd, err := packages.GetPackageFileDescriptor(ctx, bean) + if err != nil { + return err + } - return nil - }) + iter(pfd) + } + } + } } // GetDistributions gets all available distributions diff --git a/models/packages/debian/search_test.go b/models/packages/debian/search_test.go new file mode 100644 index 0000000000..b8ed98d8fa --- /dev/null +++ b/models/packages/debian/search_test.go @@ -0,0 +1,94 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package debian + +import ( + "strings" + "testing" + + "forgejo.org/models/db" + packages_model "forgejo.org/models/packages" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/packages" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" + packages_service "forgejo.org/services/packages" + + _ "forgejo.org/models" + _ "forgejo.org/models/actions" + _ "forgejo.org/models/activities" + _ "forgejo.org/models/forgefed" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestMain(m *testing.M) { + unittest.MainTest(m) +} + +func preparePackage(t *testing.T, owner *user_model.User, name string) { + t.Helper() + + data, err := packages.CreateHashedBufferFromReader(strings.NewReader("data")) + require.NoError(t, err) + + _, _, err = packages_service.CreatePackageOrAddFileToExisting( + db.DefaultContext, + &packages_service.PackageCreationInfo{ + PackageInfo: packages_service.PackageInfo{ + Owner: owner, + PackageType: packages_model.TypeDebian, + Name: name, + }, + Creator: owner, + }, + &packages_service.PackageFileCreationInfo{ + PackageFileInfo: packages_service.PackageFileInfo{ + Filename: name, + }, + Data: data, + Creator: owner, + IsLead: true, + }, + ) + + require.NoError(t, err) +} + +func TestSearchPackages(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + defer test.MockVariableValue(&setting.Database.IterateBufferSize, 1)() + + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + user3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}) + + preparePackage(t, user2, "debian-1") + preparePackage(t, user2, "debian-2") + preparePackage(t, user3, "debian-1") + + packageFiles := []string{} + require.NoError(t, SearchPackages(db.DefaultContext, &PackageSearchOptions{ + OwnerID: user2.ID, + }, func(pfd *packages_model.PackageFileDescriptor) { + assert.NotNil(t, pfd) + packageFiles = append(packageFiles, pfd.File.Name) + })) + + assert.Len(t, packageFiles, 2) + assert.Contains(t, packageFiles, "debian-1") + assert.Contains(t, packageFiles, "debian-2") + + packageFiles = []string{} + require.NoError(t, SearchPackages(db.DefaultContext, &PackageSearchOptions{ + OwnerID: user3.ID, + }, func(pfd *packages_model.PackageFileDescriptor) { + assert.NotNil(t, pfd) + packageFiles = append(packageFiles, pfd.File.Name) + })) + + assert.Len(t, packageFiles, 1) + assert.Contains(t, packageFiles, "debian-1") +} diff --git a/models/packages/descriptor.go b/models/packages/descriptor.go index 803b73c968..19e0e8f5d5 100644 --- a/models/packages/descriptor.go +++ b/models/packages/descriptor.go @@ -9,30 +9,30 @@ import ( "fmt" "net/url" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/packages/alpine" - "code.gitea.io/gitea/modules/packages/arch" - "code.gitea.io/gitea/modules/packages/cargo" - "code.gitea.io/gitea/modules/packages/chef" - "code.gitea.io/gitea/modules/packages/composer" - "code.gitea.io/gitea/modules/packages/conan" - "code.gitea.io/gitea/modules/packages/conda" - "code.gitea.io/gitea/modules/packages/container" - "code.gitea.io/gitea/modules/packages/cran" - "code.gitea.io/gitea/modules/packages/debian" - "code.gitea.io/gitea/modules/packages/helm" - "code.gitea.io/gitea/modules/packages/maven" - "code.gitea.io/gitea/modules/packages/npm" - "code.gitea.io/gitea/modules/packages/nuget" - "code.gitea.io/gitea/modules/packages/pub" - "code.gitea.io/gitea/modules/packages/pypi" - "code.gitea.io/gitea/modules/packages/rpm" - "code.gitea.io/gitea/modules/packages/rubygems" - "code.gitea.io/gitea/modules/packages/swift" - "code.gitea.io/gitea/modules/packages/vagrant" - "code.gitea.io/gitea/modules/util" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/json" + "forgejo.org/modules/packages/alpine" + "forgejo.org/modules/packages/arch" + "forgejo.org/modules/packages/cargo" + "forgejo.org/modules/packages/chef" + "forgejo.org/modules/packages/composer" + "forgejo.org/modules/packages/conan" + "forgejo.org/modules/packages/conda" + "forgejo.org/modules/packages/container" + "forgejo.org/modules/packages/cran" + "forgejo.org/modules/packages/debian" + "forgejo.org/modules/packages/helm" + "forgejo.org/modules/packages/maven" + "forgejo.org/modules/packages/npm" + "forgejo.org/modules/packages/nuget" + "forgejo.org/modules/packages/pub" + "forgejo.org/modules/packages/pypi" + "forgejo.org/modules/packages/rpm" + "forgejo.org/modules/packages/rubygems" + "forgejo.org/modules/packages/swift" + "forgejo.org/modules/packages/vagrant" + "forgejo.org/modules/util" "github.com/hashicorp/go-version" ) @@ -110,9 +110,12 @@ func GetPackageDescriptor(ctx context.Context, pv *PackageVersion) (*PackageDesc if err != nil { return nil, err } - repository, err := repo_model.GetRepositoryByID(ctx, p.RepoID) - if err != nil && !repo_model.IsErrRepoNotExist(err) { - return nil, err + var repository *repo_model.Repository + if p.RepoID > 0 { + repository, err = repo_model.GetRepositoryByID(ctx, p.RepoID) + if err != nil && !repo_model.IsErrRepoNotExist(err) { + return nil, err + } } creator, err := user_model.GetUserByID(ctx, pv.CreatorID) if err != nil { @@ -187,6 +190,8 @@ func GetPackageDescriptor(ctx context.Context, pv *PackageVersion) (*PackageDesc metadata = &pypi.Metadata{} case TypeRpm: metadata = &rpm.VersionMetadata{} + case TypeAlt: + metadata = &rpm.VersionMetadata{} case TypeRubyGems: metadata = &rubygems.Metadata{} case TypeSwift: diff --git a/models/packages/main_test.go b/models/packages/main_test.go new file mode 100644 index 0000000000..f9083d705d --- /dev/null +++ b/models/packages/main_test.go @@ -0,0 +1,19 @@ +// Copyright 2020 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package packages + +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/models/packages/nuget/search.go b/models/packages/nuget/search.go index 7a505ff08f..af83c27c66 100644 --- a/models/packages/nuget/search.go +++ b/models/packages/nuget/search.go @@ -7,8 +7,8 @@ import ( "context" "strings" - "code.gitea.io/gitea/models/db" - packages_model "code.gitea.io/gitea/models/packages" + "forgejo.org/models/db" + packages_model "forgejo.org/models/packages" "xorm.io/builder" ) diff --git a/models/packages/package.go b/models/packages/package.go index 364cc2e7cc..3b01d0b1ea 100644 --- a/models/packages/package.go +++ b/models/packages/package.go @@ -9,8 +9,8 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/util" "xorm.io/builder" "xorm.io/xorm" @@ -51,6 +51,7 @@ const ( TypePub Type = "pub" TypePyPI Type = "pypi" TypeRpm Type = "rpm" + TypeAlt Type = "alt" TypeRubyGems Type = "rubygems" TypeSwift Type = "swift" TypeVagrant Type = "vagrant" @@ -76,6 +77,7 @@ var TypeList = []Type{ TypePub, TypePyPI, TypeRpm, + TypeAlt, TypeRubyGems, TypeSwift, TypeVagrant, @@ -122,6 +124,8 @@ func (pt Type) Name() string { return "PyPI" case TypeRpm: return "RPM" + case TypeAlt: + return "Alt" case TypeRubyGems: return "RubyGems" case TypeSwift: @@ -173,6 +177,8 @@ func (pt Type) SVGName() string { return "gitea-python" case TypeRpm: return "gitea-rpm" + case TypeAlt: + return "gitea-alt" case TypeRubyGems: return "gitea-rubygems" case TypeSwift: @@ -236,6 +242,11 @@ func SetRepositoryLink(ctx context.Context, packageID, repoID int64) error { return err } +func UnlinkRepository(ctx context.Context, packageID int64) error { + _, err := db.GetEngine(ctx).ID(packageID).Cols("repo_id").Update(&Package{RepoID: 0}) + return err +} + // UnlinkRepositoryFromAllPackages unlinks every package from the repository func UnlinkRepositoryFromAllPackages(ctx context.Context, repoID int64) error { _, err := db.GetEngine(ctx).Where("repo_id = ?", repoID).Cols("repo_id").Update(&Package{}) diff --git a/models/packages/package_blob.go b/models/packages/package_blob.go index d9c30b6533..0de4434ef8 100644 --- a/models/packages/package_blob.go +++ b/models/packages/package_blob.go @@ -8,13 +8,13 @@ import ( "strconv" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/perm" - "code.gitea.io/gitea/models/unit" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/models/perm" + "forgejo.org/models/unit" + user_model "forgejo.org/models/user" + "forgejo.org/modules/structs" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) @@ -34,6 +34,7 @@ type PackageBlob struct { HashSHA1 string `xorm:"hash_sha1 char(40) UNIQUE(sha1) INDEX NOT NULL"` HashSHA256 string `xorm:"hash_sha256 char(64) UNIQUE(sha256) INDEX NOT NULL"` HashSHA512 string `xorm:"hash_sha512 char(128) UNIQUE(sha512) INDEX NOT NULL"` + HashBlake2b string `xorm:"hash_blake2b char(128) UNIQUE(blake2b) INDEX"` CreatedUnix timeutil.TimeStamp `xorm:"created INDEX NOT NULL"` } @@ -43,13 +44,19 @@ func GetOrInsertBlob(ctx context.Context, pb *PackageBlob) (*PackageBlob, bool, existing := &PackageBlob{} - has, err := e.Where(builder.Eq{ - "size": pb.Size, - "hash_md5": pb.HashMD5, - "hash_sha1": pb.HashSHA1, - "hash_sha256": pb.HashSHA256, - "hash_sha512": pb.HashSHA512, - }).Get(existing) + has, err := e.Where(builder.And( + builder.Eq{ + "size": pb.Size, + "hash_md5": pb.HashMD5, + "hash_sha1": pb.HashSHA1, + "hash_sha256": pb.HashSHA256, + "hash_sha512": pb.HashSHA512, + }, + builder.Or( + builder.Eq{"hash_blake2b": pb.HashBlake2b}, + builder.IsNull{"hash_blake2b"}, + ), + )).Get(existing) if err != nil { return nil, false, err } diff --git a/models/packages/package_blob_test.go b/models/packages/package_blob_test.go new file mode 100644 index 0000000000..664dfa4d81 --- /dev/null +++ b/models/packages/package_blob_test.go @@ -0,0 +1,64 @@ +// Copyright 2025 The Forgejo Authors. +// SPDX-License-Identifier: GPL-3.0-or-later + +package packages + +import ( + "testing" + + "forgejo.org/models/unittest" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestPackagesGetOrInsertBlob(t *testing.T) { + defer unittest.OverrideFixtures("models/fixtures/TestPackagesGetOrInsertBlob")() + require.NoError(t, unittest.PrepareTestDatabase()) + + blake2bIsSet := unittest.AssertExistsAndLoadBean(t, &PackageBlob{ID: 1}) + blake2bNotSet := unittest.AssertExistsAndLoadBean(t, &PackageBlob{ID: 2}) + + blake2bSetToRandom := *blake2bNotSet + blake2bSetToRandom.HashBlake2b = "SOMETHING RANDOM" + + for _, testCase := range []struct { + name string + exists bool + packageBlob *PackageBlob + }{ + { + name: "exists and blake2b is not null in the database", + exists: true, + packageBlob: blake2bIsSet, + }, + { + name: "exists and blake2b is null in the database", + exists: true, + packageBlob: &blake2bSetToRandom, + }, + { + name: "does not exists", + exists: false, + packageBlob: &PackageBlob{ + Size: 30, + HashMD5: "HASHMD5_3", + HashSHA1: "HASHSHA1_3", + HashSHA256: "HASHSHA256_3", + HashSHA512: "HASHSHA512_3", + HashBlake2b: "HASHBLAKE2B_3", + }, + }, + } { + t.Run(testCase.name, func(t *testing.T) { + found, has, _ := GetOrInsertBlob(t.Context(), testCase.packageBlob) + assert.Equal(t, testCase.exists, has) + require.NotNil(t, found) + if testCase.exists { + assert.Equal(t, found.ID, testCase.packageBlob.ID) + } else { + unittest.BeanExists(t, &PackageBlob{ID: found.ID}) + } + }) + } +} diff --git a/models/packages/package_blob_upload.go b/models/packages/package_blob_upload.go index 4b0e789221..ddffb6c305 100644 --- a/models/packages/package_blob_upload.go +++ b/models/packages/package_blob_upload.go @@ -8,9 +8,9 @@ import ( "strings" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" ) // ErrPackageBlobUploadNotExist indicates a package blob upload not exist error diff --git a/models/packages/package_cleanup_rule.go b/models/packages/package_cleanup_rule.go index fa12dec406..d0765c8492 100644 --- a/models/packages/package_cleanup_rule.go +++ b/models/packages/package_cleanup_rule.go @@ -8,9 +8,9 @@ import ( "fmt" "regexp" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) diff --git a/models/packages/package_file.go b/models/packages/package_file.go index 1bb6b57a34..d4bcc2859a 100644 --- a/models/packages/package_file.go +++ b/models/packages/package_file.go @@ -9,9 +9,9 @@ import ( "strings" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) diff --git a/models/packages/package_property.go b/models/packages/package_property.go index e0170016cf..c4e7be342b 100644 --- a/models/packages/package_property.go +++ b/models/packages/package_property.go @@ -6,7 +6,7 @@ package packages import ( "context" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" "xorm.io/builder" ) diff --git a/models/packages/package_test.go b/models/packages/package_test.go index 1c96e08f0c..3c1ec413fd 100644 --- a/models/packages/package_test.go +++ b/models/packages/package_test.go @@ -7,23 +7,15 @@ package packages_test import ( "testing" - "code.gitea.io/gitea/models/db" - packages_model "code.gitea.io/gitea/models/packages" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" - - _ "code.gitea.io/gitea/models" - _ "code.gitea.io/gitea/models/actions" - _ "code.gitea.io/gitea/models/activities" + "forgejo.org/models/db" + packages_model "forgejo.org/models/packages" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" "github.com/stretchr/testify/require" ) -func TestMain(m *testing.M) { - unittest.MainTest(m) -} - func prepareExamplePackage(t *testing.T) *packages_model.Package { require.NoError(t, unittest.PrepareTestDatabase()) diff --git a/models/packages/package_version.go b/models/packages/package_version.go index 278e8e3a86..79086ff1ad 100644 --- a/models/packages/package_version.go +++ b/models/packages/package_version.go @@ -8,10 +8,10 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/optional" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) diff --git a/models/packages/rpm/search.go b/models/packages/rpm/search.go index e697421b49..d4f065a89e 100644 --- a/models/packages/rpm/search.go +++ b/models/packages/rpm/search.go @@ -6,8 +6,8 @@ package rpm import ( "context" - packages_model "code.gitea.io/gitea/models/packages" - rpm_module "code.gitea.io/gitea/modules/packages/rpm" + packages_model "forgejo.org/models/packages" + rpm_module "forgejo.org/modules/packages/rpm" ) // GetGroups gets all available groups diff --git a/models/perm/access/access.go b/models/perm/access/access.go index 3e2568b4b4..76b547f772 100644 --- a/models/perm/access/access.go +++ b/models/perm/access/access.go @@ -8,11 +8,11 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/organization" - "code.gitea.io/gitea/models/perm" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + "forgejo.org/models/organization" + "forgejo.org/models/perm" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" "xorm.io/builder" ) diff --git a/models/perm/access/access_test.go b/models/perm/access/access_test.go index 556f51311c..00939bced6 100644 --- a/models/perm/access/access_test.go +++ b/models/perm/access/access_test.go @@ -6,12 +6,12 @@ package access_test import ( "testing" - "code.gitea.io/gitea/models/db" - perm_model "code.gitea.io/gitea/models/perm" - access_model "code.gitea.io/gitea/models/perm/access" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + perm_model "forgejo.org/models/perm" + access_model "forgejo.org/models/perm/access" + 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" diff --git a/models/perm/access/main_test.go b/models/perm/access/main_test.go index 0a350dc41e..0c27d022e0 100644 --- a/models/perm/access/main_test.go +++ b/models/perm/access/main_test.go @@ -6,13 +6,14 @@ package access_test import ( "testing" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/unittest" - _ "code.gitea.io/gitea/models" - _ "code.gitea.io/gitea/models/actions" - _ "code.gitea.io/gitea/models/activities" - _ "code.gitea.io/gitea/models/repo" - _ "code.gitea.io/gitea/models/user" + _ "forgejo.org/models" + _ "forgejo.org/models/actions" + _ "forgejo.org/models/activities" + _ "forgejo.org/models/forgefed" + _ "forgejo.org/models/repo" + _ "forgejo.org/models/user" ) func TestMain(m *testing.M) { diff --git a/models/perm/access/repo_permission.go b/models/perm/access/repo_permission.go index 7e39627a75..ce9963b83a 100644 --- a/models/perm/access/repo_permission.go +++ b/models/perm/access/repo_permission.go @@ -7,13 +7,13 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/organization" - perm_model "code.gitea.io/gitea/models/perm" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unit" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/log" + "forgejo.org/models/db" + "forgejo.org/models/organization" + perm_model "forgejo.org/models/perm" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unit" + user_model "forgejo.org/models/user" + "forgejo.org/modules/log" ) // Permission contains all the permissions related variables to a repository for a user diff --git a/models/project/column.go b/models/project/column.go index 222f448599..52917cb9fd 100644 --- a/models/project/column.go +++ b/models/project/column.go @@ -9,10 +9,10 @@ import ( "fmt" "regexp" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) @@ -57,20 +57,6 @@ func (Column) TableName() string { return "project_board" // TODO: the legacy table name should be project_column } -// NumIssues return counter of all issues assigned to the column -func (c *Column) NumIssues(ctx context.Context) int { - total, err := db.GetEngine(ctx).Table("project_issue"). - Where("project_id=?", c.ProjectID). - And("project_board_id=?", c.ID). - GroupBy("issue_id"). - Cols("issue_id"). - Count() - if err != nil { - return 0 - } - return int(total) -} - func (c *Column) GetIssues(ctx context.Context) ([]*ProjectIssue, error) { issues := make([]*ProjectIssue, 0, 5) if err := db.GetEngine(ctx).Where("project_id=?", c.ProjectID). @@ -305,22 +291,11 @@ func SetDefaultColumn(ctx context.Context, projectID, columnID int64) error { }) } -// UpdateColumnSorting update project column sorting -func UpdateColumnSorting(ctx context.Context, cl ColumnList) error { - return db.WithTx(ctx, func(ctx context.Context) error { - for i := range cl { - if _, err := db.GetEngine(ctx).ID(cl[i].ID).Cols( - "sorting", - ).Update(cl[i]); err != nil { - return err - } - } - return nil - }) -} - func GetColumnsByIDs(ctx context.Context, projectID int64, columnsIDs []int64) (ColumnList, error) { columns := make([]*Column, 0, 5) + if len(columnsIDs) == 0 { + return columns, nil + } if err := db.GetEngine(ctx). Where("project_id =?", projectID). In("id", columnsIDs). diff --git a/models/project/column_test.go b/models/project/column_test.go index b02a5b540f..2ef27de3b5 100644 --- a/models/project/column_test.go +++ b/models/project/column_test.go @@ -5,11 +5,10 @@ package project import ( "fmt" - "strings" "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -124,5 +123,5 @@ func Test_NewColumn(t *testing.T) { ProjectID: project1.ID, }) require.Error(t, err) - assert.True(t, strings.Contains(err.Error(), "maximum number of columns reached")) + assert.Contains(t, err.Error(), "maximum number of columns reached") } diff --git a/models/project/issue.go b/models/project/issue.go index 3361b533b9..9e9db19004 100644 --- a/models/project/issue.go +++ b/models/project/issue.go @@ -7,9 +7,9 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/log" + "forgejo.org/modules/util" ) // ProjectIssue saves relation from issue to a project @@ -34,20 +34,6 @@ func deleteProjectIssuesByProjectID(ctx context.Context, projectID int64) error return err } -// NumIssues return counter of all issues assigned to a project -func (p *Project) NumIssues(ctx context.Context) int { - c, err := db.GetEngine(ctx).Table("project_issue"). - Where("project_id=?", p.ID). - GroupBy("issue_id"). - Cols("issue_id"). - Count() - if err != nil { - log.Error("NumIssues: %v", err) - return 0 - } - return int(c) -} - // NumClosedIssues return counter of closed issues assigned to a project func (p *Project) NumClosedIssues(ctx context.Context) int { c, err := db.GetEngine(ctx).Table("project_issue"). diff --git a/models/project/main_test.go b/models/project/main_test.go index f4b2d6feda..eaa13bf309 100644 --- a/models/project/main_test.go +++ b/models/project/main_test.go @@ -6,9 +6,9 @@ package project import ( "testing" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/unittest" - _ "code.gitea.io/gitea/models/repo" + _ "forgejo.org/models/repo" ) func TestMain(m *testing.M) { diff --git a/models/project/project.go b/models/project/project.go index 8cebf34b5e..b9813fda91 100644 --- a/models/project/project.go +++ b/models/project/project.go @@ -8,14 +8,14 @@ import ( "fmt" "html/template" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/log" + "forgejo.org/modules/optional" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) @@ -126,6 +126,14 @@ func (p *Project) LoadRepo(ctx context.Context) (err error) { return err } +func ProjectLinkForOrg(org *user_model.User, projectID int64) string { //nolint + return fmt.Sprintf("%s/-/projects/%d", org.HomeLink(), projectID) +} + +func ProjectLinkForRepo(repo *repo_model.Repository, projectID int64) string { //nolint + return fmt.Sprintf("%s/projects/%d", repo.Link(), projectID) +} + // Link returns the project's relative URL. func (p *Project) Link(ctx context.Context) string { if p.OwnerID > 0 { @@ -134,7 +142,7 @@ func (p *Project) Link(ctx context.Context) string { log.Error("LoadOwner: %v", err) return "" } - return fmt.Sprintf("%s/-/projects/%d", p.Owner.HomeLink(), p.ID) + return ProjectLinkForOrg(p.Owner, p.ID) } if p.RepoID > 0 { err := p.LoadRepo(ctx) @@ -142,7 +150,7 @@ func (p *Project) Link(ctx context.Context) string { log.Error("LoadRepo: %v", err) return "" } - return fmt.Sprintf("%s/projects/%d", p.Repo.Link(), p.ID) + return ProjectLinkForRepo(p.Repo, p.ID) } return "" } @@ -242,6 +250,7 @@ func GetSearchOrderByBySortType(sortType string) db.SearchOrderBy { } // NewProject creates a new Project +// The title will be cut off at 255 characters if it's longer than 255 characters. func NewProject(ctx context.Context, p *Project) error { if !IsTemplateTypeValid(p.TemplateType) { p.TemplateType = TemplateTypeNone @@ -255,6 +264,8 @@ func NewProject(ctx context.Context, p *Project) error { return util.NewInvalidArgumentErrorf("project type is not valid") } + p.Title, _ = util.SplitStringAtByteN(p.Title, 255) + return db.WithTx(ctx, func(ctx context.Context) error { if err := db.Insert(ctx, p); err != nil { return err @@ -302,6 +313,7 @@ func UpdateProject(ctx context.Context, p *Project) error { p.CardType = CardTypeTextOnly } + p.Title, _ = util.SplitStringAtByteN(p.Title, 255) _, err := db.GetEngine(ctx).ID(p.ID).Cols( "title", "description", @@ -356,21 +368,6 @@ func ChangeProjectStatusByRepoIDAndID(ctx context.Context, repoID, projectID int return committer.Commit() } -// ChangeProjectStatus toggle a project between opened and closed -func ChangeProjectStatus(ctx context.Context, p *Project, isClosed bool) error { - ctx, committer, err := db.TxContext(ctx) - if err != nil { - return err - } - defer committer.Close() - - if err := changeProjectStatus(ctx, p, isClosed); err != nil { - return err - } - - return committer.Commit() -} - func changeProjectStatus(ctx context.Context, p *Project, isClosed bool) error { p.IsClosed = isClosed p.ClosedDateUnix = timeutil.TimeStampNow() diff --git a/models/project/project_test.go b/models/project/project_test.go index 8c660b929a..ee9fdaa2e2 100644 --- a/models/project/project_test.go +++ b/models/project/project_test.go @@ -6,9 +6,9 @@ package project import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + "forgejo.org/modules/timeutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -75,7 +75,7 @@ func TestProject(t *testing.T) { assert.Equal(t, project.Title, projectFromDB.Title) - require.NoError(t, ChangeProjectStatus(db.DefaultContext, project, true)) + require.NoError(t, ChangeProjectStatusByRepoIDAndID(db.DefaultContext, project.RepoID, project.ID, true)) // Retrieve from DB afresh to check if it is truly closed projectFromDB, err = GetProjectByID(db.DefaultContext, project.ID) diff --git a/models/pull/automerge.go b/models/pull/automerge.go index f31159a8d8..63f572309b 100644 --- a/models/pull/automerge.go +++ b/models/pull/automerge.go @@ -7,21 +7,22 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/timeutil" ) // AutoMerge represents a pull request scheduled for merging when checks succeed type AutoMerge struct { - ID int64 `xorm:"pk autoincr"` - PullID int64 `xorm:"UNIQUE"` - DoerID int64 `xorm:"INDEX NOT NULL"` - Doer *user_model.User `xorm:"-"` - MergeStyle repo_model.MergeStyle `xorm:"varchar(30)"` - Message string `xorm:"LONGTEXT"` - CreatedUnix timeutil.TimeStamp `xorm:"created"` + ID int64 `xorm:"pk autoincr"` + PullID int64 `xorm:"UNIQUE"` + DoerID int64 `xorm:"INDEX NOT NULL"` + Doer *user_model.User `xorm:"-"` + MergeStyle repo_model.MergeStyle `xorm:"varchar(30)"` + Message string `xorm:"LONGTEXT"` + DeleteBranchAfterMerge bool `xorm:"NOT NULL DEFAULT false"` + CreatedUnix timeutil.TimeStamp `xorm:"created"` } // TableName return database table name for xorm @@ -49,7 +50,7 @@ func IsErrAlreadyScheduledToAutoMerge(err error) bool { } // ScheduleAutoMerge schedules a pull request to be merged when all checks succeed -func ScheduleAutoMerge(ctx context.Context, doer *user_model.User, pullID int64, style repo_model.MergeStyle, message string) error { +func ScheduleAutoMerge(ctx context.Context, doer *user_model.User, pullID int64, style repo_model.MergeStyle, message string, deleteBranch bool) error { // Check if we already have a merge scheduled for that pull request if exists, _, err := GetScheduledMergeByPullID(ctx, pullID); err != nil { return err @@ -58,10 +59,11 @@ func ScheduleAutoMerge(ctx context.Context, doer *user_model.User, pullID int64, } _, err := db.GetEngine(ctx).Insert(&AutoMerge{ - DoerID: doer.ID, - PullID: pullID, - MergeStyle: style, - Message: message, + DoerID: doer.ID, + PullID: pullID, + MergeStyle: style, + Message: message, + DeleteBranchAfterMerge: deleteBranch, }) return err } diff --git a/models/pull/review_state.go b/models/pull/review_state.go index e46a22a49d..2702d5d5a1 100644 --- a/models/pull/review_state.go +++ b/models/pull/review_state.go @@ -7,9 +7,9 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/modules/log" + "forgejo.org/modules/timeutil" ) // ViewedState stores for a file in which state it is currently viewed diff --git a/models/quota/default.go b/models/quota/default.go index 6b553d6f71..9f655d7847 100644 --- a/models/quota/default.go +++ b/models/quota/default.go @@ -4,10 +4,10 @@ package quota import ( - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" ) -func EvaluateDefault(used Used, forSubject LimitSubject) bool { +func EvaluateDefault(used Used, forSubject LimitSubject) (bool, int64) { groups := GroupList{ &Group{ Name: "builtin-default-group", diff --git a/models/quota/group.go b/models/quota/group.go index 0acb5b255e..7ddc20b2d6 100644 --- a/models/quota/group.go +++ b/models/quota/group.go @@ -5,10 +5,11 @@ package quota import ( "context" + "math" - "code.gitea.io/gitea/models/db" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/db" + user_model "forgejo.org/models/user" + "forgejo.org/modules/setting" "xorm.io/builder" ) @@ -199,15 +200,20 @@ var affectsMap = map[LimitSubject]LimitSubjects{ }, } -func (g *Group) Evaluate(used Used, forSubject LimitSubject) (bool, bool) { +// Evaluate returns whether the size used is acceptable for the topic if a rule +// was found, and returns the smallest limit of all applicable rules or the +// first limit found to be unacceptable for the size used. +func (g *Group) Evaluate(used Used, forSubject LimitSubject) (bool, bool, int64) { var found bool + foundLimit := int64(math.MaxInt64) for _, rule := range g.Rules { ok, has := rule.Evaluate(used, forSubject) if has { - found = true if !ok { - return false, true + return false, true, rule.Limit } + found = true + foundLimit = min(foundLimit, rule.Limit) } } @@ -216,32 +222,35 @@ func (g *Group) Evaluate(used Used, forSubject LimitSubject) (bool, bool) { // subjects below for _, subject := range affectsMap[forSubject] { - ok, has := g.Evaluate(used, subject) + ok, has, limit := g.Evaluate(used, subject) if has { - found = true if !ok { - return false, true + return false, true, limit } + found = true + foundLimit = min(foundLimit, limit) } } } - return true, found + return true, found, foundLimit } -func (gl *GroupList) Evaluate(used Used, forSubject LimitSubject) bool { +// Evaluate returns if the used size is acceptable for the subject and the +// lowest limit that is acceptable for the subject. +func (gl *GroupList) Evaluate(used Used, forSubject LimitSubject) (bool, int64) { // If there are no groups, use the configured defaults: if gl == nil || len(*gl) == 0 { return EvaluateDefault(used, forSubject) } for _, group := range *gl { - ok, has := group.Evaluate(used, forSubject) + ok, has, limit := group.Evaluate(used, forSubject) if has && ok { - return true + return true, limit } } - return false + return false, 0 } func GetGroupByName(ctx context.Context, name string) (*Group, error) { diff --git a/models/quota/main_test.go b/models/quota/main_test.go new file mode 100644 index 0000000000..ec0a0e0013 --- /dev/null +++ b/models/quota/main_test.go @@ -0,0 +1,19 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package quota + +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/models/quota/quota.go b/models/quota/quota.go index d38bfab3cc..9f1c3ca949 100644 --- a/models/quota/quota.go +++ b/models/quota/quota.go @@ -6,8 +6,8 @@ package quota import ( "context" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/db" + "forgejo.org/modules/setting" ) func init() { @@ -32,5 +32,6 @@ func EvaluateForUser(ctx context.Context, userID int64, subject LimitSubject) (b return false, err } - return groups.Evaluate(*used, subject), nil + acceptable, _ := groups.Evaluate(*used, subject) + return acceptable, nil } diff --git a/models/quota/quota_group_test.go b/models/quota/quota_group_test.go index bc258588f9..7f693b391b 100644 --- a/models/quota/quota_group_test.go +++ b/models/quota/quota_group_test.go @@ -4,9 +4,10 @@ package quota_test import ( + "math" "testing" - quota_model "code.gitea.io/gitea/models/quota" + quota_model "forgejo.org/models/quota" "github.com/stretchr/testify/assert" ) @@ -36,9 +37,10 @@ func TestQuotaGroupAllRulesMustPass(t *testing.T) { // Within a group, *all* rules must pass. Thus, if we have a deny-all rule, // and an unlimited rule, that will always fail. - ok, has := group.Evaluate(used, quota_model.LimitSubjectSizeAll) + ok, has, limit := group.Evaluate(used, quota_model.LimitSubjectSizeAll) assert.True(t, has) assert.False(t, ok) + assert.EqualValues(t, 0, limit) } func TestQuotaGroupRuleScenario1(t *testing.T) { @@ -66,21 +68,25 @@ func TestQuotaGroupRuleScenario1(t *testing.T) { used.Size.Assets.Packages.All = 256 used.Size.Git.LFS = 16 - ok, has := group.Evaluate(used, quota_model.LimitSubjectSizeAssetsAttachmentsReleases) + ok, has, limit := group.Evaluate(used, quota_model.LimitSubjectSizeAssetsAttachmentsReleases) assert.True(t, has, "size:assets:attachments:releases is covered") assert.True(t, ok, "size:assets:attachments:releases passes") + assert.EqualValues(t, 1024, limit) - ok, has = group.Evaluate(used, quota_model.LimitSubjectSizeAssetsPackagesAll) + ok, has, limit = group.Evaluate(used, quota_model.LimitSubjectSizeAssetsPackagesAll) assert.True(t, has, "size:assets:packages:all is covered") assert.True(t, ok, "size:assets:packages:all passes") + assert.EqualValues(t, 1024, limit) - ok, has = group.Evaluate(used, quota_model.LimitSubjectSizeGitLFS) + ok, has, limit = group.Evaluate(used, quota_model.LimitSubjectSizeGitLFS) assert.True(t, has, "size:git:lfs is covered") assert.False(t, ok, "size:git:lfs fails") + assert.EqualValues(t, 0, limit) - ok, has = group.Evaluate(used, quota_model.LimitSubjectSizeAll) + ok, has, limit = group.Evaluate(used, quota_model.LimitSubjectSizeAll) assert.True(t, has, "size:all is covered") assert.False(t, ok, "size:all fails") + assert.EqualValues(t, 0, limit) } func TestQuotaGroupRuleCombination(t *testing.T) { @@ -109,23 +115,27 @@ func TestQuotaGroupRuleCombination(t *testing.T) { } // Git LFS isn't covered by any rule - _, has := group.Evaluate(used, quota_model.LimitSubjectSizeGitLFS) + _, has, limit := group.Evaluate(used, quota_model.LimitSubjectSizeGitLFS) assert.False(t, has) + assert.EqualValues(t, math.MaxInt, limit) // repos:all is covered, and is passing - ok, has := group.Evaluate(used, quota_model.LimitSubjectSizeReposAll) + ok, has, limit := group.Evaluate(used, quota_model.LimitSubjectSizeReposAll) assert.True(t, has) assert.True(t, ok) + assert.EqualValues(t, 4096, limit) // packages:all is covered, and is failing - ok, has = group.Evaluate(used, quota_model.LimitSubjectSizeAssetsPackagesAll) + ok, has, limit = group.Evaluate(used, quota_model.LimitSubjectSizeAssetsPackagesAll) assert.True(t, has) assert.False(t, ok) + assert.EqualValues(t, 0, limit) // size:all is covered, and is failing (due to packages:all being over quota) - ok, has = group.Evaluate(used, quota_model.LimitSubjectSizeAll) + ok, has, limit = group.Evaluate(used, quota_model.LimitSubjectSizeAll) assert.True(t, has, "size:all should be covered") assert.False(t, ok, "size:all should fail") + assert.EqualValues(t, 0, limit) } func TestQuotaGroupListsRequireOnlyOnePassing(t *testing.T) { @@ -159,8 +169,9 @@ func TestQuotaGroupListsRequireOnlyOnePassing(t *testing.T) { used.Size.Repos.Public = 1024 // In a group list, if any group passes, the entire evaluation passes. - ok := groups.Evaluate(used, quota_model.LimitSubjectSizeAll) + ok, limit := groups.Evaluate(used, quota_model.LimitSubjectSizeAll) assert.True(t, ok) + assert.EqualValues(t, -1, limit) } func TestQuotaGroupListAllFailing(t *testing.T) { @@ -193,8 +204,9 @@ func TestQuotaGroupListAllFailing(t *testing.T) { used := quota_model.Used{} used.Size.Repos.Public = 2048 - ok := groups.Evaluate(used, quota_model.LimitSubjectSizeAll) + ok, limit := groups.Evaluate(used, quota_model.LimitSubjectSizeAll) assert.False(t, ok) + assert.EqualValues(t, 0, limit) } func TestQuotaGroupListEmpty(t *testing.T) { @@ -203,6 +215,7 @@ func TestQuotaGroupListEmpty(t *testing.T) { used := quota_model.Used{} used.Size.Repos.Public = 2048 - ok := groups.Evaluate(used, quota_model.LimitSubjectSizeAll) + ok, limit := groups.Evaluate(used, quota_model.LimitSubjectSizeAll) assert.True(t, ok) + assert.EqualValues(t, -1, limit) } diff --git a/models/quota/quota_rule_test.go b/models/quota/quota_rule_test.go index 1e1daf4c4a..59c05563f0 100644 --- a/models/quota/quota_rule_test.go +++ b/models/quota/quota_rule_test.go @@ -6,7 +6,7 @@ package quota_test import ( "testing" - quota_model "code.gitea.io/gitea/models/quota" + quota_model "forgejo.org/models/quota" "github.com/stretchr/testify/assert" ) diff --git a/models/quota/rule.go b/models/quota/rule.go index b0c6c0f4b6..89cb57cace 100644 --- a/models/quota/rule.go +++ b/models/quota/rule.go @@ -7,7 +7,7 @@ import ( "context" "slices" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" ) type Rule struct { @@ -20,6 +20,22 @@ func (r *Rule) TableName() string { return "quota_rule" } +func (r Rule) Acceptable(used Used) bool { + if r.Limit == -1 { + return true + } + + return r.Sum(used) <= r.Limit +} + +func (r Rule) Sum(used Used) int64 { + var sum int64 + for _, subject := range r.Subjects { + sum += used.CalculateFor(subject) + } + return sum +} + func (r Rule) Evaluate(used Used, forSubject LimitSubject) (bool, bool) { // If there's no limit, short circuit out if r.Limit == -1 { @@ -31,11 +47,7 @@ func (r Rule) Evaluate(used Used, forSubject LimitSubject) (bool, bool) { return false, false } - var sum int64 - for _, subject := range r.Subjects { - sum += used.CalculateFor(subject) - } - return sum <= r.Limit, true + return r.Sum(used) <= r.Limit, true } func (r *Rule) Edit(ctx context.Context, limit *int64, subjects *LimitSubjects) (*Rule, error) { diff --git a/models/quota/used.go b/models/quota/used.go index ff84ac20f8..22815165f6 100644 --- a/models/quota/used.go +++ b/models/quota/used.go @@ -6,10 +6,10 @@ package quota import ( "context" - action_model "code.gitea.io/gitea/models/actions" - "code.gitea.io/gitea/models/db" - package_model "code.gitea.io/gitea/models/packages" - repo_model "code.gitea.io/gitea/models/repo" + action_model "forgejo.org/models/actions" + "forgejo.org/models/db" + package_model "forgejo.org/models/packages" + repo_model "forgejo.org/models/repo" "xorm.io/builder" ) @@ -131,7 +131,8 @@ func createQueryFor(ctx context.Context, userID int64, q string) db.Engine { case "artifacts": session = session. Table("action_artifact"). - Join("INNER", "`repository`", "`action_artifact`.repo_id = `repository`.id") + Join("INNER", "`repository`", "`action_artifact`.repo_id = `repository`.id"). + Where("`action_artifact`.status != ?", action_model.ArtifactStatusExpired) case "packages": session = session. Table("package_version"). diff --git a/models/quota/used_test.go b/models/quota/used_test.go new file mode 100644 index 0000000000..82cc5b9bcc --- /dev/null +++ b/models/quota/used_test.go @@ -0,0 +1,23 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package quota + +import ( + "testing" + + "forgejo.org/models/unittest" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestGetUsedForUser(t *testing.T) { + defer unittest.OverrideFixtures("models/fixtures/TestGetUsedForUser/")() + require.NoError(t, unittest.PrepareTestDatabase()) + + used, err := GetUsedForUser(t.Context(), 5) + require.NoError(t, err) + + assert.EqualValues(t, 4096, used.Size.Assets.Artifacts) +} diff --git a/models/repo.go b/models/repo.go index 0dc8ee5df3..6f7ae25615 100644 --- a/models/repo.go +++ b/models/repo.go @@ -11,14 +11,16 @@ import ( _ "image/jpeg" // Needed for jpeg support - asymkey_model "code.gitea.io/gitea/models/asymkey" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - access_model "code.gitea.io/gitea/models/perm/access" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unit" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/log" + asymkey_model "forgejo.org/models/asymkey" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + access_model "forgejo.org/models/perm/access" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unit" + user_model "forgejo.org/models/user" + "forgejo.org/modules/log" + + "xorm.io/builder" ) // Init initialize model @@ -27,7 +29,7 @@ func Init(ctx context.Context) error { } type repoChecker struct { - querySQL func(ctx context.Context) ([]map[string][]byte, error) + querySQL func(ctx context.Context) ([]int64, error) correctSQL func(ctx context.Context, id int64) error desc string } @@ -38,8 +40,7 @@ func repoStatsCheck(ctx context.Context, checker *repoChecker) { log.Error("Select %s: %v", checker.desc, err) return } - for _, result := range results { - id, _ := strconv.ParseInt(string(result["id"]), 10, 64) + for _, id := range results { select { case <-ctx.Done(): log.Warn("CheckRepoStats: Cancelled before checking %s for with id=%d", checker.desc, id) @@ -54,21 +55,23 @@ func repoStatsCheck(ctx context.Context, checker *repoChecker) { } } -func StatsCorrectSQL(ctx context.Context, sql string, id int64) error { - _, err := db.GetEngine(ctx).Exec(sql, id, id) +func StatsCorrectSQL(ctx context.Context, sql any, ids ...any) error { + args := []any{sql} + args = append(args, ids...) + _, err := db.GetEngine(ctx).Exec(args...) return err } func repoStatsCorrectNumWatches(ctx context.Context, id int64) error { - return StatsCorrectSQL(ctx, "UPDATE `repository` SET num_watches=(SELECT COUNT(*) FROM `watch` WHERE repo_id=? AND mode<>2) WHERE id=?", id) + return StatsCorrectSQL(ctx, "UPDATE `repository` SET num_watches=(SELECT COUNT(*) FROM `watch` WHERE repo_id=? AND mode<>2) WHERE id=?", id, id) } func repoStatsCorrectNumStars(ctx context.Context, id int64) error { - return StatsCorrectSQL(ctx, "UPDATE `repository` SET num_stars=(SELECT COUNT(*) FROM `star` WHERE repo_id=?) WHERE id=?", id) + return StatsCorrectSQL(ctx, "UPDATE `repository` SET num_stars=(SELECT COUNT(*) FROM `star` WHERE repo_id=?) WHERE id=?", id, id) } func labelStatsCorrectNumIssues(ctx context.Context, id int64) error { - return StatsCorrectSQL(ctx, "UPDATE `label` SET num_issues=(SELECT COUNT(*) FROM `issue_label` WHERE label_id=?) WHERE id=?", id) + return StatsCorrectSQL(ctx, "UPDATE `label` SET num_issues=(SELECT COUNT(*) FROM `issue_label` WHERE label_id=?) WHERE id=?", id, id) } func labelStatsCorrectNumIssuesRepo(ctx context.Context, id int64) error { @@ -105,11 +108,11 @@ func milestoneStatsCorrectNumIssuesRepo(ctx context.Context, id int64) error { } func userStatsCorrectNumRepos(ctx context.Context, id int64) error { - return StatsCorrectSQL(ctx, "UPDATE `user` SET num_repos=(SELECT COUNT(*) FROM `repository` WHERE owner_id=?) WHERE id=?", id) + return StatsCorrectSQL(ctx, "UPDATE `user` SET num_repos=(SELECT COUNT(*) FROM `repository` WHERE owner_id=?) WHERE id=?", id, id) } func repoStatsCorrectIssueNumComments(ctx context.Context, id int64) error { - return StatsCorrectSQL(ctx, "UPDATE `issue` SET num_comments=(SELECT COUNT(*) FROM `comment` WHERE issue_id=? AND type=0) WHERE id=?", id) + return StatsCorrectSQL(ctx, issues_model.UpdateIssueNumCommentsBuilder(id)) } func repoStatsCorrectNumIssues(ctx context.Context, id int64) error { @@ -128,9 +131,12 @@ func repoStatsCorrectNumClosedPulls(ctx context.Context, id int64) error { return repo_model.UpdateRepoIssueNumbers(ctx, id, true, true) } -func statsQuery(args ...any) func(context.Context) ([]map[string][]byte, error) { - return func(ctx context.Context) ([]map[string][]byte, error) { - return db.GetEngine(ctx).Query(args...) +// statsQuery returns a function that queries the database for a list of IDs +// sql could be a string or a *builder.Builder +func statsQuery(sql any, args ...any) func(context.Context) ([]int64, error) { + return func(ctx context.Context) ([]int64, error) { + var ids []int64 + return ids, db.GetEngine(ctx).SQL(sql, args...).Find(&ids) } } @@ -201,7 +207,16 @@ func CheckRepoStats(ctx context.Context) error { }, // Issue.NumComments { - statsQuery("SELECT `issue`.id FROM `issue` WHERE `issue`.num_comments!=(SELECT COUNT(*) FROM `comment` WHERE issue_id=`issue`.id AND type=0)"), + statsQuery(builder.Select("`issue`.id").From("`issue`").Where( + builder.Neq{ + "`issue`.num_comments": builder.Select("COUNT(*)").From("`comment`").Where( + builder.Expr("issue_id = `issue`.id").And( + builder.In("type", issues_model.ConversationCountedCommentType()), + ), + ), + }, + ), + ), repoStatsCorrectIssueNumComments, "issue count 'num_comments'", }, diff --git a/models/repo/TestSearchRepositoryIDsByCondition/repository.yml b/models/repo/TestSearchRepositoryIDsByCondition/repository.yml new file mode 100644 index 0000000000..9ce830783d --- /dev/null +++ b/models/repo/TestSearchRepositoryIDsByCondition/repository.yml @@ -0,0 +1,30 @@ +- + id: 1001 + owner_id: 33 + owner_name: user33 + lower_name: repo1001 + name: repo1001 + default_branch: main + num_watches: 0 + num_stars: 0 + num_forks: 0 + num_issues: 0 + num_closed_issues: 0 + num_pulls: 0 + num_closed_pulls: 0 + num_milestones: 0 + num_closed_milestones: 0 + num_projects: 0 + num_closed_projects: 0 + is_private: false + is_empty: false + is_archived: false + is_mirror: false + status: 0 + is_fork: false + fork_id: 0 + is_template: false + template_id: 0 + size: 0 + is_fsck_enabled: true + close_issues_via_commit_in_any_branch: false diff --git a/models/repo/archive_download_count.go b/models/repo/archive_download_count.go index 31f0399d53..8e2df21198 100644 --- a/models/repo/archive_download_count.go +++ b/models/repo/archive_download_count.go @@ -6,9 +6,9 @@ package repo import ( "context" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/git" - api "code.gitea.io/gitea/modules/structs" + "forgejo.org/models/db" + "forgejo.org/modules/git" + api "forgejo.org/modules/structs" ) // RepoArchiveDownloadCount counts all archive downloads for a tag @@ -24,7 +24,7 @@ func init() { db.RegisterModel(new(RepoArchiveDownloadCount)) } -// CountArchiveDownload adds one download the the given archive +// CountArchiveDownload adds one download the given archive func CountArchiveDownload(ctx context.Context, repoID, releaseID int64, tp git.ArchiveType) error { updateCount, err := db.GetEngine(ctx).Where("repo_id = ?", repoID).And("release_id = ?", releaseID).And("`type` = ?", tp).Incr("count").Update(new(RepoArchiveDownloadCount)) if err != nil { diff --git a/models/repo/archive_download_count_test.go b/models/repo/archive_download_count_test.go index ffc6cdf6df..0faf515284 100644 --- a/models/repo/archive_download_count_test.go +++ b/models/repo/archive_download_count_test.go @@ -6,10 +6,10 @@ package repo_test import ( "testing" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/git" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" + "forgejo.org/modules/git" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/repo/archiver.go b/models/repo/archiver.go index 3f05fcf752..2d0172a163 100644 --- a/models/repo/archiver.go +++ b/models/repo/archiver.go @@ -10,10 +10,10 @@ import ( "strings" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/git" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) diff --git a/models/repo/attachment.go b/models/repo/attachment.go index 128bcebb60..3bf51e80ca 100644 --- a/models/repo/attachment.go +++ b/models/repo/attachment.go @@ -9,12 +9,12 @@ import ( "net/url" "path" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/storage" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/models/db" + "forgejo.org/modules/setting" + "forgejo.org/modules/storage" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" + "forgejo.org/modules/validation" ) // Attachment represent a attachment of issue/comment/release. @@ -219,16 +219,6 @@ func DeleteAttachments(ctx context.Context, attachments []*Attachment, remove bo return int(cnt), nil } -// DeleteAttachmentsByIssue deletes all attachments associated with the given issue. -func DeleteAttachmentsByIssue(ctx context.Context, issueID int64, remove bool) (int, error) { - attachments, err := GetAttachmentsByIssueID(ctx, issueID) - if err != nil { - return 0, err - } - - return DeleteAttachments(ctx, attachments, remove) -} - // DeleteAttachmentsByComment deletes all attachments associated with the given comment. func DeleteAttachmentsByComment(ctx context.Context, commentID int64, remove bool) (int, error) { attachments, err := GetAttachmentsByCommentID(ctx, commentID) diff --git a/models/repo/attachment_test.go b/models/repo/attachment_test.go index 23945ba1d3..23f4b3799f 100644 --- a/models/repo/attachment_test.go +++ b/models/repo/attachment_test.go @@ -6,9 +6,9 @@ package repo_test import ( "testing" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -46,11 +46,7 @@ func TestGetByCommentOrIssueID(t *testing.T) { func TestDeleteAttachments(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) - count, err := repo_model.DeleteAttachmentsByIssue(db.DefaultContext, 4, false) - require.NoError(t, err) - assert.Equal(t, 2, count) - - count, err = repo_model.DeleteAttachmentsByComment(db.DefaultContext, 2, false) + count, err := repo_model.DeleteAttachmentsByComment(db.DefaultContext, 2, false) require.NoError(t, err) assert.Equal(t, 2, count) diff --git a/models/repo/avatar.go b/models/repo/avatar.go index 72ee938ada..a108fda62d 100644 --- a/models/repo/avatar.go +++ b/models/repo/avatar.go @@ -11,11 +11,11 @@ import ( "net/url" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/avatar" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/storage" + "forgejo.org/models/db" + "forgejo.org/modules/avatar" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/storage" ) // CustomAvatarRelativePath returns repository custom avatar file path. diff --git a/models/repo/collaboration.go b/models/repo/collaboration.go index cb66cb56a6..16d10d38b6 100644 --- a/models/repo/collaboration.go +++ b/models/repo/collaboration.go @@ -7,11 +7,11 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/perm" - "code.gitea.io/gitea/models/unit" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/models/perm" + "forgejo.org/models/unit" + user_model "forgejo.org/models/user" + "forgejo.org/modules/timeutil" "xorm.io/builder" ) diff --git a/models/repo/collaboration_test.go b/models/repo/collaboration_test.go index 5adedfe442..783091ba9e 100644 --- a/models/repo/collaboration_test.go +++ b/models/repo/collaboration_test.go @@ -6,12 +6,12 @@ package repo_test import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/perm" - access_model "code.gitea.io/gitea/models/perm/access" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + "forgejo.org/models/perm" + access_model "forgejo.org/models/perm/access" + 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" diff --git a/models/repo/following_repo.go b/models/repo/following_repo.go index 85b96aa147..f9b9bf5e5e 100644 --- a/models/repo/following_repo.go +++ b/models/repo/following_repo.go @@ -4,7 +4,7 @@ package repo import ( - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/validation" ) // FollowingRepo represents a federated Repository Actor connected with a local Repo diff --git a/models/repo/following_repo_test.go b/models/repo/following_repo_test.go index d0dd0a31a7..cff125dabe 100644 --- a/models/repo/following_repo_test.go +++ b/models/repo/following_repo_test.go @@ -6,7 +6,7 @@ package repo import ( "testing" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/validation" ) func Test_FollowingRepoValidation(t *testing.T) { diff --git a/models/repo/fork.go b/models/repo/fork.go index 07cd31c269..ed8b488738 100644 --- a/models/repo/fork.go +++ b/models/repo/fork.go @@ -6,8 +6,9 @@ package repo import ( "context" - "code.gitea.io/gitea/models/db" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + "forgejo.org/models/unit" + user_model "forgejo.org/models/user" "xorm.io/builder" ) @@ -54,9 +55,9 @@ func GetUserFork(ctx context.Context, repoID, userID int64) (*Repository, error) return &forkedRepo, nil } -// GetForks returns all the forks of the repository -func GetForks(ctx context.Context, repo *Repository, listOptions db.ListOptions) ([]*Repository, error) { - sess := db.GetEngine(ctx) +// GetForks returns all the forks of the repository that are visible to the user. +func GetForks(ctx context.Context, repo *Repository, user *user_model.User, listOptions db.ListOptions) ([]*Repository, int64, error) { + sess := db.GetEngine(ctx).Where(AccessibleRepositoryCondition(user, unit.TypeInvalid)) var forks []*Repository if listOptions.Page == 0 { @@ -66,7 +67,8 @@ func GetForks(ctx context.Context, repo *Repository, listOptions db.ListOptions) sess = db.SetSessionPagination(sess, &listOptions) } - return forks, sess.Find(&forks, &Repository{ForkID: repo.ID}) + count, err := sess.FindAndCount(&forks, &Repository{ForkID: repo.ID}) + return forks, count, err } // IncrementRepoForkNum increment repository fork number diff --git a/models/repo/fork_test.go b/models/repo/fork_test.go index dd12429cc4..d567081ee6 100644 --- a/models/repo/fork_test.go +++ b/models/repo/fork_test.go @@ -6,9 +6,9 @@ package repo_test import ( "testing" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/repo/git.go b/models/repo/git.go index 388bf86522..692176c8f6 100644 --- a/models/repo/git.go +++ b/models/repo/git.go @@ -6,7 +6,7 @@ package repo import ( "context" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" ) // MergeStyle represents the approach to merge commits into base branch. @@ -29,6 +29,15 @@ const ( MergeStyleRebaseUpdate MergeStyle = "rebase-update-only" ) +type UpdateStyle string + +const ( + // UpdateStyleMerge create merge commit to update + UpdateStyleMerge UpdateStyle = "merge" + // UpdateStyleRebase rebase to update + UpdateStyleRebase UpdateStyle = "rebase" +) + // UpdateDefaultBranch updates the default branch func UpdateDefaultBranch(ctx context.Context, repo *Repository) error { _, err := db.GetEngine(ctx).ID(repo.ID).Cols("default_branch").Update(repo) diff --git a/models/repo/issue.go b/models/repo/issue.go index 0dd4fd5ed4..35453f109f 100644 --- a/models/repo/issue.go +++ b/models/repo/issue.go @@ -6,9 +6,9 @@ package repo import ( "context" - "code.gitea.io/gitea/models/unit" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/unit" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" ) // ___________.__ ___________ __ diff --git a/models/repo/language_stats.go b/models/repo/language_stats.go index 0bc0f1fb40..1b619c80cc 100644 --- a/models/repo/language_stats.go +++ b/models/repo/language_stats.go @@ -4,13 +4,14 @@ package repo import ( + "cmp" "context" "math" - "sort" + "slices" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/modules/timeutil" "github.com/go-enry/go-enry/v2" ) @@ -67,34 +68,37 @@ func (stats LanguageStatList) getLanguagePercentages() map[string]float32 { return langPerc } -// Rounds to 1 decimal point, target should be the expected sum of percs +// Use the quota method to round the percentages to one decimal place while +// keeping the sum of the percentages at 100%. func roundByLargestRemainder(percs map[string]float32, target float32) { + // Tracks the difference between the sum of percentage and 100%. leftToDistribute := int(target * 10) - keys := make([]string, 0, len(percs)) + type key struct { + language string + remainder float64 + } + keys := make([]key, 0, len(percs)) for k, v := range percs { - percs[k] = v * 10 - floored := math.Floor(float64(percs[k])) + floored, frac := math.Modf(float64(v * 10)) + percs[k] = float32(floored) leftToDistribute -= int(floored) - keys = append(keys, k) + keys = append(keys, key{language: k, remainder: frac}) } - // Sort the keys by the largest remainder - sort.SliceStable(keys, func(i, j int) bool { - _, remainderI := math.Modf(float64(percs[keys[i]])) - _, remainderJ := math.Modf(float64(percs[keys[j]])) - return remainderI > remainderJ + // Sort the fractional part in an ascending order. + slices.SortFunc(keys, func(b, a key) int { + return cmp.Compare(a.remainder, b.remainder) }) - // Increment the values in order of largest remainder + // As long as the sum of 100% is not reached, add 0.1% percentage. for _, k := range keys { - percs[k] = float32(math.Floor(float64(percs[k]))) if leftToDistribute > 0 { - percs[k]++ + percs[k.language]++ leftToDistribute-- } - percs[k] /= 10 + percs[k.language] /= 10 } } diff --git a/models/repo/language_stats_test.go b/models/repo/language_stats_test.go new file mode 100644 index 0000000000..dcfaeee6c9 --- /dev/null +++ b/models/repo/language_stats_test.go @@ -0,0 +1,66 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package repo + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestLanguagePercentages(t *testing.T) { + testCases := []struct { + input LanguageStatList + output map[string]float32 + }{ + { + []*LanguageStat{{Language: "Go", Size: 500}, {Language: "Rust", Size: 501}}, + map[string]float32{ + "Go": 50.0, + "Rust": 50.0, + }, + }, + { + []*LanguageStat{{Language: "Go", Size: 10}, {Language: "Rust", Size: 91}}, + map[string]float32{ + "Go": 9.9, + "Rust": 90.1, + }, + }, + { + []*LanguageStat{{Language: "Go", Size: 1}, {Language: "Rust", Size: 2}}, + map[string]float32{ + "Go": 33.3, + "Rust": 66.7, + }, + }, + { + []*LanguageStat{{Language: "Go", Size: 1}, {Language: "Rust", Size: 2}, {Language: "Shell", Size: 3}, {Language: "C#", Size: 4}, {Language: "Zig", Size: 5}, {Language: "Coq", Size: 6}, {Language: "Haskell", Size: 7}}, + map[string]float32{ + "Go": 3.6, + "Rust": 7.1, + "Shell": 10.7, + "C#": 14.3, + "Zig": 17.9, + "Coq": 21.4, + "Haskell": 25, + }, + }, + { + []*LanguageStat{{Language: "Go", Size: 1000}, {Language: "PHP", Size: 1}, {Language: "Java", Size: 1}}, + map[string]float32{ + "Go": 99.8, + "other": 0.2, + }, + }, + { + []*LanguageStat{}, + map[string]float32{}, + }, + } + + for _, testCase := range testCases { + assert.Equal(t, testCase.output, testCase.input.getLanguagePercentages()) + } +} diff --git a/models/repo/main_test.go b/models/repo/main_test.go index b49855f2c8..9fd1cacc97 100644 --- a/models/repo/main_test.go +++ b/models/repo/main_test.go @@ -6,14 +6,15 @@ package repo_test import ( "testing" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/unittest" - _ "code.gitea.io/gitea/models" // register table model - _ "code.gitea.io/gitea/models/actions" - _ "code.gitea.io/gitea/models/activities" - _ "code.gitea.io/gitea/models/perm/access" // register table model - _ "code.gitea.io/gitea/models/repo" // register table model - _ "code.gitea.io/gitea/models/user" // register table model + _ "forgejo.org/models" // register table model + _ "forgejo.org/models/actions" + _ "forgejo.org/models/activities" + _ "forgejo.org/models/forgefed" + _ "forgejo.org/models/perm/access" // register table model + _ "forgejo.org/models/repo" // register table model + _ "forgejo.org/models/user" // register table model ) func TestMain(m *testing.M) { diff --git a/models/repo/mirror.go b/models/repo/mirror.go index be7b785612..1fe9afd8e9 100644 --- a/models/repo/mirror.go +++ b/models/repo/mirror.go @@ -8,10 +8,10 @@ import ( "context" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/log" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" ) // ErrMirrorNotExist mirror does not exist error diff --git a/models/repo/pushmirror.go b/models/repo/pushmirror.go index 68fb504fdc..d6d0d1135a 100644 --- a/models/repo/pushmirror.go +++ b/models/repo/pushmirror.go @@ -10,14 +10,14 @@ import ( "strings" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/git" - giturl "code.gitea.io/gitea/modules/git/url" - "code.gitea.io/gitea/modules/keying" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/git" + giturl "forgejo.org/modules/git/url" + "forgejo.org/modules/keying" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) diff --git a/models/repo/pushmirror_test.go b/models/repo/pushmirror_test.go index c3368ccafe..de6c9b0a41 100644 --- a/models/repo/pushmirror_test.go +++ b/models/repo/pushmirror_test.go @@ -7,10 +7,10 @@ import ( "testing" "time" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" + "forgejo.org/modules/timeutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/repo/redirect.go b/models/repo/redirect.go index 61789ebefa..9c44a255d0 100644 --- a/models/repo/redirect.go +++ b/models/repo/redirect.go @@ -8,8 +8,8 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/util" ) // ErrRedirectNotExist represents a "RedirectNotExist" kind of error. diff --git a/models/repo/redirect_test.go b/models/repo/redirect_test.go index 2016784aed..d84cbbed54 100644 --- a/models/repo/redirect_test.go +++ b/models/repo/redirect_test.go @@ -6,9 +6,9 @@ package repo_test import ( "testing" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/repo/release.go b/models/repo/release.go index e2cd7d7ed3..10e9bb259f 100644 --- a/models/repo/release.go +++ b/models/repo/release.go @@ -13,13 +13,13 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/models/db" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + user_model "forgejo.org/models/user" + "forgejo.org/modules/container" + "forgejo.org/modules/optional" + "forgejo.org/modules/structs" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) @@ -97,13 +97,11 @@ func init() { // LoadAttributes load repo and publisher attributes for a release func (r *Release) LoadAttributes(ctx context.Context) error { - var err error - if r.Repo == nil { - r.Repo, err = GetRepositoryByID(ctx, r.RepoID) - if err != nil { - return err - } + err := r.LoadRepo(ctx) + if err != nil { + return err } + if r.Publisher == nil { r.Publisher, err = user_model.GetUserByID(ctx, r.PublisherID) if err != nil { @@ -123,6 +121,18 @@ func (r *Release) LoadAttributes(ctx context.Context) error { return GetReleaseAttachments(ctx, r) } +// LoadRepo load repo attribute for release +func (r *Release) LoadRepo(ctx context.Context) error { + if r.Repo != nil { + return nil + } + + var err error + r.Repo, err = GetRepositoryByID(ctx, r.RepoID) + + return err +} + // LoadArchiveDownloadCount loads the download count for the source archives func (r *Release) LoadArchiveDownloadCount(ctx context.Context) error { var err error @@ -130,6 +140,25 @@ func (r *Release) LoadArchiveDownloadCount(ctx context.Context) error { return err } +// GetTotalDownloadCount returns the summary of all download count of files attached to the release +func (r *Release) GetTotalDownloadCount(ctx context.Context) (int64, error) { + var archiveCount int64 + if !r.HideArchiveLinks { + _, err := db.GetEngine(ctx).SQL("SELECT SUM(count) FROM repo_archive_download_count WHERE release_id = ?", r.ID).Get(&archiveCount) + if err != nil { + return 0, err + } + } + + var attachmentCount int64 + _, err := db.GetEngine(ctx).SQL("SELECT SUM(download_count) FROM attachment WHERE release_id = ?", r.ID).Get(&attachmentCount) + if err != nil { + return 0, err + } + + return archiveCount + attachmentCount, nil +} + // APIURL the api url for a release. release must have attributes loaded func (r *Release) APIURL() string { return r.Repo.APIURL() + "/releases/" + strconv.FormatInt(r.ID, 10) @@ -160,6 +189,20 @@ func (r *Release) Link() string { return r.Repo.Link() + "/releases/tag/" + util.PathEscapeSegments(r.TagName) } +// SummaryCardURL returns the absolute URL to an image providing a summary of the release +func (r *Release) SummaryCardURL() string { + return fmt.Sprintf("%s/releases/summary-card/%s", r.Repo.HTMLURL(), util.PathEscapeSegments(r.TagName)) +} + +// DisplayName returns the name of the release +func (r *Release) DisplayName() string { + if r.IsTag && r.Title == "" { + return r.TagName + } + + return r.Title +} + // IsReleaseExist returns true if release with given tag name already exists. func IsReleaseExist(ctx context.Context, repoID int64, tagName string) (bool, error) { if len(tagName) == 0 { @@ -171,6 +214,7 @@ func IsReleaseExist(ctx context.Context, repoID int64, tagName string) (bool, er // UpdateRelease updates all columns of a release func UpdateRelease(ctx context.Context, rel *Release) error { + rel.Title, _ = util.SplitStringAtByteN(rel.Title, 255) _, err := db.GetEngine(ctx).ID(rel.ID).AllCols().Update(rel) return err } @@ -249,6 +293,7 @@ type FindReleasesOptions struct { IsDraft optional.Option[bool] TagNames []string HasSha1 optional.Option[bool] // useful to find draft releases which are created with existing tags + Keyword string } func (opts FindReleasesOptions) ToConds() builder.Cond { @@ -276,6 +321,15 @@ func (opts FindReleasesOptions) ToConds() builder.Cond { cond = cond.And(builder.Eq{"sha1": ""}) } } + + if opts.Keyword != "" { + keywordCond := builder.NewCond() + keywordCond = keywordCond.Or(builder.Like{"lower_tag_name", strings.ToLower(opts.Keyword)}) + keywordCond = keywordCond.Or(db.BuildCaseInsensitiveLike("title", opts.Keyword)) + keywordCond = keywordCond.Or(db.BuildCaseInsensitiveLike("note", opts.Keyword)) + cond = cond.And(keywordCond) + } + return cond } diff --git a/models/repo/release_list.go b/models/repo/release_list.go new file mode 100644 index 0000000000..4ec955adf3 --- /dev/null +++ b/models/repo/release_list.go @@ -0,0 +1,45 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package repo + +import ( + "context" + + user_model "forgejo.org/models/user" +) + +type ReleaseList []*Release + +// LoadAttributes loads the repository and publisher for the releases. +func (r ReleaseList) LoadAttributes(ctx context.Context) error { + repoCache := make(map[int64]*Repository) + userCache := make(map[int64]*user_model.User) + + for _, release := range r { + var err error + repo, ok := repoCache[release.RepoID] + if !ok { + repo, err = GetRepositoryByID(ctx, release.RepoID) + if err != nil { + return err + } + repoCache[release.RepoID] = repo + } + release.Repo = repo + + publisher, ok := userCache[release.PublisherID] + if !ok { + publisher, err = user_model.GetUserByID(ctx, release.PublisherID) + if err != nil { + if !user_model.IsErrUserNotExist(err) { + return err + } + publisher = user_model.NewGhostUser() + } + userCache[release.PublisherID] = publisher + } + release.Publisher = publisher + } + return nil +} diff --git a/models/repo/release_list_test.go b/models/repo/release_list_test.go new file mode 100644 index 0000000000..2b494cb179 --- /dev/null +++ b/models/repo/release_list_test.go @@ -0,0 +1,42 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package repo + +import ( + "testing" + + "forgejo.org/models/unittest" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestReleaseListLoadAttributes(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + releases := ReleaseList{&Release{ + RepoID: 1, + PublisherID: 1, + }, &Release{ + RepoID: 2, + PublisherID: 2, + }, &Release{ + RepoID: 1, + PublisherID: 2, + }, &Release{ + RepoID: 2, + PublisherID: 1, + }} + + require.NoError(t, releases.LoadAttributes(t.Context())) + + assert.EqualValues(t, 1, releases[0].Repo.ID) + assert.EqualValues(t, 1, releases[0].Publisher.ID) + assert.EqualValues(t, 2, releases[1].Repo.ID) + assert.EqualValues(t, 2, releases[1].Publisher.ID) + assert.EqualValues(t, 1, releases[2].Repo.ID) + assert.EqualValues(t, 2, releases[2].Publisher.ID) + assert.EqualValues(t, 2, releases[3].Repo.ID) + assert.EqualValues(t, 1, releases[3].Publisher.ID) +} diff --git a/models/repo/release_test.go b/models/repo/release_test.go index 4e61a2805d..94dbd6d9d5 100644 --- a/models/repo/release_test.go +++ b/models/repo/release_test.go @@ -6,9 +6,10 @@ package repo import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -25,3 +26,26 @@ func TestMigrate_InsertReleases(t *testing.T) { err := InsertReleases(db.DefaultContext, r) require.NoError(t, err) } + +func TestReleaseLoadRepo(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + release := unittest.AssertExistsAndLoadBean(t, &Release{ID: 1}) + assert.Nil(t, release.Repo) + + require.NoError(t, release.LoadRepo(db.DefaultContext)) + + assert.EqualValues(t, 1, release.Repo.ID) +} + +func TestReleaseDisplayName(t *testing.T) { + release := Release{TagName: "TagName"} + + assert.Empty(t, release.DisplayName()) + + release.IsTag = true + assert.Equal(t, "TagName", release.DisplayName()) + + release.Title = "Title" + assert.Equal(t, "Title", release.DisplayName()) +} diff --git a/models/repo/repo.go b/models/repo/repo.go index cd6be48b90..8d204d5594 100644 --- a/models/repo/repo.go +++ b/models/repo/repo.go @@ -14,18 +14,18 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unit" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/markup" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/setting" - api "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/translation" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/models/unit" + user_model "forgejo.org/models/user" + "forgejo.org/modules/git" + "forgejo.org/modules/log" + "forgejo.org/modules/markup" + "forgejo.org/modules/optional" + "forgejo.org/modules/setting" + api "forgejo.org/modules/structs" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/translation" + "forgejo.org/modules/util" "xorm.io/builder" ) @@ -327,6 +327,11 @@ func (repo *Repository) HTMLURL() string { return setting.AppURL + url.PathEscape(repo.OwnerName) + "/" + url.PathEscape(repo.Name) } +// SummaryCardURL returns the absolute URL to an image providing a summary of the repo +func (repo *Repository) SummaryCardURL() string { + return fmt.Sprintf("%s/-/summary-card", repo.HTMLURL()) +} + // CommitLink make link to by commit full ID // note: won't check whether it's an right id func (repo *Repository) CommitLink(commitID string) (result string) { @@ -524,7 +529,6 @@ func (repo *Repository) ComposeMetas(ctx context.Context) map[string]string { Join("INNER", "team", "team.id = team_repo.team_id"). Where("team_repo.repo_id = ?", repo.ID). Select("team.lower_name"). - OrderBy("team.lower_name"). Find(&teams) metas["teams"] = "," + strings.Join(teams, ",") + "," metas["org"] = strings.ToLower(repo.OwnerName) diff --git a/models/repo/repo_flags.go b/models/repo/repo_flags.go index de76ed2b37..247a588cdf 100644 --- a/models/repo/repo_flags.go +++ b/models/repo/repo_flags.go @@ -6,7 +6,7 @@ package repo import ( "context" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" "xorm.io/builder" ) diff --git a/models/repo/repo_flags_test.go b/models/repo/repo_flags_test.go index bccefcf72b..bd92b18208 100644 --- a/models/repo/repo_flags_test.go +++ b/models/repo/repo_flags_test.go @@ -6,9 +6,9 @@ package repo_test import ( "testing" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/repo/repo_indexer.go b/models/repo/repo_indexer.go index 6e19d8f937..e95517bb07 100644 --- a/models/repo/repo_indexer.go +++ b/models/repo/repo_indexer.go @@ -7,7 +7,7 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" "xorm.io/builder" ) diff --git a/models/repo/repo_list.go b/models/repo/repo_list.go index 162f933fbe..ac7d2b69e3 100644 --- a/models/repo/repo_list.go +++ b/models/repo/repo_list.go @@ -8,24 +8,19 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/perm" - "code.gitea.io/gitea/models/unit" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/models/perm" + "forgejo.org/models/unit" + user_model "forgejo.org/models/user" + "forgejo.org/modules/container" + "forgejo.org/modules/optional" + "forgejo.org/modules/setting" + "forgejo.org/modules/structs" + "forgejo.org/modules/util" "xorm.io/builder" ) -// FindReposMapByIDs find repos as map -func FindReposMapByIDs(ctx context.Context, repoIDs []int64, res map[int64]*Repository) error { - return db.GetEngine(ctx).In("id", repoIDs).Find(&res) -} - // RepositoryListDefaultPageSize is the default number of repositories // to load in memory when running administrative tasks on all (or almost // all) of them. @@ -36,18 +31,6 @@ const RepositoryListDefaultPageSize = 64 // RepositoryList contains a list of repositories type RepositoryList []*Repository -func (repos RepositoryList) Len() int { - return len(repos) -} - -func (repos RepositoryList) Less(i, j int) bool { - return repos[i].FullName() < repos[j].FullName() -} - -func (repos RepositoryList) Swap(i, j int) { - repos[i], repos[j] = repos[j], repos[i] -} - // ValuesRepository converts a repository map to a list // FIXME: Remove in favor of maps.values when MIN_GO_VERSION >= 1.18 func ValuesRepository(m map[int64]*Repository) []*Repository { @@ -641,12 +624,9 @@ func AccessibleRepositoryCondition(user *user_model.User, unitType unit.Type) bu // 1. Be able to see all non-private repositories that either: cond = cond.Or(builder.And( builder.Eq{"`repository`.is_private": false}, - // 2. Aren't in an private organisation or limited organisation if we're not logged in + // 2. Aren't in an private organisation/user or limited organisation/user if the doer is not logged in. builder.NotIn("`repository`.owner_id", builder.Select("id").From("`user`").Where( - builder.And( - builder.Eq{"type": user_model.UserTypeOrganization}, - builder.In("visibility", orgVisibilityLimit)), - )))) + builder.In("visibility", orgVisibilityLimit))))) } if user != nil { diff --git a/models/repo/repo_list_test.go b/models/repo/repo_list_test.go index b31aa1780f..c654d1b602 100644 --- a/models/repo/repo_list_test.go +++ b/models/repo/repo_list_test.go @@ -4,13 +4,16 @@ package repo_test import ( + "slices" "strings" "testing" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/optional" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" + "forgejo.org/models/user" + "forgejo.org/modules/optional" + "forgejo.org/modules/structs" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -403,3 +406,37 @@ func TestSearchRepositoryByTopicName(t *testing.T) { }) } } + +func TestSearchRepositoryIDsByCondition(t *testing.T) { + defer unittest.OverrideFixtures("models/repo/TestSearchRepositoryIDsByCondition")() + require.NoError(t, unittest.PrepareTestDatabase()) + // Sanity check of the database + limitedUser := unittest.AssertExistsAndLoadBean(t, &user.User{ID: 33, Visibility: structs.VisibleTypeLimited}) + unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1001, OwnerID: limitedUser.ID}) + + testCases := []struct { + user *user.User + repoIDs []int64 + }{ + { + user: nil, + repoIDs: []int64{1, 4, 8, 9, 10, 11, 12, 14, 17, 18, 21, 23, 25, 27, 29, 32, 33, 34, 35, 36, 37, 42, 44, 45, 46, 47, 48, 49, 50, 51, 53, 57, 58, 60, 61, 62, 1059}, + }, + { + user: unittest.AssertExistsAndLoadBean(t, &user.User{ID: 4}), + repoIDs: []int64{1, 3, 4, 8, 9, 10, 11, 12, 14, 17, 18, 21, 23, 25, 27, 29, 32, 33, 34, 35, 36, 37, 38, 40, 42, 44, 45, 46, 47, 48, 49, 50, 51, 53, 57, 58, 60, 61, 62, 1001, 1059}, + }, + { + user: unittest.AssertExistsAndLoadBean(t, &user.User{ID: 5}), + repoIDs: []int64{1, 4, 8, 9, 10, 11, 12, 14, 17, 18, 21, 23, 25, 27, 29, 32, 33, 34, 35, 36, 37, 38, 40, 42, 44, 45, 46, 47, 48, 49, 50, 51, 53, 57, 58, 60, 61, 62, 1001, 1059}, + }, + } + + for _, testCase := range testCases { + repoIDs, err := repo_model.FindUserCodeAccessibleRepoIDs(db.DefaultContext, testCase.user) + require.NoError(t, err) + + slices.Sort(repoIDs) + assert.EqualValues(t, testCase.repoIDs, repoIDs) + } +} diff --git a/models/repo/repo_repository.go b/models/repo/repo_repository.go index 6780165a38..0ba50e6614 100644 --- a/models/repo/repo_repository.go +++ b/models/repo/repo_repository.go @@ -5,8 +5,8 @@ package repo import ( "context" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/models/db" + "forgejo.org/modules/validation" ) func init() { diff --git a/models/repo/repo_test.go b/models/repo/repo_test.go index 56b84798d7..a9591a357b 100644 --- a/models/repo/repo_test.go +++ b/models/repo/repo_test.go @@ -7,15 +7,15 @@ package repo_test import ( "testing" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unit" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/markup" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/test" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unit" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/markup" + "forgejo.org/modules/optional" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/repo/repo_unit.go b/models/repo/repo_unit.go index ed553844fc..c11ad70627 100644 --- a/models/repo/repo_unit.go +++ b/models/repo/repo_unit.go @@ -9,13 +9,13 @@ import ( "slices" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/perm" - "code.gitea.io/gitea/models/unit" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/models/perm" + "forgejo.org/models/unit" + "forgejo.org/modules/json" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/xorm" "xorm.io/xorm/convert" @@ -159,6 +159,7 @@ type PullRequestsConfig struct { AllowRebaseUpdate bool DefaultDeleteBranchAfterMerge bool DefaultMergeStyle MergeStyle + DefaultUpdateStyle UpdateStyle DefaultAllowMaintainerEdit bool } @@ -197,6 +198,25 @@ func (cfg *PullRequestsConfig) GetDefaultMergeStyle() MergeStyle { return MergeStyleMerge } +// IsUpdateStyleAllowed returns if update style is allowed +func (cfg *PullRequestsConfig) IsUpdateStyleAllowed(updateStyle UpdateStyle) bool { + return updateStyle == UpdateStyleMerge || + updateStyle == UpdateStyleRebase && cfg.AllowRebaseUpdate +} + +// GetDefaultUpdateStyle returns the default update style for this pull request +func (cfg *PullRequestsConfig) GetDefaultUpdateStyle() UpdateStyle { + if len(cfg.DefaultUpdateStyle) != 0 { + return cfg.DefaultUpdateStyle + } + + if setting.Repository.PullRequest.DefaultUpdateStyle != "" { + return UpdateStyle(setting.Repository.PullRequest.DefaultUpdateStyle) + } + + return UpdateStyleMerge +} + type ActionsConfig struct { DisabledWorkflows []string } diff --git a/models/repo/repo_unit_test.go b/models/repo/repo_unit_test.go index deee1a7472..210b830d02 100644 --- a/models/repo/repo_unit_test.go +++ b/models/repo/repo_unit_test.go @@ -6,7 +6,9 @@ package repo import ( "testing" - "code.gitea.io/gitea/models/perm" + "forgejo.org/models/perm" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" "github.com/stretchr/testify/assert" ) @@ -37,3 +39,50 @@ func TestRepoUnitAccessMode(t *testing.T) { assert.Equal(t, perm.AccessModeWrite, UnitAccessModeWrite.ToAccessMode(perm.AccessModeAdmin)) assert.Equal(t, perm.AccessModeRead, UnitAccessModeUnset.ToAccessMode(perm.AccessModeRead)) } + +func TestRepoPRIsUpdateStyleAllowed(t *testing.T) { + var cfg PullRequestsConfig + cfg = PullRequestsConfig{ + AllowRebaseUpdate: true, + } + assert.True(t, cfg.IsUpdateStyleAllowed(UpdateStyleMerge)) + assert.True(t, cfg.IsUpdateStyleAllowed(UpdateStyleRebase)) + + cfg = PullRequestsConfig{ + AllowRebaseUpdate: false, + } + assert.True(t, cfg.IsUpdateStyleAllowed(UpdateStyleMerge)) + assert.False(t, cfg.IsUpdateStyleAllowed(UpdateStyleRebase)) +} + +func TestRepoPRGetDefaultUpdateStyle(t *testing.T) { + defer test.MockVariableValue(&setting.Repository.PullRequest.DefaultUpdateStyle, "merge")() + + var cfg PullRequestsConfig + cfg = PullRequestsConfig{ + DefaultUpdateStyle: "", + } + assert.Equal(t, UpdateStyleMerge, cfg.GetDefaultUpdateStyle()) + cfg = PullRequestsConfig{ + DefaultUpdateStyle: "rebase", + } + assert.Equal(t, UpdateStyleRebase, cfg.GetDefaultUpdateStyle()) + cfg = PullRequestsConfig{ + DefaultUpdateStyle: "merge", + } + assert.Equal(t, UpdateStyleMerge, cfg.GetDefaultUpdateStyle()) + + setting.Repository.PullRequest.DefaultUpdateStyle = "rebase" + cfg = PullRequestsConfig{ + DefaultUpdateStyle: "", + } + assert.Equal(t, UpdateStyleRebase, cfg.GetDefaultUpdateStyle()) + cfg = PullRequestsConfig{ + DefaultUpdateStyle: "rebase", + } + assert.Equal(t, UpdateStyleRebase, cfg.GetDefaultUpdateStyle()) + cfg = PullRequestsConfig{ + DefaultUpdateStyle: "merge", + } + assert.Equal(t, UpdateStyleMerge, cfg.GetDefaultUpdateStyle()) +} diff --git a/models/repo/search.go b/models/repo/search.go index a73d9fc215..c16bfa4922 100644 --- a/models/repo/search.go +++ b/models/repo/search.go @@ -3,7 +3,7 @@ package repo -import "code.gitea.io/gitea/models/db" +import "forgejo.org/models/db" // OrderByMap represents all possible search order var OrderByMap = map[string]map[string]db.SearchOrderBy{ @@ -36,6 +36,7 @@ var OrderByMap = map[string]map[string]db.SearchOrderBy{ var OrderByFlatMap = map[string]db.SearchOrderBy{ "newest": OrderByMap["desc"]["created"], "oldest": OrderByMap["asc"]["created"], + "recentupdate": OrderByMap["desc"]["updated"], "leastupdate": OrderByMap["asc"]["updated"], "reversealphabetically": OrderByMap["desc"]["alpha"], "alphabetically": OrderByMap["asc"]["alpha"], diff --git a/models/repo/star.go b/models/repo/star.go index 60737149da..25c039a50b 100644 --- a/models/repo/star.go +++ b/models/repo/star.go @@ -6,9 +6,9 @@ package repo import ( "context" - "code.gitea.io/gitea/models/db" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + user_model "forgejo.org/models/user" + "forgejo.org/modules/timeutil" ) // Star represents a starred repo by an user. diff --git a/models/repo/star_test.go b/models/repo/star_test.go index 73b362c68c..cbaa21db64 100644 --- a/models/repo/star_test.go +++ b/models/repo/star_test.go @@ -6,9 +6,9 @@ package repo_test import ( "testing" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/repo/topic.go b/models/repo/topic.go index 6db6c8aef8..4a3bdc7d8c 100644 --- a/models/repo/topic.go +++ b/models/repo/topic.go @@ -5,14 +5,12 @@ package repo import ( "context" - "fmt" "regexp" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/container" + "forgejo.org/modules/timeutil" "xorm.io/builder" ) @@ -39,26 +37,6 @@ type RepoTopic struct { //revive:disable-line:exported TopicID int64 `xorm:"pk"` } -// ErrTopicNotExist represents an error that a topic is not exist -type ErrTopicNotExist struct { - Name string -} - -// IsErrTopicNotExist checks if an error is an ErrTopicNotExist. -func IsErrTopicNotExist(err error) bool { - _, ok := err.(ErrTopicNotExist) - return ok -} - -// Error implements error interface -func (err ErrTopicNotExist) Error() string { - return fmt.Sprintf("topic is not exist [name: %s]", err.Name) -} - -func (err ErrTopicNotExist) Unwrap() error { - return util.ErrNotExist -} - // ValidateTopic checks a topic by length and match pattern rules func ValidateTopic(topic string) bool { return len(topic) <= 35 && topicPattern.MatchString(topic) @@ -91,17 +69,6 @@ func SanitizeAndValidateTopics(topics []string) (validTopics, invalidTopics []st return validTopics, invalidTopics } -// GetTopicByName retrieves topic by name -func GetTopicByName(ctx context.Context, name string) (*Topic, error) { - var topic Topic - if has, err := db.GetEngine(ctx).Where("name = ?", name).Get(&topic); err != nil { - return nil, err - } else if !has { - return nil, ErrTopicNotExist{name} - } - return &topic, nil -} - // addTopicByNameToRepo adds a topic name to a repo and increments the topic count. // Returns topic after the addition func addTopicByNameToRepo(ctx context.Context, repoID int64, topicName string) (*Topic, error) { diff --git a/models/repo/topic_test.go b/models/repo/topic_test.go index 45cee524b6..26ad27896e 100644 --- a/models/repo/topic_test.go +++ b/models/repo/topic_test.go @@ -6,9 +6,9 @@ package repo_test import ( "testing" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -52,8 +52,7 @@ func TestAddTopic(t *testing.T) { require.NoError(t, repo_model.SaveTopics(db.DefaultContext, 2, "golang", "gitea")) repo2NrOfTopics = 2 totalNrOfTopics++ - topic, err := repo_model.GetTopicByName(db.DefaultContext, "gitea") - require.NoError(t, err) + topic := unittest.AssertExistsAndLoadBean(t, &repo_model.Topic{Name: "gitea"}) assert.EqualValues(t, 1, topic.RepoCount) topics, _, err = repo_model.FindTopics(db.DefaultContext, &repo_model.FindTopicOptions{}) diff --git a/models/repo/update.go b/models/repo/update.go index e7ca224028..0222d09de5 100644 --- a/models/repo/update.go +++ b/models/repo/update.go @@ -8,10 +8,10 @@ import ( "fmt" "time" - "code.gitea.io/gitea/models/db" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + user_model "forgejo.org/models/user" + "forgejo.org/modules/log" + "forgejo.org/modules/util" ) // UpdateRepositoryOwnerNames updates repository owner_names (this should only be used when the ownerName has changed case) diff --git a/models/repo/upload.go b/models/repo/upload.go index 18834f6b83..49152db7fd 100644 --- a/models/repo/upload.go +++ b/models/repo/upload.go @@ -12,10 +12,10 @@ import ( "os" "path" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" gouuid "github.com/google/uuid" ) diff --git a/models/repo/user_repo.go b/models/repo/user_repo.go index 6790ee1da9..309bfee18f 100644 --- a/models/repo/user_repo.go +++ b/models/repo/user_repo.go @@ -6,12 +6,12 @@ package repo import ( "context" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/perm" - "code.gitea.io/gitea/models/unit" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/container" - api "code.gitea.io/gitea/modules/structs" + "forgejo.org/models/db" + "forgejo.org/models/perm" + "forgejo.org/models/unit" + user_model "forgejo.org/models/user" + "forgejo.org/modules/container" + api "forgejo.org/modules/structs" "xorm.io/builder" ) @@ -75,26 +75,28 @@ func GetRepoAssignees(ctx context.Context, repo *Repository) (_ []*user_model.Us return nil, err } - additionalUserIDs := make([]int64, 0, 10) - if err = e.Table("team_user"). - Join("INNER", "team_repo", "`team_repo`.team_id = `team_user`.team_id"). - Join("INNER", "team_unit", "`team_unit`.team_id = `team_user`.team_id"). - Where("`team_repo`.repo_id = ? AND (`team_unit`.access_mode >= ? OR (`team_unit`.access_mode = ? AND `team_unit`.`type` = ?))", - repo.ID, perm.AccessModeWrite, perm.AccessModeRead, unit.TypePullRequests). - Distinct("`team_user`.uid"). - Select("`team_user`.uid"). - Find(&additionalUserIDs); err != nil { - return nil, err - } - uniqueUserIDs := make(container.Set[int64]) uniqueUserIDs.AddMultiple(userIDs...) - uniqueUserIDs.AddMultiple(additionalUserIDs...) + + if repo.Owner.IsOrganization() { + additionalUserIDs := make([]int64, 0, 10) + if err = e.Table("team_user"). + Join("INNER", "team_repo", "`team_repo`.team_id = `team_user`.team_id"). + Join("INNER", "team_unit", "`team_unit`.team_id = `team_user`.team_id"). + Where("`team_repo`.repo_id = ? AND (`team_unit`.access_mode >= ? OR (`team_unit`.access_mode = ? AND `team_unit`.`type` = ?))", + repo.ID, perm.AccessModeWrite, perm.AccessModeRead, unit.TypePullRequests). + Distinct("`team_user`.uid"). + Select("`team_user`.uid"). + Find(&additionalUserIDs); err != nil { + return nil, err + } + uniqueUserIDs.AddMultiple(additionalUserIDs...) + } // Leave a seat for owner itself to append later, but if owner is an organization // and just waste 1 unit is cheaper than re-allocate memory once. users := make([]*user_model.User, 0, len(uniqueUserIDs)+1) - if len(userIDs) > 0 { + if len(uniqueUserIDs) > 0 { if err = e.In("id", uniqueUserIDs.Values()). Where(builder.Eq{"`user`.is_active": true}). OrderBy(user_model.GetOrderByName()). @@ -164,9 +166,9 @@ func GetReviewers(ctx context.Context, repo *Repository, doerID, posterID int64) // If isShowFullName is set to true, also include full name prefix search func GetIssuePostersWithSearch(ctx context.Context, repo *Repository, isPull bool, search string, isShowFullName bool) ([]*user_model.User, error) { users := make([]*user_model.User, 0, 30) - var prefixCond builder.Cond = builder.Like{"name", search + "%"} + prefixCond := db.BuildCaseInsensitiveLike("name", search+"%") if isShowFullName { - prefixCond = prefixCond.Or(builder.Like{"full_name", "%" + search + "%"}) + prefixCond = db.BuildCaseInsensitiveLike("full_name", "%"+search+"%") } cond := builder.In("`user`.id", diff --git a/models/repo/user_repo_test.go b/models/repo/user_repo_test.go index c784a5565d..2912986cd1 100644 --- a/models/repo/user_repo_test.go +++ b/models/repo/user_repo_test.go @@ -6,10 +6,10 @@ package repo_test import ( "testing" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + 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" diff --git a/models/repo/watch.go b/models/repo/watch.go index 6974d893df..3fd915e1e7 100644 --- a/models/repo/watch.go +++ b/models/repo/watch.go @@ -6,10 +6,10 @@ package repo import ( "context" - "code.gitea.io/gitea/models/db" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + user_model "forgejo.org/models/user" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" ) // WatchMode specifies what kind of watch the user has on a repository diff --git a/models/repo/watch_test.go b/models/repo/watch_test.go index dbf15050cf..059489afbf 100644 --- a/models/repo/watch_test.go +++ b/models/repo/watch_test.go @@ -6,10 +6,10 @@ package repo_test import ( "testing" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/repo/wiki.go b/models/repo/wiki.go index b378666a20..f0dd945a72 100644 --- a/models/repo/wiki.go +++ b/models/repo/wiki.go @@ -9,9 +9,9 @@ import ( "path/filepath" "strings" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/util" + user_model "forgejo.org/models/user" + "forgejo.org/modules/log" + "forgejo.org/modules/util" ) // ErrWikiAlreadyExist represents a "WikiAlreadyExist" kind of error. diff --git a/models/repo/wiki_test.go b/models/repo/wiki_test.go index 28495a4b7d..bf35a4c610 100644 --- a/models/repo/wiki_test.go +++ b/models/repo/wiki_test.go @@ -7,9 +7,9 @@ import ( "path/filepath" "testing" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/setting" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/repo_test.go b/models/repo_test.go index 958725fe53..6fbef8edf6 100644 --- a/models/repo_test.go +++ b/models/repo_test.go @@ -6,9 +6,11 @@ package models import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + "forgejo.org/models/unittest" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -22,3 +24,16 @@ func TestDoctorUserStarNum(t *testing.T) { require.NoError(t, DoctorUserStarNum(db.DefaultContext)) } + +func Test_repoStatsCorrectIssueNumComments(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + issue2 := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2}) + assert.NotNil(t, issue2) + assert.EqualValues(t, 0, issue2.NumComments) // the fixture data is wrong, but we don't fix it here + + require.NoError(t, repoStatsCorrectIssueNumComments(db.DefaultContext, 2)) + // reload the issue + issue2 = unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2}) + assert.EqualValues(t, 1, issue2.NumComments) +} diff --git a/models/repo_transfer.go b/models/repo_transfer.go index 0c23d759f9..f515f1bcf0 100644 --- a/models/repo_transfer.go +++ b/models/repo_transfer.go @@ -8,12 +8,12 @@ import ( "errors" "fmt" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/organization" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/models/organization" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/log" + "forgejo.org/modules/timeutil" ) // RepoTransfer is used to manage repository transfers diff --git a/models/repo_transfer_test.go b/models/repo_transfer_test.go index 6b6d5a8098..6449e40fce 100644 --- a/models/repo_transfer_test.go +++ b/models/repo_transfer_test.go @@ -6,9 +6,9 @@ package models import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/secret/secret.go b/models/secret/secret.go index ce0ad65a79..7be7f454a1 100644 --- a/models/secret/secret.go +++ b/models/secret/secret.go @@ -8,14 +8,14 @@ import ( "fmt" "strings" - actions_model "code.gitea.io/gitea/models/actions" - "code.gitea.io/gitea/models/db" - actions_module "code.gitea.io/gitea/modules/actions" - "code.gitea.io/gitea/modules/log" - secret_module "code.gitea.io/gitea/modules/secret" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + actions_model "forgejo.org/models/actions" + "forgejo.org/models/db" + actions_module "forgejo.org/modules/actions" + "forgejo.org/modules/log" + secret_module "forgejo.org/modules/secret" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "xorm.io/builder" ) @@ -135,9 +135,10 @@ func GetSecretsOfTask(ctx context.Context, task *actions_model.ActionTask) (map[ secrets["GITHUB_TOKEN"] = task.Token secrets["GITEA_TOKEN"] = task.Token + secrets["FORGEJO_TOKEN"] = task.Token if task.Job.Run.IsForkPullRequest && task.Job.Run.TriggerEvent != actions_module.GithubEventPullRequestTarget { - // ignore secrets for fork pull request, except GITHUB_TOKEN and GITEA_TOKEN which are automatically generated. + // ignore secrets for fork pull request, except GITHUB_TOKEN, GITEA_TOKEN and FORGEJO_TOKEN which are automatically generated. // for the tasks triggered by pull_request_target event, they could access the secrets because they will run in the context of the base branch // see the documentation: https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target return secrets, nil diff --git a/models/shared/types/ownertype.go b/models/shared/types/ownertype.go index a1d46c986f..62ca1bb9cc 100644 --- a/models/shared/types/ownertype.go +++ b/models/shared/types/ownertype.go @@ -3,7 +3,7 @@ package types -import "code.gitea.io/gitea/modules/translation" +import "forgejo.org/modules/translation" type OwnerType string diff --git a/models/system/appstate.go b/models/system/appstate.go index 01faa1a5be..31274b4c34 100644 --- a/models/system/appstate.go +++ b/models/system/appstate.go @@ -6,7 +6,7 @@ package system import ( "context" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" ) // AppState represents a state record in database diff --git a/models/system/main_test.go b/models/system/main_test.go index 6bc27a7cff..ca2846527a 100644 --- a/models/system/main_test.go +++ b/models/system/main_test.go @@ -6,12 +6,13 @@ package system_test import ( "testing" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/unittest" - _ "code.gitea.io/gitea/models" // register models - _ "code.gitea.io/gitea/models/actions" - _ "code.gitea.io/gitea/models/activities" - _ "code.gitea.io/gitea/models/system" // register models of system + _ "forgejo.org/models" // register models + _ "forgejo.org/models/actions" + _ "forgejo.org/models/activities" + _ "forgejo.org/models/forgefed" + _ "forgejo.org/models/system" // register models of system ) func TestMain(m *testing.M) { diff --git a/models/system/notice.go b/models/system/notice.go index e7ec6a9693..b1fdd2e4f2 100644 --- a/models/system/notice.go +++ b/models/system/notice.go @@ -8,11 +8,11 @@ import ( "fmt" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/storage" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/log" + "forgejo.org/modules/storage" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" ) // NoticeType describes the notice type diff --git a/models/system/notice_test.go b/models/system/notice_test.go index bfb7862fd7..4862160755 100644 --- a/models/system/notice_test.go +++ b/models/system/notice_test.go @@ -6,9 +6,9 @@ package system_test import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/system" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + "forgejo.org/models/system" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/system/setting.go b/models/system/setting.go index 4472b4c228..a57602688a 100644 --- a/models/system/setting.go +++ b/models/system/setting.go @@ -9,19 +9,19 @@ import ( "sync" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting/config" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/modules/log" + "forgejo.org/modules/setting/config" + "forgejo.org/modules/timeutil" "xorm.io/builder" ) type Setting struct { - ID int64 `xorm:"pk autoincr"` - SettingKey string `xorm:"varchar(255) unique"` // key should be lowercase - SettingValue string `xorm:"text"` - Version int `xorm:"version"` + ID int64 `xorm:"pk autoincr"` + SettingKey string `xorm:"varchar(255) unique"` // key should be lowercase + SettingValue string `xorm:"text"` + Version int Created timeutil.TimeStamp `xorm:"created"` Updated timeutil.TimeStamp `xorm:"updated"` } diff --git a/models/system/setting_test.go b/models/system/setting_test.go index 7a7fa02b01..1abaf2f16b 100644 --- a/models/system/setting_test.go +++ b/models/system/setting_test.go @@ -6,9 +6,9 @@ package system_test import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/system" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + "forgejo.org/models/system" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/unit/unit.go b/models/unit/unit.go index 5a8b9114f2..6251d44c9b 100644 --- a/models/unit/unit.go +++ b/models/unit/unit.go @@ -9,10 +9,10 @@ import ( "strings" "sync/atomic" - "code.gitea.io/gitea/models/perm" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/perm" + "forgejo.org/modules/container" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" ) // Type is Unit's Type diff --git a/models/unit/unit_test.go b/models/unit/unit_test.go index a73967742f..efcad4a405 100644 --- a/models/unit/unit_test.go +++ b/models/unit/unit_test.go @@ -6,7 +6,7 @@ package unit import ( "testing" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/unittest/consistency.go b/models/unittest/consistency.go index 4e26de7503..fd2d4b7d75 100644 --- a/models/unittest/consistency.go +++ b/models/unittest/consistency.go @@ -9,7 +9,7 @@ import ( "strings" "testing" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/unittest/fixture_loader.go b/models/unittest/fixture_loader.go new file mode 100644 index 0000000000..67ef1b28df --- /dev/null +++ b/models/unittest/fixture_loader.go @@ -0,0 +1,198 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package unittest + +import ( + "database/sql" + "encoding/hex" + "encoding/json" //nolint:depguard + "fmt" + "os" + "path/filepath" + "strings" + + "gopkg.in/yaml.v3" +) + +type insertSQL struct { + statement string + values []any +} + +type fixtureFile struct { + name string + insertSQLs []insertSQL +} + +type loader struct { + db *sql.DB + dialect string + + fixtureFiles []*fixtureFile +} + +func newFixtureLoader(db *sql.DB, dialect string, fixturePaths []string) (*loader, error) { + l := &loader{ + db: db, + dialect: dialect, + fixtureFiles: []*fixtureFile{}, + } + + // Load fixtures + for _, fixturePath := range fixturePaths { + stat, err := os.Stat(fixturePath) + if err != nil { + return nil, err + } + + // If fixture path is a directory, then read read the files of the directory + // and use those as fixture files. + if stat.IsDir() { + files, err := os.ReadDir(fixturePath) + if err != nil { + return nil, err + } + for _, file := range files { + if !file.IsDir() { + fixtureFile, err := l.buildFixtureFile(filepath.Join(fixturePath, file.Name())) + if err != nil { + return nil, err + } + l.fixtureFiles = append(l.fixtureFiles, fixtureFile) + } + } + } else { + fixtureFile, err := l.buildFixtureFile(fixturePath) + if err != nil { + return nil, err + } + l.fixtureFiles = append(l.fixtureFiles, fixtureFile) + } + } + + return l, nil +} + +// quoteKeyword returns the quoted string of keyword. +func (l *loader) quoteKeyword(keyword string) string { + switch l.dialect { + case "sqlite3": + return `"` + keyword + `"` + case "mysql": + return "`" + keyword + "`" + case "postgres": + parts := strings.Split(keyword, ".") + for i, p := range parts { + parts[i] = `"` + p + `"` + } + return strings.Join(parts, ".") + default: + return "invalid" + } +} + +// placeholder returns the placeholder string. +func (l *loader) placeholder(index int) string { + if l.dialect == "postgres" { + return fmt.Sprintf("$%d", index) + } + return "?" +} + +func (l *loader) buildFixtureFile(fixturePath string) (*fixtureFile, error) { + f, err := os.Open(fixturePath) + if err != nil { + return nil, err + } + defer f.Close() + + var records []map[string]any + if err := yaml.NewDecoder(f).Decode(&records); err != nil { + return nil, err + } + + fixture := &fixtureFile{ + name: filepath.Base(strings.TrimSuffix(f.Name(), filepath.Ext(f.Name()))), + insertSQLs: []insertSQL{}, + } + + for _, record := range records { + columns := []string{} + sqlValues := []string{} + values := []any{} + i := 1 + + for key, value := range record { + columns = append(columns, l.quoteKeyword(key)) + + switch v := value.(type) { + case string: + // Try to decode hex. + if strings.HasPrefix(v, "0x") { + value, err = hex.DecodeString(strings.TrimPrefix(v, "0x")) + if err != nil { + return nil, err + } + } + case []any: + // Decode array. + var bytes []byte + bytes, err = json.Marshal(v) + if err != nil { + return nil, err + } + value = string(bytes) + } + + values = append(values, value) + + sqlValues = append(sqlValues, l.placeholder(i)) + i++ + } + + // Construct the insert SQL. + fixture.insertSQLs = append(fixture.insertSQLs, insertSQL{ + statement: fmt.Sprintf( + "INSERT INTO %s (%s) VALUES (%s)", + l.quoteKeyword(fixture.name), + strings.Join(columns, ", "), + strings.Join(sqlValues, ", "), + ), + values: values, + }) + } + + return fixture, nil +} + +func (l *loader) Load() error { + // Start transaction. + tx, err := l.db.Begin() + if err != nil { + return err + } + + defer func() { + _ = tx.Rollback() + }() + + // Clean the table and re-insert the fixtures. + tableDeleted := map[string]struct{}{} + for _, fixture := range l.fixtureFiles { + if _, ok := tableDeleted[fixture.name]; !ok { + if _, err := tx.Exec(fmt.Sprintf("DELETE FROM %s", l.quoteKeyword(fixture.name))); err != nil { + return fmt.Errorf("cannot delete table %s: %w", fixture.name, err) + } + tableDeleted[fixture.name] = struct{}{} + } + + for _, insertSQL := range fixture.insertSQLs { + if _, err := tx.Exec(insertSQL.statement, insertSQL.values...); err != nil { + return fmt.Errorf("cannot insert %q with values %q: %w", insertSQL.statement, insertSQL.values, err) + } + } + } + + return tx.Commit() +} diff --git a/models/unittest/fixtures.go b/models/unittest/fixtures.go index 63b26a0af7..495f9a2aac 100644 --- a/models/unittest/fixtures.go +++ b/models/unittest/fixtures.go @@ -6,20 +6,18 @@ package unittest import ( "fmt" - "os" "path/filepath" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/auth/password/hash" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/db" + "forgejo.org/modules/auth/password/hash" + "forgejo.org/modules/setting" - "github.com/go-testfixtures/testfixtures/v3" "xorm.io/xorm" "xorm.io/xorm/schemas" ) -var fixturesLoader *testfixtures.Loader +var fixturesLoader *loader // GetXORMEngine gets the XORM engine func GetXORMEngine(engine ...*xorm.Engine) (x *xorm.Engine) { @@ -29,11 +27,18 @@ func GetXORMEngine(engine ...*xorm.Engine) (x *xorm.Engine) { return db.DefaultContext.(*db.Context).Engine().(*xorm.Engine) } -func OverrideFixtures(opts FixturesOptions, engine ...*xorm.Engine) func() { +func OverrideFixtures(dir string) func() { old := fixturesLoader - if err := InitFixtures(opts, engine...); err != nil { + + opts := FixturesOptions{ + Dir: filepath.Join(setting.AppWorkPath, "models/fixtures/"), + Base: setting.AppWorkPath, + Dirs: []string{dir}, + } + if err := InitFixtures(opts); err != nil { panic(err) } + return func() { fixturesLoader = old } @@ -42,19 +47,19 @@ func OverrideFixtures(opts FixturesOptions, engine ...*xorm.Engine) func() { // InitFixtures initialize test fixtures for a test database func InitFixtures(opts FixturesOptions, engine ...*xorm.Engine) (err error) { e := GetXORMEngine(engine...) - var fixtureOptionFiles func(*testfixtures.Loader) error + fixturePaths := []string{} if opts.Dir != "" { - fixtureOptionFiles = testfixtures.Directory(opts.Dir) + fixturePaths = append(fixturePaths, opts.Dir) } else { - fixtureOptionFiles = testfixtures.Files(opts.Files...) + fixturePaths = append(fixturePaths, opts.Files...) } - var fixtureOptionDirs []func(*testfixtures.Loader) error if opts.Dirs != nil { for _, dir := range opts.Dirs { - fixtureOptionDirs = append(fixtureOptionDirs, testfixtures.Directory(filepath.Join(opts.Base, dir))) + fixturePaths = append(fixturePaths, filepath.Join(opts.Base, dir)) } } - dialect := "unknown" + + var dialect string switch e.Dialect().URI().DBType { case schemas.POSTGRES: dialect = "postgres" @@ -63,22 +68,10 @@ func InitFixtures(opts FixturesOptions, engine ...*xorm.Engine) (err error) { case schemas.SQLITE: dialect = "sqlite3" default: - fmt.Println("Unsupported RDBMS for integration tests") - os.Exit(1) - } - loaderOptions := []func(loader *testfixtures.Loader) error{ - testfixtures.Database(e.DB().DB), - testfixtures.Dialect(dialect), - testfixtures.DangerousSkipTestDatabaseCheck(), - fixtureOptionFiles, - } - loaderOptions = append(loaderOptions, fixtureOptionDirs...) - - if e.Dialect().URI().DBType == schemas.POSTGRES { - loaderOptions = append(loaderOptions, testfixtures.SkipResetSequences()) + panic("Unsupported RDBMS for test") } - fixturesLoader, err = testfixtures.New(loaderOptions...) + fixturesLoader, err = newFixtureLoader(e.DB().DB, dialect, fixturePaths) if err != nil { return err } diff --git a/models/unittest/fscopy.go b/models/unittest/fscopy.go index 74b12d5057..5cd871ced6 100644 --- a/models/unittest/fscopy.go +++ b/models/unittest/fscopy.go @@ -4,99 +4,12 @@ package unittest import ( - "errors" - "io" "os" - "path" - "strings" - - "code.gitea.io/gitea/modules/util" ) -// Copy copies file from source to target path. -func Copy(src, dest string) error { - // Gather file information to set back later. - si, err := os.Lstat(src) - if err != nil { - return err - } - - // Handle symbolic link. - if si.Mode()&os.ModeSymlink != 0 { - target, err := os.Readlink(src) - if err != nil { - return err - } - // NOTE: os.Chmod and os.Chtimes don't recognize symbolic link, - // which will lead "no such file or directory" error. - return os.Symlink(target, dest) - } - - sr, err := os.Open(src) - if err != nil { - return err - } - defer sr.Close() - - dw, err := os.Create(dest) - if err != nil { - return err - } - defer dw.Close() - - if _, err = io.Copy(dw, sr); err != nil { - return err - } - - // Set back file information. - if err = os.Chtimes(dest, si.ModTime(), si.ModTime()); err != nil { - return err - } - return os.Chmod(dest, si.Mode()) -} - // CopyDir copy files recursively from source to target directory. // -// The filter accepts a function that process the path info. -// and should return true for need to filter. -// // It returns error when error occurs in underlying functions. -func CopyDir(srcPath, destPath string, filters ...func(filePath string) bool) error { - // Check if target directory exists. - if _, err := os.Stat(destPath); !errors.Is(err, os.ErrNotExist) { - return util.NewAlreadyExistErrorf("file or directory already exists: %s", destPath) - } - - err := os.MkdirAll(destPath, os.ModePerm) - if err != nil { - return err - } - - // Gather directory info. - infos, err := util.StatDir(srcPath, true) - if err != nil { - return err - } - - var filter func(filePath string) bool - if len(filters) > 0 { - filter = filters[0] - } - - for _, info := range infos { - if filter != nil && filter(info) { - continue - } - - curPath := path.Join(destPath, info) - if strings.HasSuffix(info, "/") { - err = os.MkdirAll(curPath, os.ModePerm) - } else { - err = Copy(path.Join(srcPath, info), curPath) - } - if err != nil { - return err - } - } - return nil +func CopyDir(srcPath, destPath string) error { + return os.CopyFS(destPath, os.DirFS(srcPath)) } diff --git a/models/unittest/mock_http.go b/models/unittest/mock_http.go index aea2489d2a..e749275282 100644 --- a/models/unittest/mock_http.go +++ b/models/unittest/mock_http.go @@ -15,7 +15,7 @@ import ( "strings" "testing" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -33,6 +33,11 @@ func NewMockWebServer(t *testing.T, liveServerBaseURL, testDataDir string, liveM server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { path := NormalizedFullPath(r.URL) + isGh := liveServerBaseURL == "https://api.github.com" + if isGh { + // Workaround for GitHub: trim `/api/v3` from the path + path = strings.TrimPrefix(path, "/api/v3") + } 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)) @@ -86,6 +91,10 @@ func NewMockWebServer(t *testing.T, liveServerBaseURL, testDataDir string, liveM // replace any mention of the live HTTP service by the mocked host stringFixture := strings.ReplaceAll(string(fixture), liveServerBaseURL, mockServerBaseURL) + if isGh { + // Workaround for GitHub: replace github.com by the mock server's base URL + stringFixture = strings.ReplaceAll(stringFixture, "https://github.com", mockServerBaseURL) + } // parse back the fixture file into a series of HTTP headers followed by response body lines := strings.Split(stringFixture, "\n") for idx, line := range lines { diff --git a/models/unittest/testdb.go b/models/unittest/testdb.go index 94a3253644..d34c9e9a0a 100644 --- a/models/unittest/testdb.go +++ b/models/unittest/testdb.go @@ -12,15 +12,15 @@ import ( "strings" "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/system" - "code.gitea.io/gitea/modules/auth/password/hash" - "code.gitea.io/gitea/modules/base" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/setting/config" - "code.gitea.io/gitea/modules/storage" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/models/system" + "forgejo.org/modules/auth/password/hash" + "forgejo.org/modules/base" + "forgejo.org/modules/git" + "forgejo.org/modules/setting" + "forgejo.org/modules/setting/config" + "forgejo.org/modules/storage" + "forgejo.org/modules/util" "github.com/stretchr/testify/require" "xorm.io/xorm" @@ -59,6 +59,13 @@ func InitSettings() { _ = hash.Register("dummy", hash.NewDummyHasher) setting.PasswordHashAlgo, _ = hash.SetDefaultPasswordHashAlgorithm("dummy") + setting.InitGiteaEnvVars() + + // Avoid loading the git's system config. + // On macOS, system config sets the osxkeychain credential helper, which will cause tests to freeze with a dialog. + // But we do not set it in production at the moment, because it might be a "breaking" change, + // more details are in "modules/git.commonBaseEnvs". + _ = os.Setenv("GIT_CONFIG_NOSYSTEM", "true") } // TestOptions represents test options diff --git a/models/unittest/unit_tests.go b/models/unittest/unit_tests.go index 157c676d09..a7c8e9c2fa 100644 --- a/models/unittest/unit_tests.go +++ b/models/unittest/unit_tests.go @@ -7,7 +7,7 @@ import ( "math" "testing" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/user/avatar.go b/models/user/avatar.go index c6937d7b51..27af7f774d 100644 --- a/models/user/avatar.go +++ b/models/user/avatar.go @@ -11,12 +11,12 @@ import ( "io" "strings" - "code.gitea.io/gitea/models/avatars" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/avatar" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/storage" + "forgejo.org/models/avatars" + "forgejo.org/models/db" + "forgejo.org/modules/avatar" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/storage" ) // CustomAvatarRelativePath returns user custom avatar relative path. @@ -38,14 +38,18 @@ func GenerateRandomAvatar(ctx context.Context, u *User) error { u.Avatar = avatars.HashEmail(seed) - // Don't share the images so that we can delete them easily - if err := storage.SaveFrom(storage.Avatars, u.CustomAvatarRelativePath(), func(w io.Writer) error { - if err := png.Encode(w, img); err != nil { - log.Error("Encode: %v", err) + _, err = storage.Avatars.Stat(u.CustomAvatarRelativePath()) + if err != nil { + // If unable to Stat the avatar file (usually it means non-existing), then try to save a new one + // Don't share the images so that we can delete them easily + if err := storage.SaveFrom(storage.Avatars, u.CustomAvatarRelativePath(), func(w io.Writer) error { + if err := png.Encode(w, img); err != nil { + log.Error("Encode: %v", err) + } + return nil + }); err != nil { + return fmt.Errorf("failed to save avatar %s: %w", u.CustomAvatarRelativePath(), err) } - return err - }); err != nil { - return fmt.Errorf("Failed to create dir %s: %w", u.CustomAvatarRelativePath(), err) } if _, err := db.GetEngine(ctx).ID(u.ID).Cols("avatar").Update(u); err != nil { diff --git a/models/user/avatar_test.go b/models/user/avatar_test.go new file mode 100644 index 0000000000..d3a164142d --- /dev/null +++ b/models/user/avatar_test.go @@ -0,0 +1,67 @@ +// Copyright 2024 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package user + +import ( + "io" + "strings" + "testing" + + "forgejo.org/models/db" + "forgejo.org/models/unittest" + "forgejo.org/modules/setting" + "forgejo.org/modules/storage" + "forgejo.org/modules/test" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestUserAvatarLink(t *testing.T) { + defer test.MockVariableValue(&setting.AppURL, "https://localhost/")() + defer test.MockVariableValue(&setting.AppSubURL, "")() + + u := &User{ID: 1, Avatar: "avatar.png"} + link := u.AvatarLink(db.DefaultContext) + assert.Equal(t, "https://localhost/avatars/avatar.png", link) + + setting.AppURL = "https://localhost/sub-path/" + setting.AppSubURL = "/sub-path" + link = u.AvatarLink(db.DefaultContext) + assert.Equal(t, "https://localhost/sub-path/avatars/avatar.png", link) +} + +func TestUserAvatarGenerate(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + var err error + tmpDir := t.TempDir() + storage.Avatars, err = storage.NewLocalStorage(t.Context(), &setting.Storage{Path: tmpDir}) + require.NoError(t, err) + + u := unittest.AssertExistsAndLoadBean(t, &User{ID: 2}) + + // there was no avatar, generate a new one + assert.Empty(t, u.Avatar) + err = GenerateRandomAvatar(db.DefaultContext, u) + require.NoError(t, err) + assert.NotEmpty(t, u.Avatar) + + // make sure the generated one exists + oldAvatarPath := u.CustomAvatarRelativePath() + _, err = storage.Avatars.Stat(u.CustomAvatarRelativePath()) + require.NoError(t, err) + // and try to change its content + _, err = storage.Avatars.Save(u.CustomAvatarRelativePath(), strings.NewReader("abcd"), 4) + require.NoError(t, err) + + // try to generate again + err = GenerateRandomAvatar(db.DefaultContext, u) + require.NoError(t, err) + assert.Equal(t, oldAvatarPath, u.CustomAvatarRelativePath()) + f, err := storage.Avatars.Open(u.CustomAvatarRelativePath()) + require.NoError(t, err) + defer f.Close() + content, _ := io.ReadAll(f) + assert.Equal(t, "abcd", string(content)) +} diff --git a/models/user/badge.go b/models/user/badge.go index ee52b44cf5..e54c993a37 100644 --- a/models/user/badge.go +++ b/models/user/badge.go @@ -6,7 +6,7 @@ package user import ( "context" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" ) // Badge represents a user badge diff --git a/models/user/block.go b/models/user/block.go index 189cacc2a2..2e3cfc2fa3 100644 --- a/models/user/block.go +++ b/models/user/block.go @@ -7,8 +7,8 @@ import ( "context" "errors" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/modules/timeutil" ) // ErrBlockedByUser defines an error stating that the user is not allowed to perform the action because they are blocked. diff --git a/models/user/block_test.go b/models/user/block_test.go index a795ef345e..b1674bf2ff 100644 --- a/models/user/block_test.go +++ b/models/user/block_test.go @@ -6,9 +6,9 @@ package user_test import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/user/email_address.go b/models/user/email_address.go index 8c6f24e57b..f9eaec56c9 100644 --- a/models/user/email_address.go +++ b/models/user/email_address.go @@ -7,64 +7,17 @@ package user import ( "context" "fmt" - "net/mail" - "regexp" "strings" - "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/base" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/models/db" + "forgejo.org/modules/log" + "forgejo.org/modules/optional" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" "xorm.io/builder" ) -// ErrEmailNotActivated e-mail address has not been activated error -var ErrEmailNotActivated = util.NewInvalidArgumentErrorf("e-mail address has not been activated") - -// ErrEmailCharIsNotSupported e-mail address contains unsupported character -type ErrEmailCharIsNotSupported struct { - Email string -} - -// IsErrEmailCharIsNotSupported checks if an error is an ErrEmailCharIsNotSupported -func IsErrEmailCharIsNotSupported(err error) bool { - _, ok := err.(ErrEmailCharIsNotSupported) - return ok -} - -func (err ErrEmailCharIsNotSupported) Error() string { - return fmt.Sprintf("e-mail address contains unsupported character [email: %s]", err.Email) -} - -func (err ErrEmailCharIsNotSupported) Unwrap() error { - return util.ErrInvalidArgument -} - -// ErrEmailInvalid represents an error where the email address does not comply with RFC 5322 -// or has a leading '-' character -type ErrEmailInvalid struct { - Email string -} - -// IsErrEmailInvalid checks if an error is an ErrEmailInvalid -func IsErrEmailInvalid(err error) bool { - _, ok := err.(ErrEmailInvalid) - return ok -} - -func (err ErrEmailInvalid) Error() string { - return fmt.Sprintf("e-mail invalid [email: %s]", err.Email) -} - -func (err ErrEmailInvalid) Unwrap() error { - return util.ErrInvalidArgument -} - // ErrEmailAlreadyUsed represents a "EmailAlreadyUsed" kind of error. type ErrEmailAlreadyUsed struct { Email string @@ -156,22 +109,6 @@ func UpdateEmailAddress(ctx context.Context, email *EmailAddress) error { return err } -var emailRegexp = regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$") - -// ValidateEmail check if email is a valid & allowed address -func ValidateEmail(email string) error { - if err := validateEmailBasic(email); err != nil { - return err - } - return validateEmailDomain(email) -} - -// ValidateEmailForAdmin check if email is a valid address when admins manually add or edit users -func ValidateEmailForAdmin(email string) error { - return validateEmailBasic(email) - // In this case we do not need to check the email domain -} - func GetEmailAddressByEmail(ctx context.Context, email string) (*EmailAddress, error) { ea := &EmailAddress{} if has, err := db.GetEngine(ctx).Where("lower_email=?", strings.ToLower(email)).Get(ea); err != nil { @@ -202,6 +139,38 @@ func GetPrimaryEmailAddressOfUser(ctx context.Context, uid int64) (*EmailAddress return ea, nil } +// Deletes the primary email address of the user +// This is only allowed if the user is a organization +func DeletePrimaryEmailAddressOfUser(ctx context.Context, uid int64) error { + user, err := GetUserByID(ctx, uid) + if err != nil { + return err + } + + if user.Type != UserTypeOrganization { + return fmt.Errorf("%s is not a organization", user.Name) + } + + ctx, committer, err := db.TxContext(ctx) + if err != nil { + return err + } + defer committer.Close() + + _, err = db.GetEngine(ctx).Exec("DELETE FROM email_address WHERE uid = ? AND is_primary = true", uid) + if err != nil { + return err + } + + user.Email = "" + err = UpdateUserCols(ctx, user, "email") + if err != nil { + return err + } + + return committer.Commit() +} + // GetEmailAddresses returns all email addresses belongs to given user. func GetEmailAddresses(ctx context.Context, uid int64) ([]*EmailAddress, error) { emails := make([]*EmailAddress, 0, 5) @@ -307,23 +276,6 @@ func updateActivation(ctx context.Context, email *EmailAddress, activate bool) e return UpdateUserCols(ctx, user, "rands") } -// VerifyActiveEmailCode verifies active email code when active account -func VerifyActiveEmailCode(ctx context.Context, code, email string) *EmailAddress { - if user := GetVerifyUser(ctx, code); user != nil { - // time limit code - prefix := code[:base.TimeLimitCodeLength] - data := fmt.Sprintf("%d%s%s%s%s", user.ID, email, user.LowerName, user.Passwd, user.Rands) - - if base.VerifyTimeLimitCode(time.Now(), data, setting.Service.ActiveCodeLives, prefix) { - emailAddress := &EmailAddress{UID: user.ID, Email: email} - if has, _ := db.GetEngine(ctx).Get(emailAddress); has { - return emailAddress - } - } - } - return nil -} - // SearchEmailOrderBy is used to sort the results from SearchEmails() type SearchEmailOrderBy string @@ -462,41 +414,3 @@ func ActivateUserEmail(ctx context.Context, userID int64, email string, activate return committer.Commit() } - -// validateEmailBasic checks whether the email complies with the rules -func validateEmailBasic(email string) error { - if len(email) == 0 { - return ErrEmailInvalid{email} - } - - if !emailRegexp.MatchString(email) { - return ErrEmailCharIsNotSupported{email} - } - - if email[0] == '-' { - return ErrEmailInvalid{email} - } - - if _, err := mail.ParseAddress(email); err != nil { - return ErrEmailInvalid{email} - } - - return nil -} - -// validateEmailDomain checks whether the email domain is allowed or blocked -func validateEmailDomain(email string) error { - if !IsEmailDomainAllowed(email) { - return ErrEmailInvalid{email} - } - - return nil -} - -func IsEmailDomainAllowed(email string) bool { - if len(setting.Service.EmailDomainAllowList) == 0 { - return !validation.IsEmailDomainListed(setting.Service.EmailDomainBlockList, email) - } - - return validation.IsEmailDomainListed(setting.Service.EmailDomainAllowList, email) -} diff --git a/models/user/email_address_test.go b/models/user/email_address_test.go index b918f21018..1801f57a23 100644 --- a/models/user/email_address_test.go +++ b/models/user/email_address_test.go @@ -7,10 +7,10 @@ import ( "fmt" "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/optional" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/optional" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -130,63 +130,6 @@ func TestListEmails(t *testing.T) { assert.Greater(t, count, int64(len(emails))) } -func TestEmailAddressValidate(t *testing.T) { - kases := map[string]error{ - "abc@gmail.com": nil, - "132@hotmail.com": nil, - "1-3-2@test.org": nil, - "1.3.2@test.org": nil, - "a_123@test.org.cn": nil, - `first.last@iana.org`: nil, - `first!last@iana.org`: nil, - `first#last@iana.org`: nil, - `first$last@iana.org`: nil, - `first%last@iana.org`: nil, - `first&last@iana.org`: nil, - `first'last@iana.org`: nil, - `first*last@iana.org`: nil, - `first+last@iana.org`: nil, - `first/last@iana.org`: nil, - `first=last@iana.org`: nil, - `first?last@iana.org`: nil, - `first^last@iana.org`: nil, - "first`last@iana.org": nil, - `first{last@iana.org`: nil, - `first|last@iana.org`: nil, - `first}last@iana.org`: nil, - `first~last@iana.org`: nil, - `first;last@iana.org`: user_model.ErrEmailCharIsNotSupported{`first;last@iana.org`}, - ".233@qq.com": user_model.ErrEmailInvalid{".233@qq.com"}, - "!233@qq.com": nil, - "#233@qq.com": nil, - "$233@qq.com": nil, - "%233@qq.com": nil, - "&233@qq.com": nil, - "'233@qq.com": nil, - "*233@qq.com": nil, - "+233@qq.com": nil, - "-233@qq.com": user_model.ErrEmailInvalid{"-233@qq.com"}, - "/233@qq.com": nil, - "=233@qq.com": nil, - "?233@qq.com": nil, - "^233@qq.com": nil, - "_233@qq.com": nil, - "`233@qq.com": nil, - "{233@qq.com": nil, - "|233@qq.com": nil, - "}233@qq.com": nil, - "~233@qq.com": nil, - ";233@qq.com": user_model.ErrEmailCharIsNotSupported{";233@qq.com"}, - "Foo ": user_model.ErrEmailCharIsNotSupported{"Foo "}, - string([]byte{0xE2, 0x84, 0xAA}): user_model.ErrEmailCharIsNotSupported{string([]byte{0xE2, 0x84, 0xAA})}, - } - for kase, err := range kases { - t.Run(kase, func(t *testing.T) { - assert.EqualValues(t, err, user_model.ValidateEmail(kase)) - }) - } -} - func TestGetActivatedEmailAddresses(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) @@ -220,3 +163,21 @@ func TestGetActivatedEmailAddresses(t *testing.T) { }) } } + +func TestDeletePrimaryEmailAddressOfUser(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + user, err := user_model.GetUserByName(db.DefaultContext, "org3") + require.NoError(t, err) + assert.Equal(t, "org3@example.com", user.Email) + + require.NoError(t, user_model.DeletePrimaryEmailAddressOfUser(db.DefaultContext, user.ID)) + + user, err = user_model.GetUserByName(db.DefaultContext, "org3") + require.NoError(t, err) + assert.Empty(t, user.Email) + + email, err := user_model.GetPrimaryEmailAddressOfUser(db.DefaultContext, user.ID) + assert.True(t, user_model.IsErrEmailAddressNotExist(err)) + assert.Nil(t, email) +} diff --git a/models/user/error.go b/models/user/error.go index cbf19998d1..a0fc1af2bd 100644 --- a/models/user/error.go +++ b/models/user/error.go @@ -6,7 +6,7 @@ package user import ( "fmt" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/util" ) // ErrUserAlreadyExist represents a "user already exists" error. @@ -71,27 +71,6 @@ func (err ErrUserProhibitLogin) Unwrap() error { return util.ErrPermissionDenied } -// ErrUserInactive represents a "ErrUserInactive" kind of error. -type ErrUserInactive struct { - UID int64 - Name string -} - -// IsErrUserInactive checks if an error is a ErrUserInactive -func IsErrUserInactive(err error) bool { - _, ok := err.(ErrUserInactive) - return ok -} - -func (err ErrUserInactive) Error() string { - return fmt.Sprintf("user is inactive [uid: %d, name: %s]", err.UID, err.Name) -} - -// Unwrap unwraps this error as a ErrPermission error -func (err ErrUserInactive) Unwrap() error { - return util.ErrPermissionDenied -} - // ErrUserIsNotLocal represents a "ErrUserIsNotLocal" kind of error. type ErrUserIsNotLocal struct { UID int64 diff --git a/models/user/external_login_user.go b/models/user/external_login_user.go index 0e764efb9f..f13454c38a 100644 --- a/models/user/external_login_user.go +++ b/models/user/external_login_user.go @@ -8,8 +8,8 @@ import ( "fmt" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/util" "xorm.io/builder" ) @@ -160,34 +160,12 @@ func UpdateExternalUserByExternalID(ctx context.Context, external *ExternalLogin return err } -// EnsureLinkExternalToUser link the external user to the user -func EnsureLinkExternalToUser(ctx context.Context, external *ExternalLoginUser) error { - has, err := db.Exist[ExternalLoginUser](ctx, builder.Eq{ - "external_id": external.ExternalID, - "login_source_id": external.LoginSourceID, - }) - if err != nil { - return err - } - - if has { - _, err = db.GetEngine(ctx).Where("external_id=? AND login_source_id=?", external.ExternalID, external.LoginSourceID).AllCols().Update(external) - return err - } - - _, err = db.GetEngine(ctx).Insert(external) - return err -} - // FindExternalUserOptions represents an options to find external users type FindExternalUserOptions struct { db.ListOptions - Provider string - UserID int64 - LoginSourceID int64 - HasRefreshToken bool - Expired bool - OrderBy string + Provider string + UserID int64 + OrderBy string } func (opts FindExternalUserOptions) ToConds() builder.Cond { @@ -198,22 +176,9 @@ func (opts FindExternalUserOptions) ToConds() builder.Cond { if opts.UserID > 0 { cond = cond.And(builder.Eq{"user_id": opts.UserID}) } - if opts.Expired { - cond = cond.And(builder.Lt{"expires_at": time.Now()}) - } - if opts.HasRefreshToken { - cond = cond.And(builder.Neq{"refresh_token": ""}) - } - if opts.LoginSourceID != 0 { - cond = cond.And(builder.Eq{"login_source_id": opts.LoginSourceID}) - } return cond } func (opts FindExternalUserOptions) ToOrders() string { return opts.OrderBy } - -func IterateExternalLogin(ctx context.Context, opts FindExternalUserOptions, f func(ctx context.Context, u *ExternalLoginUser) error) error { - return db.Iterate(ctx, opts.ToConds(), f) -} diff --git a/models/user/federated_user.go b/models/user/federated_user.go index 1fc42c3c32..fc07836408 100644 --- a/models/user/federated_user.go +++ b/models/user/federated_user.go @@ -4,7 +4,7 @@ package user import ( - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/validation" ) type FederatedUser struct { diff --git a/models/user/federated_user_test.go b/models/user/federated_user_test.go index 6a2112666f..374236f6d3 100644 --- a/models/user/federated_user_test.go +++ b/models/user/federated_user_test.go @@ -6,7 +6,7 @@ package user import ( "testing" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/validation" ) func Test_FederatedUserValidation(t *testing.T) { diff --git a/models/user/follow.go b/models/user/follow.go index 9c3283b888..5be0f73c35 100644 --- a/models/user/follow.go +++ b/models/user/follow.go @@ -6,8 +6,8 @@ package user import ( "context" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/modules/timeutil" ) // Follow represents relations of user and their followers. diff --git a/models/user/follow_test.go b/models/user/follow_test.go index 8c56164ee3..976225a4a8 100644 --- a/models/user/follow_test.go +++ b/models/user/follow_test.go @@ -6,9 +6,9 @@ package user_test import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/user/list.go b/models/user/list.go index ca589d1e02..71c96c8565 100644 --- a/models/user/list.go +++ b/models/user/list.go @@ -7,8 +7,8 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/auth" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/auth" + "forgejo.org/models/db" ) // UserList is a list of user. diff --git a/models/user/main_test.go b/models/user/main_test.go index a626d323a7..f0dae086e0 100644 --- a/models/user/main_test.go +++ b/models/user/main_test.go @@ -6,12 +6,13 @@ package user_test import ( "testing" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/unittest" - _ "code.gitea.io/gitea/models" - _ "code.gitea.io/gitea/models/actions" - _ "code.gitea.io/gitea/models/activities" - _ "code.gitea.io/gitea/models/user" + _ "forgejo.org/models" + _ "forgejo.org/models/actions" + _ "forgejo.org/models/activities" + _ "forgejo.org/models/forgefed" + _ "forgejo.org/models/user" ) func TestMain(m *testing.M) { diff --git a/models/user/must_change_password.go b/models/user/must_change_password.go index 7eab08de89..5503f503b5 100644 --- a/models/user/must_change_password.go +++ b/models/user/must_change_password.go @@ -7,8 +7,8 @@ import ( "context" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/util" "xorm.io/builder" ) diff --git a/models/user/openid.go b/models/user/openid.go index ee4ecabae0..96b00255a3 100644 --- a/models/user/openid.go +++ b/models/user/openid.go @@ -7,8 +7,8 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/util" ) // ErrOpenIDNotExist openid is not known diff --git a/models/user/openid_test.go b/models/user/openid_test.go index c2857aac98..3c55891c1f 100644 --- a/models/user/openid_test.go +++ b/models/user/openid_test.go @@ -6,9 +6,9 @@ package user_test import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/user/redirect.go b/models/user/redirect.go index 5a40d4df3b..75876f17d2 100644 --- a/models/user/redirect.go +++ b/models/user/redirect.go @@ -6,10 +6,17 @@ package user import ( "context" "fmt" + "slices" + "strconv" "strings" + "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" + + "xorm.io/builder" ) // ErrUserRedirectNotExist represents a "UserRedirectNotExist" kind of error. @@ -31,11 +38,25 @@ func (err ErrUserRedirectNotExist) Unwrap() error { return util.ErrNotExist } +type ErrCooldownPeriod struct { + ExpireTime time.Time +} + +func IsErrCooldownPeriod(err error) bool { + _, ok := err.(ErrCooldownPeriod) + return ok +} + +func (err ErrCooldownPeriod) Error() string { + return fmt.Sprintf("cooldown period for claiming this username has not yet expired: the cooldown period ends at %s", err.ExpireTime) +} + // Redirect represents that a user name should be redirected to another type Redirect struct { - ID int64 `xorm:"pk autoincr"` - LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL"` - RedirectUserID int64 // userID to redirect to + ID int64 `xorm:"pk autoincr"` + LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL"` + RedirectUserID int64 // userID to redirect to + CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL DEFAULT 0"` } // TableName provides the real table name @@ -47,14 +68,24 @@ func init() { db.RegisterModel(new(Redirect)) } -// LookupUserRedirect look up userID if a user has a redirect name -func LookupUserRedirect(ctx context.Context, userName string) (int64, error) { +// GetUserRedirect returns the redirect for a given username, this is a +// case-insensitive operation. +func GetUserRedirect(ctx context.Context, userName string) (*Redirect, error) { userName = strings.ToLower(userName) redirect := &Redirect{LowerName: userName} if has, err := db.GetEngine(ctx).Get(redirect); err != nil { - return 0, err + return nil, err } else if !has { - return 0, ErrUserRedirectNotExist{Name: userName} + return nil, ErrUserRedirectNotExist{Name: userName} + } + 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 } @@ -78,6 +109,19 @@ func NewUserRedirect(ctx context.Context, ID int64, oldUserName, newUserName str }) } +// LimitUserRedirects deletes the oldest entries in user_redirect of the user, +// such that the amount of user_redirects is at most `n` amount of entries. +func LimitUserRedirects(ctx context.Context, userID, n int64) error { + // NOTE: It's not possible to combine these two queries into one due to a limitation of MySQL. + keepIDs := make([]int64, n) + if err := db.GetEngine(ctx).SQL("SELECT id FROM user_redirect WHERE redirect_user_id = ? ORDER BY created_unix DESC LIMIT "+strconv.FormatInt(n, 10), userID).Find(&keepIDs); err != nil { + return err + } + + _, err := db.GetEngine(ctx).Exec(builder.Delete(builder.And(builder.Eq{"redirect_user_id": userID}, builder.NotIn("id", keepIDs))).From("user_redirect")) + return err +} + // DeleteUserRedirect delete any redirect from the specified user name to // anything else func DeleteUserRedirect(ctx context.Context, userName string) error { @@ -85,3 +129,46 @@ func DeleteUserRedirect(ctx context.Context, userName string) error { _, err := db.GetEngine(ctx).Delete(&Redirect{LowerName: userName}) return err } + +// CanClaimUsername returns if its possible to claim the given username, +// it checks if the cooldown period for claiming an existing username is over. +// If there's a cooldown period, the second argument returns the time when +// that cooldown period is over. +// In the scenario of renaming, the doerID can be specified to allow the original +// user of the username to reclaim it within the cooldown period. +func CanClaimUsername(ctx context.Context, username string, doerID int64) (bool, time.Time, error) { + // Only check for a cooldown period if UsernameCooldownPeriod is a positive number. + if setting.Service.UsernameCooldownPeriod <= 0 { + return true, time.Time{}, nil + } + + userRedirect, err := GetUserRedirect(ctx, username) + if err != nil { + if IsErrUserRedirectNotExist(err) { + return true, time.Time{}, nil + } + return false, time.Time{}, err + } + + // Allow reclaiming of user's own username. + if userRedirect.RedirectUserID == doerID { + return true, time.Time{}, nil + } + + // We do not know if the redirect user id was for an organization, so + // unconditionally execute the following query to retrieve all users that + // are part of the "Owner" team. If the redirect user ID is not an organization + // the returned list would be empty. + ownerTeamUIDs := []int64{} + if err := db.GetEngine(ctx).SQL("SELECT uid FROM team_user INNER JOIN team ON team_user.`team_id` = team.`id` WHERE team.`org_id` = ? AND team.`name` = 'Owners'", userRedirect.RedirectUserID).Find(&ownerTeamUIDs); err != nil { + return false, time.Time{}, err + } + + if slices.Contains(ownerTeamUIDs, doerID) { + return true, time.Time{}, nil + } + + // Multiply the value of UsernameCooldownPeriod by the amount of seconds in a day. + expireTime := userRedirect.CreatedUnix.Add(86400 * setting.Service.UsernameCooldownPeriod).AsLocalTime() + return time.Until(expireTime) <= 0, expireTime, nil +} diff --git a/models/user/redirect_test.go b/models/user/redirect_test.go index 35fd29aa5d..c598fb045f 100644 --- a/models/user/redirect_test.go +++ b/models/user/redirect_test.go @@ -6,9 +6,9 @@ package user_test import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/user/search.go b/models/user/search.go index 04c434e4fa..d2b9901823 100644 --- a/models/user/search.go +++ b/models/user/search.go @@ -8,10 +8,10 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/structs" + "forgejo.org/models/db" + "forgejo.org/modules/container" + "forgejo.org/modules/optional" + "forgejo.org/modules/structs" "xorm.io/builder" "xorm.io/xorm" @@ -24,8 +24,8 @@ type SearchUserOptions struct { Keyword string Type UserType UID int64 - LoginName string // this option should be used only for admin user - SourceID int64 // this option should be used only for admin user + LoginName string // this option should be used only for admin user + SourceID optional.Option[int64] // this option should be used only for admin user OrderBy db.SearchOrderBy Visible []structs.VisibleType Actor *User // The user doing the search @@ -40,6 +40,7 @@ type SearchUserOptions struct { IsProhibitLogin optional.Option[bool] IncludeReserved bool + Load2FAStatus bool ExtraParamStrings map[string]string } @@ -69,7 +70,19 @@ func (opts *SearchUserOptions) toSearchQueryBase(ctx context.Context) *xorm.Sess builder.Like{"LOWER(full_name)", lowerKeyword}, ) if opts.SearchByEmail { - keywordCond = keywordCond.Or(builder.Like{"LOWER(email)", lowerKeyword}) + var emailCond builder.Cond + emailCond = builder.Like{"LOWER(email)", lowerKeyword} + if opts.Actor == nil { + emailCond = emailCond.And(builder.Eq{"keep_email_private": false}) + } else if !opts.Actor.IsAdmin { + emailCond = emailCond.And( + builder.Or( + builder.Eq{"keep_email_private": false}, + builder.Eq{"id": opts.Actor.ID}, + ), + ) + } + keywordCond = keywordCond.Or(emailCond) } cond = cond.And(keywordCond) @@ -86,8 +99,8 @@ func (opts *SearchUserOptions) toSearchQueryBase(ctx context.Context) *xorm.Sess cond = cond.And(builder.Eq{"id": opts.UID}) } - if opts.SourceID > 0 { - cond = cond.And(builder.Eq{"login_source": opts.SourceID}) + if opts.SourceID.Has() { + cond = cond.And(builder.Eq{"login_source": opts.SourceID.Value()}) } if opts.LoginName != "" { cond = cond.And(builder.Eq{"login_name": opts.LoginName}) @@ -114,17 +127,15 @@ func (opts *SearchUserOptions) toSearchQueryBase(ctx context.Context) *xorm.Sess return e.Where(cond) } - // 2fa filter uses LEFT JOIN to check whether a user has a 2fa record - // While using LEFT JOIN, sometimes the performance might not be good, but it won't be a problem now, such SQL is seldom executed. - // There are some possible methods to refactor this SQL in future when we really need to optimize the performance (but not now): - // (1) add a column in user table (2) add a setting value in user_setting table (3) use search engines (bleve/elasticsearch) + // Check if the user has two factor enabled, which is TOTP or Webauthn. if opts.IsTwoFactorEnabled.Value() { - cond = cond.And(builder.Expr("two_factor.uid IS NOT NULL")) + cond = cond.And(builder.Expr("two_factor.uid IS NOT NULL OR webauthn_credential.user_id IS NOT NULL")) } else { - cond = cond.And(builder.Expr("two_factor.uid IS NULL")) + cond = cond.And(builder.Expr("two_factor.uid IS NULL AND webauthn_credential.user_id IS NULL")) } return e.Join("LEFT OUTER", "two_factor", "two_factor.uid = `user`.id"). + Join("LEFT OUTER", "webauthn_credential", "webauthn_credential.user_id = `user`.id"). Where(cond) } diff --git a/models/user/setting.go b/models/user/setting.go index b4af0e5ccd..a915119ad2 100644 --- a/models/user/setting.go +++ b/models/user/setting.go @@ -8,10 +8,10 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/cache" - setting_module "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/db" + "forgejo.org/modules/cache" + setting_module "forgejo.org/modules/setting" + "forgejo.org/modules/util" "xorm.io/builder" ) diff --git a/models/user/setting_test.go b/models/user/setting_test.go index 0b05c54ee6..7b6658041f 100644 --- a/models/user/setting_test.go +++ b/models/user/setting_test.go @@ -6,9 +6,9 @@ package user_test import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/user/user.go b/models/user/user.go index b1731021fd..a0ee1e81b4 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -7,7 +7,9 @@ package user import ( "context" + "crypto/subtle" "encoding/hex" + "errors" "fmt" "net/mail" "net/url" @@ -19,20 +21,20 @@ import ( _ "image/jpeg" // Needed for jpeg support - "code.gitea.io/gitea/models/auth" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/auth/openid" - "code.gitea.io/gitea/modules/auth/password/hash" - "code.gitea.io/gitea/modules/base" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/models/auth" + "forgejo.org/models/db" + "forgejo.org/modules/auth/openid" + "forgejo.org/modules/auth/password/hash" + "forgejo.org/modules/base" + "forgejo.org/modules/container" + "forgejo.org/modules/git" + "forgejo.org/modules/log" + "forgejo.org/modules/optional" + "forgejo.org/modules/setting" + "forgejo.org/modules/structs" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" + "forgejo.org/modules/validation" "golang.org/x/text/runes" "golang.org/x/text/transform" @@ -48,19 +50,19 @@ const ( UserTypeIndividual UserType = iota // Historic reason to make it starts at 0. // UserTypeOrganization defines an organization - UserTypeOrganization + UserTypeOrganization // 1 // UserTypeUserReserved reserves a (non-existing) user, i.e. to prevent a spam user from re-registering after being deleted, or to reserve the name until the user is actually created later on - UserTypeUserReserved + UserTypeUserReserved // 2 // UserTypeOrganizationReserved reserves a (non-existing) organization, to be used in combination with UserTypeUserReserved - UserTypeOrganizationReserved + UserTypeOrganizationReserved // 3 // UserTypeBot defines a bot user - UserTypeBot + UserTypeBot // 4 // UserTypeRemoteUser defines a remote user for federated users - UserTypeRemoteUser + UserTypeRemoteUser // 5 ) const ( @@ -152,6 +154,7 @@ type User struct { DiffViewStyle string `xorm:"NOT NULL DEFAULT ''"` Theme string `xorm:"NOT NULL DEFAULT ''"` KeepActivityPrivate bool `xorm:"NOT NULL DEFAULT false"` + KeepPronounsPrivate bool `xorm:"NOT NULL DEFAULT false"` EnableRepoUnitHints bool `xorm:"NOT NULL DEFAULT true"` } @@ -318,15 +321,14 @@ func (u *User) OrganisationLink() string { return setting.AppSubURL + "/org/" + url.PathEscape(u.Name) } -// GenerateEmailActivateCode generates an activate code based on user information and given e-mail. -func (u *User) GenerateEmailActivateCode(email string) string { - code := base.CreateTimeLimitCode( - fmt.Sprintf("%d%s%s%s%s", u.ID, email, u.LowerName, u.Passwd, u.Rands), - setting.Service.ActiveCodeLives, time.Now(), nil) - - // Add tail hex username - code += hex.EncodeToString([]byte(u.LowerName)) - return code +// GenerateEmailAuthorizationCode generates an activation code based for the user for the specified purpose. +// The standard expiry is ActiveCodeLives minutes. +func (u *User) GenerateEmailAuthorizationCode(ctx context.Context, purpose auth.AuthorizationPurpose) (string, error) { + lookup, validator, err := auth.GenerateAuthToken(ctx, u.ID, timeutil.TimeStampNow().Add(int64(setting.Service.ActiveCodeLives)*60), purpose) + if err != nil { + return "", err + } + return lookup + ":" + validator, nil } // GetUserFollowers returns range of user's followers. @@ -338,7 +340,7 @@ func GetUserFollowers(ctx context.Context, u, viewer *User, listOptions db.ListO And("`user`.type=?", UserTypeIndividual). And(isUserVisibleToViewerCond(viewer)) - if listOptions.Page != 0 { + if listOptions.Page > 0 { sess = db.SetSessionPagination(sess, &listOptions) users := make([]*User, 0, listOptions.PageSize) @@ -360,7 +362,7 @@ func GetUserFollowing(ctx context.Context, u, viewer *User, listOptions db.ListO And("`user`.type IN (?, ?)", UserTypeIndividual, UserTypeOrganization). And(isUserVisibleToViewerCond(viewer)) - if listOptions.Page != 0 { + if listOptions.Page > 0 { sess = db.SetSessionPagination(sess, &listOptions) users := make([]*User, 0, listOptions.PageSize) @@ -421,6 +423,10 @@ func (u *User) IsIndividual() bool { return u.Type == UserTypeIndividual } +func (u *User) IsUser() bool { + return u.Type == UserTypeIndividual || u.Type == UserTypeBot +} + // IsBot returns whether or not the user is of type bot func (u *User) IsBot() bool { return u.Type == UserTypeBot @@ -495,6 +501,16 @@ func (u *User) GetCompleteName() string { return u.Name } +// GetPronouns returns an empty string, if the user has set to keep his +// pronouns private from non-logged in users, otherwise the pronouns +// are returned. +func (u *User) GetPronouns(signed bool) string { + if u.KeepPronounsPrivate && !signed { + return "" + } + return u.Pronouns +} + func gitSafeName(name string) string { return strings.TrimSpace(strings.NewReplacer("\n", "", "<", "", ">", "").Replace(name)) } @@ -560,7 +576,7 @@ func GetUserSalt() (string, error) { // Note: The set of characters here can safely expand without a breaking change, // but characters removed from this set can cause user account linking to break var ( - customCharsReplacement = strings.NewReplacer("Æ", "AE") + customCharsReplacement = strings.NewReplacer("Æ", "AE", "ß", "ss") removeCharsRE = regexp.MustCompile(`['´\x60]`) removeDiacriticsTransform = transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC) replaceCharsHyphenRE = regexp.MustCompile(`[\s~+]`) @@ -581,45 +597,48 @@ var ( reservedUsernames = []string{ ".", "..", + "-", // used by certain web routes ".well-known", - "admin", - "api", - "assets", - "attachments", - "avatar", - "avatars", - "captcha", - "commits", - "debug", - "devtest", - "error", - "explore", - "favicon.ico", - "ghost", - "issues", - "login", - "manifest.json", - "metrics", - "milestones", - "new", - "notifications", - "org", - "pulls", - "raw", - "repo", + + "api", // gitea api + "metrics", // prometheus metrics api + "v2", // container registry api + + "assets", // static asset files + "attachments", // issue attachments + + "avatar", // avatar by email hash + "avatars", // user avatars by file name "repo-avatars", - "robots.txt", - "search", - "serviceworker.js", - "ssh_info", + + "captcha", + "login", // oauth2 login + "org", // org create/manage, or "/org/{org}", BUT if an org is named as "invite" then it goes wrong + "repo", // repo create/migrate, etc + "user", // user login/activate/settings, etc + + "admin", + "devtest", + "explore", + "issues", + "pulls", + "milestones", + "notifications", + + "favicon.ico", + "manifest.json", // web app manifests + "robots.txt", // search engine robots + "sitemap.xml", // search engine sitemap + "ssh_info", // agit info "swagger.v1.json", - "user", - "v2", - "gitea-actions", - "forgejo-actions", + + "ghost", // reserved name for deleted users (id: -1) + "gitea-actions", // gitea builtin user (id: -2) + "forgejo-actions", // forgejo builtin user (id: -2) } - // DON'T ADD ANY NEW STUFF, WE SOLVE THIS WITH `/user/{obj}` PATHS! + // These names are reserved for user accounts: user's keys, user's rss feed, user's avatar, etc. + // DO NOT add any new stuff! The paths with these names are processed by `/{username}` handler (UsernameSubRoute) manually. reservedUserPatterns = []string{"*.keys", "*.gpg", "*.rss", "*.atom", "*.png"} ) @@ -661,6 +680,18 @@ func createUser(ctx context.Context, u *User, createdByAdmin bool, overwriteDefa return err } + // Check if the new username can be claimed. + // Skip this check if done by an admin. + if !createdByAdmin { + if ok, expireTime, err := CanClaimUsername(ctx, u.Name, -1); err != nil { + return err + } else if !ok { + return ErrCooldownPeriod{ + ExpireTime: expireTime, + } + } + } + // set system defaults u.KeepEmailPrivate = setting.Service.DefaultKeepEmailPrivate u.Visibility = setting.Service.DefaultUserVisibilityMode @@ -711,11 +742,11 @@ func createUser(ctx context.Context, u *User, createdByAdmin bool, overwriteDefa } if createdByAdmin { - if err := ValidateEmailForAdmin(u.Email); err != nil { + if err := validation.ValidateEmailForAdmin(u.Email); err != nil { return err } } else { - if err := ValidateEmail(u.Email); err != nil { + if err := validation.ValidateEmail(u.Email); err != nil { return err } } @@ -832,35 +863,48 @@ func countUsers(ctx context.Context, opts *CountUserFilter) int64 { return count } -// GetVerifyUser get user by verify code -func GetVerifyUser(ctx context.Context, code string) (user *User) { - if len(code) <= base.TimeLimitCodeLength { - return nil +// VerifyUserActiveCode verifies that the code is valid for the given purpose for this user. +// If delete is specified, the token will be deleted. +func VerifyUserAuthorizationToken(ctx context.Context, code string, purpose auth.AuthorizationPurpose) (user *User, deleteToken func() error, err error) { + lookupKey, validator, found := strings.Cut(code, ":") + if !found { + return nil, nil, nil } - // use tail hex username query user - hexStr := code[base.TimeLimitCodeLength:] - if b, err := hex.DecodeString(hexStr); err == nil { - if user, err = GetUserByName(ctx, string(b)); user != nil { - return user + authToken, err := auth.FindAuthToken(ctx, lookupKey, purpose) + if err != nil { + if errors.Is(err, util.ErrNotExist) { + return nil, nil, nil } - log.Error("user.getVerifyUser: %v", err) + return nil, nil, err } - return nil -} + if authToken.IsExpired() { + return nil, nil, auth.DeleteAuthToken(ctx, authToken) + } -// VerifyUserActiveCode verifies active code when active account -func VerifyUserActiveCode(ctx context.Context, code string) (user *User) { - if user = GetVerifyUser(ctx, code); user != nil { - // time limit code - prefix := code[:base.TimeLimitCodeLength] - data := fmt.Sprintf("%d%s%s%s%s", user.ID, user.Email, user.LowerName, user.Passwd, user.Rands) - if base.VerifyTimeLimitCode(time.Now(), data, setting.Service.ActiveCodeLives, prefix) { - return user + rawValidator, err := hex.DecodeString(validator) + if err != nil { + return nil, nil, err + } + + if subtle.ConstantTimeCompare([]byte(authToken.HashedValidator), []byte(auth.HashValidator(rawValidator))) == 0 { + return nil, nil, errors.New("validator doesn't match") + } + + u, err := GetUserByID(ctx, authToken.UID) + if err != nil { + if IsErrUserNotExist(err) { + return nil, nil, nil } + return nil, nil, err } - return nil + + deleteToken = func() error { + return auth.DeleteAuthToken(ctx, authToken) + } + + return u, deleteToken, nil } // ValidateUser check if user is valid to insert / update into database @@ -879,7 +923,7 @@ func (u User) Validate() []string { if err := ValidateUser(&u); err != nil { result = append(result, err.Error()) } - if err := ValidateEmail(u.Email); err != nil { + if err := validation.ValidateEmail(u.Email); err != nil { result = append(result, err.Error()) } return result @@ -897,7 +941,13 @@ func UpdateUserCols(ctx context.Context, u *User, cols ...string) error { // GetInactiveUsers gets all inactive users func GetInactiveUsers(ctx context.Context, olderThan time.Duration) ([]*User, error) { - var cond builder.Cond = builder.Eq{"is_active": false} + cond := builder.And( + builder.Eq{"is_active": false}, + builder.Or( // only plain user + builder.Eq{"`type`": UserTypeIndividual}, + builder.Eq{"`type`": UserTypeUserReserved}, + ), + ) if olderThan > 0 { cond = cond.And(builder.Lt{"created_unix": time.Now().Add(-olderThan).Unix()}) @@ -1002,22 +1052,6 @@ func GetUserByName(ctx context.Context, name string) (*User, error) { return u, nil } -// GetUserEmailsByNames returns a list of e-mails corresponds to names of users -// that have their email notifications set to enabled or onmention. -func GetUserEmailsByNames(ctx context.Context, names []string) []string { - mails := make([]string, 0, len(names)) - for _, name := range names { - u, err := GetUserByName(ctx, name) - if err != nil { - continue - } - if u.IsMailable() && u.EmailNotificationsPreference != EmailNotificationsDisabled { - mails = append(mails, u.Email) - } - } - return mails -} - // GetMaileableUsersByIDs gets users from ids, but only if they can receive mails func GetMaileableUsersByIDs(ctx context.Context, ids []int64, isMention bool) ([]*User, error) { if len(ids) == 0 { @@ -1044,17 +1078,6 @@ func GetMaileableUsersByIDs(ctx context.Context, ids []int64, isMention bool) ([ Find(&ous) } -// GetUserNamesByIDs returns usernames for all resolved users from a list of Ids. -func GetUserNamesByIDs(ctx context.Context, ids []int64) ([]string, error) { - unames := make([]string, 0, len(ids)) - err := db.GetEngine(ctx).In("id", ids). - Table("user"). - Asc("name"). - Cols("name"). - Find(&unames) - return unames, err -} - // GetUserNameByID returns username for the id func GetUserNameByID(ctx context.Context, id int64) (string, error) { var name string diff --git a/models/user/user_repository.go b/models/user/user_repository.go index c06441b5c8..172bf7c8b4 100644 --- a/models/user/user_repository.go +++ b/models/user/user_repository.go @@ -7,9 +7,9 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/models/db" + "forgejo.org/modules/optional" + "forgejo.org/modules/validation" ) func init() { diff --git a/models/user/user_system.go b/models/user/user_system.go index ba9a2131b2..f1585b512a 100644 --- a/models/user/user_system.go +++ b/models/user/user_system.go @@ -1,4 +1,5 @@ // Copyright 2022 The Gitea Authors. All rights reserved. +// Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package user @@ -7,8 +8,8 @@ import ( "net/url" "strings" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/structs" + "forgejo.org/modules/setting" + "forgejo.org/modules/structs" ) const ( @@ -95,3 +96,7 @@ func APActorUserAPActorID() string { path, _ := url.JoinPath(setting.AppURL, "/api/v1/activitypub/actor") return path } + +func (u *User) IsAPActor() bool { + return u != nil && u.ID == APActorUserID +} diff --git a/models/user/user_test.go b/models/user/user_test.go index 8f4350f776..7c89337510 100644 --- a/models/user/user_test.go +++ b/models/user/user_test.go @@ -5,24 +5,26 @@ package user_test import ( - "context" "crypto/rand" + "encoding/hex" "fmt" "strings" "testing" "time" - "code.gitea.io/gitea/models/auth" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/auth/password/hash" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/tests" + "forgejo.org/models/auth" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/auth/password/hash" + "forgejo.org/modules/container" + "forgejo.org/modules/optional" + "forgejo.org/modules/setting" + "forgejo.org/modules/structs" + "forgejo.org/modules/test" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" + "forgejo.org/modules/validation" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -70,7 +72,7 @@ func TestGetUserFromMap(t *testing.T) { } func TestGetUserByName(t *testing.T) { - defer tests.AddFixtures("models/user/fixtures/")() + defer unittest.OverrideFixtures("models/user/fixtures")() require.NoError(t, unittest.PrepareTestDatabase()) { @@ -98,16 +100,6 @@ func TestGetUserByName(t *testing.T) { } } -func TestGetUserEmailsByNames(t *testing.T) { - require.NoError(t, unittest.PrepareTestDatabase()) - - // ignore none active user email - assert.ElementsMatch(t, []string{"user8@example.com"}, user_model.GetUserEmailsByNames(db.DefaultContext, []string{"user8", "user9"})) - assert.ElementsMatch(t, []string{"user8@example.com", "user5@example.com"}, user_model.GetUserEmailsByNames(db.DefaultContext, []string{"user8", "user5"})) - - assert.ElementsMatch(t, []string{"user8@example.com"}, user_model.GetUserEmailsByNames(db.DefaultContext, []string{"user8", "org7"})) -} - func TestCanCreateOrganization(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) @@ -127,7 +119,7 @@ func TestCanCreateOrganization(t *testing.T) { } func TestGetAllUsers(t *testing.T) { - defer tests.AddFixtures("models/user/fixtures/")() + defer unittest.OverrideFixtures("models/user/fixtures")() require.NoError(t, unittest.PrepareTestDatabase()) users, err := user_model.GetAllUsers(db.DefaultContext) @@ -152,7 +144,7 @@ func TestAPActorID(t *testing.T) { } func TestSearchUsers(t *testing.T) { - defer tests.AddFixtures("models/user/fixtures/")() + defer unittest.OverrideFixtures("models/user/fixtures")() require.NoError(t, unittest.PrepareTestDatabase()) testSuccess := func(opts *user_model.SearchUserOptions, expectedUserOrOrgIDs []int64) { users, _, err := user_model.SearchUsers(db.DefaultContext, opts) @@ -218,7 +210,7 @@ func TestSearchUsers(t *testing.T) { []int64{1041, 37}) testUserSuccess(&user_model.SearchUserOptions{ListOptions: db.ListOptions{Page: 1}, IsTwoFactorEnabled: optional.Some(true)}, - []int64{24}) + []int64{24, 32}) } func TestEmailNotificationPreferences(t *testing.T) { @@ -320,7 +312,7 @@ func TestCreateUserInvalidEmail(t *testing.T) { err := user_model.CreateUser(db.DefaultContext, user) require.Error(t, err) - assert.True(t, user_model.IsErrEmailCharIsNotSupported(err)) + assert.True(t, validation.IsErrEmailCharIsNotSupported(err)) } func TestCreateUserEmailAlreadyUsed(t *testing.T) { @@ -352,7 +344,7 @@ func TestCreateUserCustomTimestamps(t *testing.T) { err := user_model.CreateUser(db.DefaultContext, user) require.NoError(t, err) - fetched, err := user_model.GetUserByID(context.Background(), user.ID) + fetched, err := user_model.GetUserByID(t.Context(), user.ID) require.NoError(t, err) assert.Equal(t, creationTimestamp, fetched.CreatedUnix) assert.Equal(t, creationTimestamp, fetched.UpdatedUnix) @@ -379,7 +371,7 @@ func TestCreateUserWithoutCustomTimestamps(t *testing.T) { timestampEnd := time.Now().Unix() - fetched, err := user_model.GetUserByID(context.Background(), user.ID) + fetched, err := user_model.GetUserByID(t.Context(), user.ID) require.NoError(t, err) assert.LessOrEqual(t, timestampStart, fetched.CreatedUnix) @@ -389,6 +381,31 @@ func TestCreateUserWithoutCustomTimestamps(t *testing.T) { assert.LessOrEqual(t, fetched.UpdatedUnix, timestampEnd) } +func TestCreateUserClaimingUsername(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + defer test.MockVariableValue(&setting.Service.UsernameCooldownPeriod, 1)() + + _, err := db.GetEngine(db.DefaultContext).NoAutoTime().Insert(&user_model.Redirect{RedirectUserID: 1, LowerName: "redirecting", CreatedUnix: timeutil.TimeStampNow()}) + require.NoError(t, err) + + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + + user.Name = "redirecting" + user.LowerName = strings.ToLower(user.Name) + user.ID = 0 + user.Email = "unique@example.com" + + t.Run("Normal creation", func(t *testing.T) { + err = user_model.CreateUser(db.DefaultContext, user) + assert.True(t, user_model.IsErrCooldownPeriod(err)) + }) + + t.Run("Creation as admin", func(t *testing.T) { + err = user_model.AdminCreateUser(db.DefaultContext, user) + require.NoError(t, err) + }) +} + func TestGetUserIDsByNames(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) @@ -616,6 +633,7 @@ func Test_NormalizeUserFromEmail(t *testing.T) { {"test", "test", true}, {"Sinéad.O'Connor", "Sinead.OConnor", true}, {"Æsir", "AEsir", true}, + {"Flußpferd", "Flusspferd", true}, // \u00e9\u0065\u0301 {"éeÌ", "ee", true}, {"Awareness Hub", "Awareness-Hub", true}, @@ -646,7 +664,7 @@ func TestEmailTo(t *testing.T) { {"Hi Its ", "ee@mail.box", `"Hi Its Mee" `}, {"Sinéad.O'Connor", "sinead.oconnor@gmail.com", "=?utf-8?b?U2luw6lhZC5PJ0Nvbm5vcg==?= "}, {"Æsir", "aesir@gmx.de", "=?utf-8?q?=C3=86sir?= "}, - {"new😀user", "new.user@alo.com", "=?utf-8?q?new=F0=9F=98=80user?= "}, // codespell-ignore + {"new😀user", "new.user@alo.com", "=?utf-8?q?new=F0=9F=98=80user?= "}, // codespell:ignore {`"quoted"`, "quoted@test.com", `"quoted" `}, {`gusted`, "gusted@test.com", `"gusted" `}, {`Joe Q. Public`, "john.q.public@example.com", `"Joe Q. Public" `}, @@ -686,7 +704,7 @@ func TestDisabledUserFeatures(t *testing.T) { // no features should be disabled with a plain login type assert.LessOrEqual(t, user.LoginType, auth.Plain) assert.Empty(t, user_model.DisabledFeaturesWithLoginType(user).Values()) - for _, f := range testValues.Values() { + for f := range testValues.Seq() { assert.False(t, user_model.IsFeatureDisabledWithLoginType(user, f)) } @@ -695,7 +713,124 @@ func TestDisabledUserFeatures(t *testing.T) { // all features should be disabled assert.NotEmpty(t, user_model.DisabledFeaturesWithLoginType(user).Values()) - for _, f := range testValues.Values() { + for f := range testValues.Seq() { assert.True(t, user_model.IsFeatureDisabledWithLoginType(user, f)) } } + +func TestGenerateEmailAuthorizationCode(t *testing.T) { + defer test.MockVariableValue(&setting.Service.ActiveCodeLives, 2)() + require.NoError(t, unittest.PrepareTestDatabase()) + + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + + code, err := user.GenerateEmailAuthorizationCode(db.DefaultContext, auth.UserActivation) + require.NoError(t, err) + + lookupKey, validator, ok := strings.Cut(code, ":") + assert.True(t, ok) + + rawValidator, err := hex.DecodeString(validator) + require.NoError(t, err) + + authToken, err := auth.FindAuthToken(db.DefaultContext, lookupKey, auth.UserActivation) + require.NoError(t, err) + assert.False(t, authToken.IsExpired()) + assert.EqualValues(t, authToken.HashedValidator, auth.HashValidator(rawValidator)) + + authToken.Expiry = authToken.Expiry.Add(-int64(setting.Service.ActiveCodeLives) * 60) + assert.True(t, authToken.IsExpired()) +} + +func TestVerifyUserAuthorizationToken(t *testing.T) { + defer test.MockVariableValue(&setting.Service.ActiveCodeLives, 2)() + require.NoError(t, unittest.PrepareTestDatabase()) + + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + + code, err := user.GenerateEmailAuthorizationCode(db.DefaultContext, auth.UserActivation) + require.NoError(t, err) + + lookupKey, _, ok := strings.Cut(code, ":") + assert.True(t, ok) + + t.Run("Wrong purpose", func(t *testing.T) { + u, _, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.PasswordReset) + require.NoError(t, err) + assert.Nil(t, u) + }) + + t.Run("No delete", func(t *testing.T) { + u, _, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.UserActivation) + require.NoError(t, err) + assert.EqualValues(t, user.ID, u.ID) + + authToken, err := auth.FindAuthToken(db.DefaultContext, lookupKey, auth.UserActivation) + require.NoError(t, err) + assert.NotNil(t, authToken) + }) + + t.Run("Delete", func(t *testing.T) { + u, deleteToken, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.UserActivation) + require.NoError(t, err) + assert.EqualValues(t, user.ID, u.ID) + require.NoError(t, deleteToken()) + + authToken, err := auth.FindAuthToken(db.DefaultContext, lookupKey, auth.UserActivation) + require.ErrorIs(t, err, util.ErrNotExist) + assert.Nil(t, authToken) + }) +} + +func TestGetInactiveUsers(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + // all inactive users + // user1's createdunix is 1672578000 + users, err := user_model.GetInactiveUsers(db.DefaultContext, 0) + require.NoError(t, err) + assert.Len(t, users, 1) + interval := time.Now().Unix() - 1672578000 + 3600*24 + users, err = user_model.GetInactiveUsers(db.DefaultContext, time.Duration(interval*int64(time.Second))) + require.NoError(t, err) + require.Empty(t, users) +} + +func TestPronounsPrivacy(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + t.Run("EmptyPronounsIfNoneSet", func(t *testing.T) { + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + user.Pronouns = "" + user.KeepPronounsPrivate = false + + assert.Equal(t, "", user.GetPronouns(false)) + }) + t.Run("EmptyPronounsIfSetButPrivateAndNotLoggedIn", func(t *testing.T) { + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + user.Pronouns = "any" + user.KeepPronounsPrivate = true + + assert.Equal(t, "", user.GetPronouns(false)) + }) + t.Run("ReturnPronounsIfSetAndNotPrivateAndNotLoggedIn", func(t *testing.T) { + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + user.Pronouns = "any" + user.KeepPronounsPrivate = false + + assert.Equal(t, "any", user.GetPronouns(false)) + }) + t.Run("ReturnPronounsIfSetAndPrivateAndLoggedIn", func(t *testing.T) { + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + user.Pronouns = "any" + user.KeepPronounsPrivate = false + + assert.Equal(t, "any", user.GetPronouns(true)) + }) + t.Run("ReturnPronounsIfSetAndNotPrivateAndLoggedIn", func(t *testing.T) { + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + user.Pronouns = "any" + user.KeepPronounsPrivate = true + + assert.Equal(t, "any", user.GetPronouns(true)) + }) +} diff --git a/models/user/user_update.go b/models/user/user_update.go index 66702e2a14..bf258811e4 100644 --- a/models/user/user_update.go +++ b/models/user/user_update.go @@ -6,7 +6,7 @@ package user import ( "context" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" ) func IncrUserRepoNum(ctx context.Context, userID int64) error { diff --git a/models/webhook/hooktask.go b/models/webhook/hooktask.go index 8734feb2e1..58600cb8bf 100644 --- a/models/webhook/hooktask.go +++ b/models/webhook/hooktask.go @@ -8,12 +8,12 @@ import ( "errors" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" - webhook_module "code.gitea.io/gitea/modules/webhook" + "forgejo.org/models/db" + "forgejo.org/modules/json" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" + webhook_module "forgejo.org/modules/webhook" gouuid "github.com/google/uuid" "xorm.io/builder" diff --git a/models/webhook/main_test.go b/models/webhook/main_test.go index f19465d505..fac998e8cd 100644 --- a/models/webhook/main_test.go +++ b/models/webhook/main_test.go @@ -6,7 +6,7 @@ package webhook import ( "testing" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/unittest" ) func TestMain(m *testing.M) { diff --git a/models/webhook/webhook.go b/models/webhook/webhook.go index f3370f3db5..0691f231b2 100644 --- a/models/webhook/webhook.go +++ b/models/webhook/webhook.go @@ -9,15 +9,15 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/secret" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" - webhook_module "code.gitea.io/gitea/modules/webhook" + "forgejo.org/models/db" + "forgejo.org/modules/json" + "forgejo.org/modules/log" + "forgejo.org/modules/optional" + "forgejo.org/modules/secret" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" + webhook_module "forgejo.org/modules/webhook" "xorm.io/builder" ) diff --git a/models/webhook/webhook_system.go b/models/webhook/webhook_system.go index 62e8286205..b63346635c 100644 --- a/models/webhook/webhook_system.go +++ b/models/webhook/webhook_system.go @@ -7,7 +7,7 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" ) // GetDefaultWebhooks returns all admin-default webhooks. diff --git a/models/webhook/webhook_test.go b/models/webhook/webhook_test.go index 848440b84a..7f0abbd8bb 100644 --- a/models/webhook/webhook_test.go +++ b/models/webhook/webhook_test.go @@ -4,16 +4,15 @@ package webhook import ( - "context" "testing" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/timeutil" - webhook_module "code.gitea.io/gitea/modules/webhook" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + "forgejo.org/modules/json" + "forgejo.org/modules/optional" + "forgejo.org/modules/timeutil" + webhook_module "forgejo.org/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -262,7 +261,7 @@ func TestCleanupHookTaskTable_PerWebhook_DeletesDelivered(t *testing.T) { require.NoError(t, err) unittest.AssertExistsAndLoadBean(t, hookTask) - require.NoError(t, CleanupHookTaskTable(context.Background(), PerWebhook, 168*time.Hour, 0)) + require.NoError(t, CleanupHookTaskTable(t.Context(), PerWebhook, 168*time.Hour, 0)) unittest.AssertNotExistsBean(t, hookTask) } @@ -278,7 +277,7 @@ func TestCleanupHookTaskTable_PerWebhook_LeavesUndelivered(t *testing.T) { require.NoError(t, err) unittest.AssertExistsAndLoadBean(t, hookTask) - require.NoError(t, CleanupHookTaskTable(context.Background(), PerWebhook, 168*time.Hour, 0)) + require.NoError(t, CleanupHookTaskTable(t.Context(), PerWebhook, 168*time.Hour, 0)) unittest.AssertExistsAndLoadBean(t, hookTask) } @@ -295,7 +294,7 @@ func TestCleanupHookTaskTable_PerWebhook_LeavesMostRecentTask(t *testing.T) { require.NoError(t, err) unittest.AssertExistsAndLoadBean(t, hookTask) - require.NoError(t, CleanupHookTaskTable(context.Background(), PerWebhook, 168*time.Hour, 1)) + require.NoError(t, CleanupHookTaskTable(t.Context(), PerWebhook, 168*time.Hour, 1)) unittest.AssertExistsAndLoadBean(t, hookTask) } @@ -312,7 +311,7 @@ func TestCleanupHookTaskTable_OlderThan_DeletesDelivered(t *testing.T) { require.NoError(t, err) unittest.AssertExistsAndLoadBean(t, hookTask) - require.NoError(t, CleanupHookTaskTable(context.Background(), OlderThan, 168*time.Hour, 0)) + require.NoError(t, CleanupHookTaskTable(t.Context(), OlderThan, 168*time.Hour, 0)) unittest.AssertNotExistsBean(t, hookTask) } @@ -328,7 +327,7 @@ func TestCleanupHookTaskTable_OlderThan_LeavesUndelivered(t *testing.T) { require.NoError(t, err) unittest.AssertExistsAndLoadBean(t, hookTask) - require.NoError(t, CleanupHookTaskTable(context.Background(), OlderThan, 168*time.Hour, 0)) + require.NoError(t, CleanupHookTaskTable(t.Context(), OlderThan, 168*time.Hour, 0)) unittest.AssertExistsAndLoadBean(t, hookTask) } @@ -345,6 +344,6 @@ func TestCleanupHookTaskTable_OlderThan_LeavesTaskEarlierThanAgeToDelete(t *test require.NoError(t, err) unittest.AssertExistsAndLoadBean(t, hookTask) - require.NoError(t, CleanupHookTaskTable(context.Background(), OlderThan, 168*time.Hour, 0)) + require.NoError(t, CleanupHookTaskTable(t.Context(), OlderThan, 168*time.Hour, 0)) unittest.AssertExistsAndLoadBean(t, hookTask) } diff --git a/modules/actions/github.go b/modules/actions/github.go index c27d4edf53..111537c913 100644 --- a/modules/actions/github.go +++ b/modules/actions/github.go @@ -4,7 +4,7 @@ package actions import ( - webhook_module "code.gitea.io/gitea/modules/webhook" + webhook_module "forgejo.org/modules/webhook" ) const ( diff --git a/modules/actions/github_test.go b/modules/actions/github_test.go index 6652ff6eac..2a5d8a19b8 100644 --- a/modules/actions/github_test.go +++ b/modules/actions/github_test.go @@ -6,7 +6,7 @@ package actions import ( "testing" - webhook_module "code.gitea.io/gitea/modules/webhook" + webhook_module "forgejo.org/modules/webhook" "github.com/stretchr/testify/assert" ) diff --git a/modules/actions/log.go b/modules/actions/log.go index 5a1425e031..78b1196f87 100644 --- a/modules/actions/log.go +++ b/modules/actions/log.go @@ -12,10 +12,10 @@ import ( "strings" "time" - "code.gitea.io/gitea/models/dbfs" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/storage" - "code.gitea.io/gitea/modules/zstd" + "forgejo.org/models/dbfs" + "forgejo.org/modules/log" + "forgejo.org/modules/storage" + "forgejo.org/modules/zstd" runnerv1 "code.gitea.io/actions-proto-go/runner/v1" "google.golang.org/protobuf/types/known/timestamppb" diff --git a/modules/actions/task_state.go b/modules/actions/task_state.go index 31a74be3fd..77bfc747ee 100644 --- a/modules/actions/task_state.go +++ b/modules/actions/task_state.go @@ -4,7 +4,7 @@ package actions import ( - actions_model "code.gitea.io/gitea/models/actions" + actions_model "forgejo.org/models/actions" ) const ( @@ -18,8 +18,32 @@ func FullSteps(task *actions_model.ActionTask) []*actions_model.ActionTaskStep { return fullStepsOfEmptySteps(task) } - firstStep := task.Steps[0] + // firstStep is the first step that has run or running, not include preStep. + // For example, + // 1. preStep(Success) -> step1(Success) -> step2(Running) -> step3(Waiting) -> postStep(Waiting): firstStep is step1. + // 2. preStep(Success) -> step1(Skipped) -> step2(Success) -> postStep(Success): firstStep is step2. + // 3. preStep(Success) -> step1(Running) -> step2(Waiting) -> postStep(Waiting): firstStep is step1. + // 4. preStep(Success) -> step1(Skipped) -> step2(Skipped) -> postStep(Skipped): firstStep is nil. + // 5. preStep(Success) -> step1(Cancelled) -> step2(Cancelled) -> postStep(Cancelled): firstStep is nil. + var firstStep *actions_model.ActionTaskStep + // lastHasRunStep is the last step that has run. + // For example, + // 1. preStep(Success) -> step1(Success) -> step2(Running) -> step3(Waiting) -> postStep(Waiting): lastHasRunStep is step1. + // 2. preStep(Success) -> step1(Success) -> step2(Success) -> step3(Success) -> postStep(Success): lastHasRunStep is step3. + // 3. preStep(Success) -> step1(Success) -> step2(Failure) -> step3 -> postStep(Waiting): lastHasRunStep is step2. + // So its Stopped is the Started of postStep when there are no more steps to run. + var lastHasRunStep *actions_model.ActionTaskStep + var logIndex int64 + for _, step := range task.Steps { + if firstStep == nil && (step.Status.HasRun() || step.Status.IsRunning()) { + firstStep = step + } + if step.Status.HasRun() { + lastHasRunStep = step + } + logIndex += step.LogLength + } preStep := &actions_model.ActionTaskStep{ Name: preStepName, @@ -28,32 +52,17 @@ func FullSteps(task *actions_model.ActionTask) []*actions_model.ActionTaskStep { Status: actions_model.StatusRunning, } - if firstStep.Status.HasRun() || firstStep.Status.IsRunning() { + // No step has run or is running, so preStep is equal to the task + if firstStep == nil { + preStep.Stopped = task.Stopped + preStep.Status = task.Status + } else { preStep.LogLength = firstStep.LogIndex preStep.Stopped = firstStep.Started preStep.Status = actions_model.StatusSuccess - } else if task.Status.IsDone() { - preStep.Stopped = task.Stopped - preStep.Status = actions_model.StatusFailure - if task.Status.IsSkipped() { - preStep.Status = actions_model.StatusSkipped - } } logIndex += preStep.LogLength - // lastHasRunStep is the last step that has run. - // For example, - // 1. preStep(Success) -> step1(Success) -> step2(Running) -> step3(Waiting) -> postStep(Waiting): lastHasRunStep is step1. - // 2. preStep(Success) -> step1(Success) -> step2(Success) -> step3(Success) -> postStep(Success): lastHasRunStep is step3. - // 3. preStep(Success) -> step1(Success) -> step2(Failure) -> step3 -> postStep(Waiting): lastHasRunStep is step2. - // So its Stopped is the Started of postStep when there are no more steps to run. - var lastHasRunStep *actions_model.ActionTaskStep - for _, step := range task.Steps { - if step.Status.HasRun() { - lastHasRunStep = step - } - logIndex += step.LogLength - } if lastHasRunStep == nil { lastHasRunStep = preStep } diff --git a/modules/actions/task_state_test.go b/modules/actions/task_state_test.go index 28213d781b..e18de4573f 100644 --- a/modules/actions/task_state_test.go +++ b/modules/actions/task_state_test.go @@ -6,7 +6,7 @@ package actions import ( "testing" - actions_model "code.gitea.io/gitea/models/actions" + actions_model "forgejo.org/models/actions" "github.com/stretchr/testify/assert" ) @@ -137,6 +137,25 @@ func TestFullSteps(t *testing.T) { {Name: postStepName, Status: actions_model.StatusSkipped, LogIndex: 0, LogLength: 0, Started: 0, Stopped: 0}, }, }, + { + name: "first step is skipped", + task: &actions_model.ActionTask{ + Steps: []*actions_model.ActionTaskStep{ + {Status: actions_model.StatusSkipped, LogIndex: 0, LogLength: 0, Started: 0, Stopped: 0}, + {Status: actions_model.StatusSuccess, LogIndex: 10, LogLength: 80, Started: 10010, Stopped: 10090}, + }, + Status: actions_model.StatusSuccess, + Started: 10000, + Stopped: 10100, + LogLength: 100, + }, + want: []*actions_model.ActionTaskStep{ + {Name: preStepName, Status: actions_model.StatusSuccess, LogIndex: 0, LogLength: 10, Started: 10000, Stopped: 10010}, + {Status: actions_model.StatusSkipped, LogIndex: 0, LogLength: 0, Started: 0, Stopped: 0}, + {Status: actions_model.StatusSuccess, LogIndex: 10, LogLength: 80, Started: 10010, Stopped: 10090}, + {Name: postStepName, Status: actions_model.StatusSuccess, LogIndex: 90, LogLength: 10, Started: 10090, Stopped: 10100}, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/modules/actions/workflows.go b/modules/actions/workflows.go index 94c221ee7b..43948cce5c 100644 --- a/modules/actions/workflows.go +++ b/modules/actions/workflows.go @@ -8,10 +8,10 @@ import ( "io" "strings" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" - api "code.gitea.io/gitea/modules/structs" - webhook_module "code.gitea.io/gitea/modules/webhook" + "forgejo.org/modules/git" + "forgejo.org/modules/log" + api "forgejo.org/modules/structs" + webhook_module "forgejo.org/modules/webhook" "github.com/gobwas/glob" "github.com/nektos/act/pkg/jobparser" diff --git a/modules/actions/workflows_test.go b/modules/actions/workflows_test.go index 965d01f134..b85ed7fd56 100644 --- a/modules/actions/workflows_test.go +++ b/modules/actions/workflows_test.go @@ -6,9 +6,9 @@ package actions import ( "testing" - "code.gitea.io/gitea/modules/git" - api "code.gitea.io/gitea/modules/structs" - webhook_module "code.gitea.io/gitea/modules/webhook" + "forgejo.org/modules/git" + api "forgejo.org/modules/structs" + webhook_module "forgejo.org/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/activitypub/client.go b/modules/activitypub/client.go index 064d8984c1..d43e9c2bb0 100644 --- a/modules/activitypub/client.go +++ b/modules/activitypub/client.go @@ -17,12 +17,12 @@ import ( "strings" "time" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/proxy" - "code.gitea.io/gitea/modules/setting" + user_model "forgejo.org/models/user" + "forgejo.org/modules/log" + "forgejo.org/modules/proxy" + "forgejo.org/modules/setting" - "github.com/go-fed/httpsig" + "github.com/42wim/httpsig" ) const ( diff --git a/modules/activitypub/client_test.go b/modules/activitypub/client_test.go index 647a0a59d0..e63d4859be 100644 --- a/modules/activitypub/client_test.go +++ b/modules/activitypub/client_test.go @@ -9,15 +9,14 @@ import ( "io" "net/http" "net/http/httptest" - "regexp" "testing" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -119,7 +118,7 @@ func TestActivityPubSignedPost(t *testing.T) { expected := "BODY" srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - assert.Regexp(t, regexp.MustCompile("^"+setting.Federation.DigestAlgorithm), r.Header.Get("Digest")) + assert.Regexp(t, "^"+setting.Federation.DigestAlgorithm, r.Header.Get("Digest")) assert.Contains(t, r.Header.Get("Signature"), pubID) assert.Equal(t, ActivityStreamsContentType, r.Header.Get("Content-Type")) body, err := io.ReadAll(r.Body) diff --git a/modules/activitypub/main_test.go b/modules/activitypub/main_test.go index 4591f1fa55..4895c85d6b 100644 --- a/modules/activitypub/main_test.go +++ b/modules/activitypub/main_test.go @@ -6,11 +6,12 @@ package activitypub import ( "testing" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/unittest" - _ "code.gitea.io/gitea/models" - _ "code.gitea.io/gitea/models/actions" - _ "code.gitea.io/gitea/models/activities" + _ "forgejo.org/models" + _ "forgejo.org/models/actions" + _ "forgejo.org/models/activities" + _ "forgejo.org/models/forgefed" ) func TestMain(m *testing.M) { diff --git a/modules/activitypub/user_settings.go b/modules/activitypub/user_settings.go index 7f939af352..77c11d5ae3 100644 --- a/modules/activitypub/user_settings.go +++ b/modules/activitypub/user_settings.go @@ -6,8 +6,8 @@ package activitypub import ( "context" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/util" + user_model "forgejo.org/models/user" + "forgejo.org/modules/util" ) const rsaBits = 3072 diff --git a/modules/activitypub/user_settings_test.go b/modules/activitypub/user_settings_test.go index f510e7a6ac..f1a779855c 100644 --- a/modules/activitypub/user_settings_test.go +++ b/modules/activitypub/user_settings_test.go @@ -6,11 +6,11 @@ package activitypub import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" - _ "code.gitea.io/gitea/models" // https://forum.gitea.com/t/testfixtures-could-not-clean-table-access-no-such-table-access/4137/4 + _ "forgejo.org/models" // https://forum.gitea.com/t/testfixtures-could-not-clean-table-access-no-such-table-access/4137/4 "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/annex/annex.go b/modules/annex/annex.go new file mode 100644 index 0000000000..52c6134d72 --- /dev/null +++ b/modules/annex/annex.go @@ -0,0 +1,240 @@ +// Copyright 2022 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +// Unlike modules/lfs, which operates mainly on git.Blobs, this operates on git.TreeEntrys. +// The motivation for this is that TreeEntrys have an easy pointer to the on-disk repo path, +// while blobs do not (in fact, if building with TAGS=gogit, blobs might exist only in a mock +// filesystem, living only in process RAM). We must have the on-disk path to do anything +// useful with git-annex because all of its interesting data is on-disk under .git/annex/. + +package annex + +import ( + "bytes" + "context" + "errors" + "fmt" + "io" + "os" + "path" + "path/filepath" + "strings" + "sync" + "time" + + "forgejo.org/modules/git" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/typesniffer" + + "gopkg.in/ini.v1" //nolint:depguard // This import is forbidden in favor of using the setting module, but we need ini parsing for something other than Forgejo settings +) + +// ErrBlobIsNotAnnexed occurs if a blob does not contain a valid annex key +var ErrBlobIsNotAnnexed = errors.New("not a git-annex pointer") + +func PrivateInit(ctx context.Context, repoPath string) error { + if _, _, err := git.NewCommand(ctx, "config", "annex.private", "true").RunStdString(&git.RunOpts{Dir: repoPath}); err != nil { + return err + } + if _, _, err := git.NewCommand(ctx, "annex", "init").RunStdString(&git.RunOpts{Dir: repoPath}); err != nil { + return err + } + return nil +} + +func LookupKey(blob *git.Blob) (string, error) { + stdout, _, err := git.NewCommand(git.DefaultContext, "annex", "lookupkey", "--ref").AddDynamicArguments(blob.ID.String()).RunStdString(&git.RunOpts{Dir: blob.Repo().Path}) + if err != nil { + return "", ErrBlobIsNotAnnexed + } + key := strings.TrimSpace(stdout) + return key, nil +} + +// LookupKeyBatch runs git annex lookupkey --batch --ref +func LookupKeyBatch(ctx context.Context, shasToBatchReader *io.PipeReader, lookupKeyBatchWriter *io.PipeWriter, wg *sync.WaitGroup, repoPath string) { + defer wg.Done() + defer shasToBatchReader.Close() + defer lookupKeyBatchWriter.Close() + + stderr := new(bytes.Buffer) + var errbuf strings.Builder + if err := git.NewCommand(ctx, "annex", "lookupkey", "--batch", "--ref").Run(&git.RunOpts{ + Dir: repoPath, + Stdout: lookupKeyBatchWriter, + Stdin: shasToBatchReader, + Stderr: stderr, + }); err != nil { + _ = lookupKeyBatchWriter.CloseWithError(fmt.Errorf("git annex lookupkey --batch --ref [%s]: %w - %s", repoPath, err, errbuf.String())) + } +} + +// CopyFromToBatch runs git -c annex.hardlink=true annex copy --batch-keys --from --to +func CopyFromToBatch(ctx context.Context, from, to string, keysToCopyReader *io.PipeReader, wg *sync.WaitGroup, repoPath string) { + defer wg.Done() + defer keysToCopyReader.Close() + + stdout := new(bytes.Buffer) + stderr := new(bytes.Buffer) + var errbuf strings.Builder + if err := git.NewCommand(ctx, "-c", "annex.hardlink=true", "annex", "copy", "--batch-keys", "--from").AddDynamicArguments(from).AddArguments("--to").AddDynamicArguments(to).Run(&git.RunOpts{ + Dir: repoPath, + Stdout: stdout, + Stdin: keysToCopyReader, + Stderr: stderr, + }); err != nil { + _ = keysToCopyReader.CloseWithError(fmt.Errorf("git annex copy --batch-keys --from --to [%s]: %w - %s", repoPath, err, errbuf.String())) + } +} + +func ContentLocationFromKey(repoPath, key string) (string, error) { + contentLocation, _, err := git.NewCommandContextNoGlobals(git.DefaultContext, "annex", "contentlocation").AddDynamicArguments(key).RunStdString(&git.RunOpts{Dir: repoPath}) + if err != nil { + return "", fmt.Errorf("in %s: %s does not seem to be a valid annexed file: %w", repoPath, key, err) + } + contentLocation = strings.TrimSpace(contentLocation) + contentLocation = path.Clean("/" + contentLocation)[1:] // prevent directory traversals + contentLocation = path.Join(repoPath, contentLocation) + + return contentLocation, nil +} + +// return the absolute path of the content pointed to by the annex pointer stored in the git object +// errors if the content is not found in this repo +func ContentLocation(blob *git.Blob) (string, error) { + key, err := LookupKey(blob) + if err != nil { + return "", err + } + return ContentLocationFromKey(blob.Repo().Path, key) +} + +// returns a stream open to the annex content +func Content(blob *git.Blob) (*os.File, error) { + contentLocation, err := ContentLocation(blob) + if err != nil { + return nil, err + } + + return os.Open(contentLocation) +} + +// whether the object appears to be a valid annex pointer +// does *not* verify if the content is actually in this repo; +// for that, use ContentLocation() +func IsAnnexed(blob *git.Blob) (bool, error) { + if !setting.Annex.Enabled { + return false, nil + } + + // LookupKey is written to only return well-formed keys + // so the test is just to see if it errors + _, err := LookupKey(blob) + if err != nil { + if errors.Is(err, ErrBlobIsNotAnnexed) { + return false, nil + } + return false, err + } + return true, nil +} + +// PathIsAnnexRepo determines if repoPath is a git-annex enabled repository +func PathIsAnnexRepo(repoPath string) bool { + _, _, err := git.NewCommand(git.DefaultContext, "config", "annex.uuid").RunStdString(&git.RunOpts{Dir: repoPath}) + return err == nil +} + +// IsAnnexRepo determines if repo is a git-annex enabled repository +func IsAnnexRepo(repo *git.Repository) bool { + _, _, err := git.NewCommand(repo.Ctx, "config", "annex.uuid").RunStdString(&git.RunOpts{Dir: repo.Path}) + return err == nil +} + +var uuid2repoPathCache = make(map[string]string) + +func Init() error { + if !setting.Annex.Enabled { + return nil + } + if !setting.Annex.DisableP2PHTTP { + log.Info("Populating the git-annex UUID cache with existing repositories") + start := time.Now() + if err := updateUUID2RepoPathCache(); err != nil { + return err + } + log.Info("Populating the git-annex UUID cache took %v", time.Since(start)) + } + return nil +} + +func updateUUID2RepoPathCache() error { + configFiles, err := filepath.Glob(filepath.Join(setting.RepoRootPath, "*", "*", "config")) + if err != nil { + return err + } + for _, configFile := range configFiles { + repoPath := strings.TrimSuffix(configFile, "/config") + config, err := ini.Load(configFile) + if err != nil { + continue + } + repoUUID := config.Section("annex").Key("uuid").Value() + if repoUUID != "" { + uuid2repoPathCache[repoUUID] = repoPath + } + } + return nil +} + +func repoPathFromUUIDCache(uuid string) (string, error) { + if repoPath, ok := uuid2repoPathCache[uuid]; ok { + return repoPath, nil + } + // If the cache didn't contain an entry for the UUID then update the cache and try again + if err := updateUUID2RepoPathCache(); err != nil { + return "", err + } + if repoPath, ok := uuid2repoPathCache[uuid]; ok { + return repoPath, nil + } + return "", fmt.Errorf("no repository known for UUID '%s'", uuid) +} + +func checkValidity(uuid, repoPath string) (bool, error) { + stdout, _, err := git.NewCommand(git.DefaultContext, "config", "annex.uuid").RunStdString(&git.RunOpts{Dir: repoPath}) + if err != nil { + return false, err + } + repoUUID := strings.TrimSpace(stdout) + return uuid == repoUUID, nil +} + +func UUID2RepoPath(uuid string) (string, error) { + // Get the current cache entry for the UUID + repoPath, err := repoPathFromUUIDCache(uuid) + if err != nil { + return "", err + } + // Check if it is still up-to-date + valid, _ := checkValidity(uuid, repoPath) + if !valid { + // If it isn't, remove the cache entry and try again + delete(uuid2repoPathCache, uuid) + return UUID2RepoPath(uuid) + } + // Otherwise just return the cached entry + return repoPath, nil +} + +// GuessContentType guesses the content type of the annexed blob. +func GuessContentType(blob *git.Blob) (typesniffer.SniffedType, error) { + r, err := Content(blob) + if err != nil { + return typesniffer.SniffedType{}, err + } + defer r.Close() + + return typesniffer.DetectContentTypeFromReader(r) +} diff --git a/modules/assetfs/layered.go b/modules/assetfs/layered.go index 9678d23ad6..8d54ae5e4a 100644 --- a/modules/assetfs/layered.go +++ b/modules/assetfs/layered.go @@ -11,13 +11,13 @@ import ( "net/http" "os" "path/filepath" - "sort" + "slices" "time" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/process" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/container" + "forgejo.org/modules/log" + "forgejo.org/modules/process" + "forgejo.org/modules/util" "github.com/fsnotify/fsnotify" ) @@ -143,8 +143,7 @@ func (l *LayeredFS) ListFiles(name string, fileMode ...bool) ([]string, error) { } } } - files := fileSet.Values() - sort.Strings(files) + files := slices.Sorted(fileSet.Seq()) return files, nil } @@ -184,8 +183,7 @@ func listAllFiles(layers []*Layer, name string, fileMode ...bool) ([]string, err if err := list(name); err != nil { return nil, err } - files := fileSet.Values() - sort.Strings(files) + files := slices.Sorted(fileSet.Seq()) return files, nil } diff --git a/modules/auth/common.go b/modules/auth/common.go index 77361f6561..0f36fd942f 100644 --- a/modules/auth/common.go +++ b/modules/auth/common.go @@ -4,8 +4,8 @@ package auth import ( - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/json" + "forgejo.org/modules/log" ) func UnmarshalGroupTeamMapping(raw string) (map[string]map[string][]string, error) { diff --git a/modules/auth/pam/pam.go b/modules/auth/pam/pam.go index cca1482b1d..a8b608e6be 100644 --- a/modules/auth/pam/pam.go +++ b/modules/auth/pam/pam.go @@ -8,7 +8,7 @@ package pam import ( "errors" - "github.com/msteinert/pam" + "github.com/msteinert/pam/v2" ) // Supported is true when built with PAM @@ -28,6 +28,7 @@ func Auth(serviceName, userName, passwd string) (string, error) { if err != nil { return "", err } + defer t.End() if err = t.Authenticate(0); err != nil { return "", err diff --git a/modules/auth/password/hash/argon2.go b/modules/auth/password/hash/argon2.go index 0cd6472fa1..0f65d60c66 100644 --- a/modules/auth/password/hash/argon2.go +++ b/modules/auth/password/hash/argon2.go @@ -7,7 +7,7 @@ import ( "encoding/hex" "strings" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" "golang.org/x/crypto/argon2" ) diff --git a/modules/auth/password/hash/common.go b/modules/auth/password/hash/common.go index 487c0738f4..618ebfd15b 100644 --- a/modules/auth/password/hash/common.go +++ b/modules/auth/password/hash/common.go @@ -6,7 +6,7 @@ package hash import ( "strconv" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) func parseIntParam(value, param, algorithmName, config string, previousErr error) (int, error) { diff --git a/modules/auth/password/hash/hash.go b/modules/auth/password/hash/hash.go index 459320e1b0..eb79db1b9e 100644 --- a/modules/auth/password/hash/hash.go +++ b/modules/auth/password/hash/hash.go @@ -10,7 +10,7 @@ import ( "strings" "sync/atomic" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // This package takes care of hashing passwords, verifying passwords, defining diff --git a/modules/auth/password/hash/pbkdf2.go b/modules/auth/password/hash/pbkdf2.go index 27382fedb8..0dff5e5134 100644 --- a/modules/auth/password/hash/pbkdf2.go +++ b/modules/auth/password/hash/pbkdf2.go @@ -8,7 +8,7 @@ import ( "encoding/hex" "strings" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" "golang.org/x/crypto/pbkdf2" ) diff --git a/modules/auth/password/hash/scrypt.go b/modules/auth/password/hash/scrypt.go index f3d38f751a..668b69cb9e 100644 --- a/modules/auth/password/hash/scrypt.go +++ b/modules/auth/password/hash/scrypt.go @@ -7,7 +7,7 @@ import ( "encoding/hex" "strings" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" "golang.org/x/crypto/scrypt" ) diff --git a/modules/auth/password/password.go b/modules/auth/password/password.go index 85f9780709..fdbc4ff291 100644 --- a/modules/auth/password/password.go +++ b/modules/auth/password/password.go @@ -13,8 +13,8 @@ import ( "strings" "sync" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/translation" + "forgejo.org/modules/setting" + "forgejo.org/modules/translation" ) var ( diff --git a/modules/auth/password/pwn.go b/modules/auth/password/pwn.go index e00205ea19..239a25f11c 100644 --- a/modules/auth/password/pwn.go +++ b/modules/auth/password/pwn.go @@ -8,8 +8,8 @@ import ( "errors" "fmt" - "code.gitea.io/gitea/modules/auth/password/pwn" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/auth/password/pwn" + "forgejo.org/modules/setting" ) var ErrIsPwned = errors.New("password has been pwned") diff --git a/modules/auth/password/pwn/pwn.go b/modules/auth/password/pwn/pwn.go index f77ce9f40b..10693ec663 100644 --- a/modules/auth/password/pwn/pwn.go +++ b/modules/auth/password/pwn/pwn.go @@ -14,7 +14,7 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" ) const passwordURL = "https://api.pwnedpasswords.com/range/" diff --git a/modules/auth/password/pwn/pwn_test.go b/modules/auth/password/pwn/pwn_test.go index e5108150ae..bdfc0f6a51 100644 --- a/modules/auth/password/pwn/pwn_test.go +++ b/modules/auth/password/pwn/pwn_test.go @@ -4,47 +4,80 @@ package pwn import ( + "errors" + "io" "net/http" + "strings" "testing" "time" - "github.com/h2non/gock" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) +type mockTransport struct{} + +func (mockTransport) RoundTrip(req *http.Request) (*http.Response, error) { + if req.URL.Host != "api.pwnedpasswords.com" { + return nil, errors.New("unexpected host") + } + + res := &http.Response{ + ProtoMajor: 1, + ProtoMinor: 1, + Proto: "HTTP/1.1", + Request: req, + Header: make(http.Header), + StatusCode: 200, + } + + switch req.URL.Path { + case "/range/5c1d8": + res.Body = io.NopCloser(strings.NewReader("EAF2F254732680E8AC339B84F3266ECCBB5:1\r\nFC446EB88938834178CB9322C1EE273C2A7:2")) + return res, nil + case "/range/ba189": + res.Body = io.NopCloser(strings.NewReader("FD4CB34F0378BCB15D23F6FFD28F0775C9E:3\r\nFDF342FCD8C3611DAE4D76E8A992A3E4169:4")) + return res, nil + case "/range/a1733": + res.Body = io.NopCloser(strings.NewReader("C4CE0F1F0062B27B9E2F41AF0C08218017C:1\r\nFC446EB88938834178CB9322C1EE273C2A7:2\r\nFE81480327C992FE62065A827429DD1318B:0")) + return res, nil + case "/range/5617b": + res.Body = io.NopCloser(strings.NewReader("FD4CB34F0378BCB15D23F6FFD28F0775C9E:3\r\nFDF342FCD8C3611DAE4D76E8A992A3E4169:4\r\nFE81480327C992FE62065A827429DD1318B:0")) + return res, nil + case "/range/79082": + res.Body = io.NopCloser(strings.NewReader("FDF342FCD8C3611DAE4D76E8A992A3E4169:4\r\nFE81480327C992FE62065A827429DD1318B:0\r\nAFEF386F56EB0B4BE314E07696E5E6E6536:0")) + return res, nil + } + + return nil, errors.New("unexpected path") +} + var client = New(WithHTTP(&http.Client{ - Timeout: time.Second * 2, + Timeout: time.Second * 2, + Transport: mockTransport{}, })) func TestPassword(t *testing.T) { - defer gock.Off() - count, err := client.CheckPassword("", false) require.ErrorIs(t, err, ErrEmptyPassword, "blank input should return ErrEmptyPassword") assert.Equal(t, -1, count) - gock.New("https://api.pwnedpasswords.com").Get("/range/5c1d8").Times(1).Reply(200).BodyString("EAF2F254732680E8AC339B84F3266ECCBB5:1\r\nFC446EB88938834178CB9322C1EE273C2A7:2") count, err = client.CheckPassword("pwned", false) require.NoError(t, err) assert.Equal(t, 1, count) - gock.New("https://api.pwnedpasswords.com").Get("/range/ba189").Times(1).Reply(200).BodyString("FD4CB34F0378BCB15D23F6FFD28F0775C9E:3\r\nFDF342FCD8C3611DAE4D76E8A992A3E4169:4") count, err = client.CheckPassword("notpwned", false) require.NoError(t, err) assert.Equal(t, 0, count) - gock.New("https://api.pwnedpasswords.com").Get("/range/a1733").Times(1).Reply(200).BodyString("C4CE0F1F0062B27B9E2F41AF0C08218017C:1\r\nFC446EB88938834178CB9322C1EE273C2A7:2\r\nFE81480327C992FE62065A827429DD1318B:0") count, err = client.CheckPassword("paddedpwned", true) require.NoError(t, err) assert.Equal(t, 1, count) - gock.New("https://api.pwnedpasswords.com").Get("/range/5617b").Times(1).Reply(200).BodyString("FD4CB34F0378BCB15D23F6FFD28F0775C9E:3\r\nFDF342FCD8C3611DAE4D76E8A992A3E4169:4\r\nFE81480327C992FE62065A827429DD1318B:0") count, err = client.CheckPassword("paddednotpwned", true) require.NoError(t, err) assert.Equal(t, 0, count) - gock.New("https://api.pwnedpasswords.com").Get("/range/79082").Times(1).Reply(200).BodyString("FDF342FCD8C3611DAE4D76E8A992A3E4169:4\r\nFE81480327C992FE62065A827429DD1318B:0\r\nAFEF386F56EB0B4BE314E07696E5E6E6536:0") count, err = client.CheckPassword("paddednotpwnedzero", true) require.NoError(t, err) assert.Equal(t, 0, count) diff --git a/modules/auth/webauthn/webauthn.go b/modules/auth/webauthn/webauthn.go index 189d197333..a26dc89545 100644 --- a/modules/auth/webauthn/webauthn.go +++ b/modules/auth/webauthn/webauthn.go @@ -7,10 +7,10 @@ import ( "encoding/binary" "encoding/gob" - "code.gitea.io/gitea/models/auth" - "code.gitea.io/gitea/models/db" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/auth" + "forgejo.org/models/db" + user_model "forgejo.org/models/user" + "forgejo.org/modules/setting" "github.com/go-webauthn/webauthn/protocol" "github.com/go-webauthn/webauthn/webauthn" diff --git a/modules/auth/webauthn/webauthn_test.go b/modules/auth/webauthn/webauthn_test.go index 15a8d71828..552b698984 100644 --- a/modules/auth/webauthn/webauthn_test.go +++ b/modules/auth/webauthn/webauthn_test.go @@ -6,7 +6,7 @@ package webauthn import ( "testing" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" ) diff --git a/modules/avatar/avatar.go b/modules/avatar/avatar.go index 106215ec0b..33af60a3b8 100644 --- a/modules/avatar/avatar.go +++ b/modules/avatar/avatar.go @@ -14,8 +14,8 @@ import ( _ "image/gif" // for processing gif images _ "image/jpeg" // for processing jpeg images - "code.gitea.io/gitea/modules/avatar/identicon" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/avatar/identicon" + "forgejo.org/modules/setting" "golang.org/x/image/draw" diff --git a/modules/avatar/avatar_test.go b/modules/avatar/avatar_test.go index 824a38e15b..2166ca51b0 100644 --- a/modules/avatar/avatar_test.go +++ b/modules/avatar/avatar_test.go @@ -10,7 +10,7 @@ import ( "os" "testing" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/avatar/hash_test.go b/modules/avatar/hash_test.go index 1b8249c696..0a2db53ad4 100644 --- a/modules/avatar/hash_test.go +++ b/modules/avatar/hash_test.go @@ -9,7 +9,7 @@ import ( "image/png" "testing" - "code.gitea.io/gitea/modules/avatar" + "forgejo.org/modules/avatar" "github.com/stretchr/testify/assert" ) diff --git a/modules/base/tool.go b/modules/base/tool.go index 7612fff73a..38201c5919 100644 --- a/modules/base/tool.go +++ b/modules/base/tool.go @@ -4,26 +4,21 @@ package base import ( - "crypto/hmac" - "crypto/sha1" "crypto/sha256" - "crypto/subtle" "encoding/base64" "encoding/hex" "errors" "fmt" - "hash" "os" "path/filepath" "runtime" "strconv" "strings" - "time" "unicode/utf8" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/annex" + "forgejo.org/modules/git" + "forgejo.org/modules/log" "github.com/dustin/go-humanize" ) @@ -54,66 +49,6 @@ func BasicAuthDecode(encoded string) (string, string, error) { return "", "", errors.New("invalid basic authentication") } -// VerifyTimeLimitCode verify time limit code -func VerifyTimeLimitCode(now time.Time, data string, minutes int, code string) bool { - if len(code) <= 18 { - return false - } - - startTimeStr := code[:12] - aliveTimeStr := code[12:18] - aliveTime, _ := strconv.Atoi(aliveTimeStr) // no need to check err, if anything wrong, the following code check will fail soon - - // check code - retCode := CreateTimeLimitCode(data, aliveTime, startTimeStr, nil) - if subtle.ConstantTimeCompare([]byte(retCode), []byte(code)) != 1 { - retCode = CreateTimeLimitCode(data, aliveTime, startTimeStr, sha1.New()) // TODO: this is only for the support of legacy codes, remove this in/after 1.23 - if subtle.ConstantTimeCompare([]byte(retCode), []byte(code)) != 1 { - return false - } - } - - // check time is expired or not: startTime <= now && now < startTime + minutes - startTime, _ := time.ParseInLocation("200601021504", startTimeStr, time.Local) - return (startTime.Before(now) || startTime.Equal(now)) && now.Before(startTime.Add(time.Minute*time.Duration(minutes))) -} - -// TimeLimitCodeLength default value for time limit code -const TimeLimitCodeLength = 12 + 6 + 40 - -// CreateTimeLimitCode create a time-limited code. -// Format: 12 length date time string + 6 minutes string (not used) + 40 hash string, some other code depends on this fixed length -// If h is nil, then use the default hmac hash. -func CreateTimeLimitCode[T time.Time | string](data string, minutes int, startTimeGeneric T, h hash.Hash) string { - const format = "200601021504" - - var start time.Time - var startTimeAny any = startTimeGeneric - if t, ok := startTimeAny.(time.Time); ok { - start = t - } else { - var err error - start, err = time.ParseInLocation(format, startTimeAny.(string), time.Local) - if err != nil { - return "" // return an invalid code because the "parse" failed - } - } - startStr := start.Format(format) - end := start.Add(time.Minute * time.Duration(minutes)) - - if h == nil { - h = hmac.New(sha1.New, setting.GetGeneralTokenSigningSecret()) - } - _, _ = fmt.Fprintf(h, "%s%s%s%s%d", data, hex.EncodeToString(setting.GetGeneralTokenSigningSecret()), startStr, end.Format(format), minutes) - encoded := hex.EncodeToString(h.Sum(nil)) - - code := fmt.Sprintf("%s%06d%s", startStr, minutes, encoded) - if len(code) != TimeLimitCodeLength { - panic("there is a hard requirement for the length of time-limited code") // it shouldn't happen - } - return code -} - // FileSize calculates the file size and generate user-friendly string. func FileSize(s int64) string { return humanize.IBytes(uint64(s)) @@ -167,6 +102,12 @@ func Int64sToStrings(ints []int64) []string { // EntryIcon returns the octicon class for displaying files/directories func EntryIcon(entry *git.TreeEntry) string { + isAnnexed, _ := annex.IsAnnexed(entry.Blob()) + if isAnnexed { + // Show git-annex files as binary files to differentiate them from non-annexed files + // TODO: find a more suitable icon, maybe something related to git-annex + return "file-binary" + } switch { case entry.IsLink(): te, _, err := entry.FollowLink() diff --git a/modules/base/tool_test.go b/modules/base/tool_test.go index 81fd4b6a9e..ed1b469161 100644 --- a/modules/base/tool_test.go +++ b/modules/base/tool_test.go @@ -4,13 +4,7 @@ package base import ( - "crypto/sha1" - "fmt" "testing" - "time" - - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -46,57 +40,6 @@ func TestBasicAuthDecode(t *testing.T) { require.Error(t, err) } -func TestVerifyTimeLimitCode(t *testing.T) { - defer test.MockVariableValue(&setting.InstallLock, true)() - initGeneralSecret := func(secret string) { - setting.InstallLock = true - setting.CfgProvider, _ = setting.NewConfigProviderFromData(fmt.Sprintf(` -[oauth2] -JWT_SECRET = %s -`, secret)) - setting.LoadCommonSettings() - } - - initGeneralSecret("KZb_QLUd4fYVyxetjxC4eZkrBgWM2SndOOWDNtgUUko") - now := time.Now() - - t.Run("TestGenericParameter", func(t *testing.T) { - time2000 := time.Date(2000, 1, 2, 3, 4, 5, 0, time.Local) - assert.Equal(t, "2000010203040000026fa5221b2731b7cf80b1b506f5e39e38c115fee5", CreateTimeLimitCode("test-sha1", 2, time2000, sha1.New())) - assert.Equal(t, "2000010203040000026fa5221b2731b7cf80b1b506f5e39e38c115fee5", CreateTimeLimitCode("test-sha1", 2, "200001020304", sha1.New())) - assert.Equal(t, "2000010203040000024842227a2f87041ff82025199c0187410a9297bf", CreateTimeLimitCode("test-hmac", 2, time2000, nil)) - assert.Equal(t, "2000010203040000024842227a2f87041ff82025199c0187410a9297bf", CreateTimeLimitCode("test-hmac", 2, "200001020304", nil)) - }) - - t.Run("TestInvalidCode", func(t *testing.T) { - assert.False(t, VerifyTimeLimitCode(now, "data", 2, "")) - assert.False(t, VerifyTimeLimitCode(now, "data", 2, "invalid code")) - }) - - t.Run("TestCreateAndVerify", func(t *testing.T) { - code := CreateTimeLimitCode("data", 2, now, nil) - assert.False(t, VerifyTimeLimitCode(now.Add(-time.Minute), "data", 2, code)) // not started yet - assert.True(t, VerifyTimeLimitCode(now, "data", 2, code)) - assert.True(t, VerifyTimeLimitCode(now.Add(time.Minute), "data", 2, code)) - assert.False(t, VerifyTimeLimitCode(now.Add(time.Minute), "DATA", 2, code)) // invalid data - assert.False(t, VerifyTimeLimitCode(now.Add(2*time.Minute), "data", 2, code)) // expired - }) - - t.Run("TestDifferentSecret", func(t *testing.T) { - // use another secret to ensure the code is invalid for different secret - verifyDataCode := func(c string) bool { - return VerifyTimeLimitCode(now, "data", 2, c) - } - code1 := CreateTimeLimitCode("data", 2, now, sha1.New()) - code2 := CreateTimeLimitCode("data", 2, now, nil) - assert.True(t, verifyDataCode(code1)) - assert.True(t, verifyDataCode(code2)) - initGeneralSecret("000_QLUd4fYVyxetjxC4eZkrBgWM2SndOOWDNtgUUko") - assert.False(t, verifyDataCode(code1)) - assert.False(t, verifyDataCode(code2)) - }) -} - func TestFileSize(t *testing.T) { var size int64 = 512 assert.Equal(t, "512 B", FileSize(size)) diff --git a/modules/cache/cache.go b/modules/cache/cache.go index 2148e028d5..9ad4b5cd90 100644 --- a/modules/cache/cache.go +++ b/modules/cache/cache.go @@ -8,7 +8,7 @@ import ( "strconv" "time" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" mc "code.forgejo.org/go-chi/cache" diff --git a/modules/cache/cache_redis.go b/modules/cache/cache_redis.go index 4c243b2426..489a585b04 100644 --- a/modules/cache/cache_redis.go +++ b/modules/cache/cache_redis.go @@ -8,8 +8,8 @@ import ( "strconv" "time" - "code.gitea.io/gitea/modules/graceful" - "code.gitea.io/gitea/modules/nosql" + "forgejo.org/modules/graceful" + "forgejo.org/modules/nosql" "code.forgejo.org/go-chi/cache" ) diff --git a/modules/cache/cache_test.go b/modules/cache/cache_test.go index 8bc986f1a7..8e931d5b2c 100644 --- a/modules/cache/cache_test.go +++ b/modules/cache/cache_test.go @@ -8,7 +8,7 @@ import ( "testing" "time" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/cache/cache_twoqueue.go b/modules/cache/cache_twoqueue.go index c15ed52da1..08efe703c6 100644 --- a/modules/cache/cache_twoqueue.go +++ b/modules/cache/cache_twoqueue.go @@ -8,7 +8,7 @@ import ( "sync" "time" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" mc "code.forgejo.org/go-chi/cache" lru "github.com/hashicorp/golang-lru/v2" diff --git a/modules/cache/context.go b/modules/cache/context.go index f9bdf52044..457c5c1258 100644 --- a/modules/cache/context.go +++ b/modules/cache/context.go @@ -8,7 +8,7 @@ import ( "sync" "time" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // cacheContext is a context that can be used to cache data in a request level context diff --git a/modules/cache/context_test.go b/modules/cache/context_test.go index 072c39440f..4f0f06f535 100644 --- a/modules/cache/context_test.go +++ b/modules/cache/context_test.go @@ -4,7 +4,6 @@ package cache import ( - "context" "testing" "time" @@ -13,7 +12,7 @@ import ( ) func TestWithCacheContext(t *testing.T) { - ctx := WithCacheContext(context.Background()) + ctx := WithCacheContext(t.Context()) v := GetContextData(ctx, "empty_field", "my_config1") assert.Nil(t, v) @@ -53,7 +52,7 @@ func TestWithCacheContext(t *testing.T) { } func TestWithNoCacheContext(t *testing.T) { - ctx := context.Background() + ctx := t.Context() const field = "system_setting" diff --git a/modules/card/card.go b/modules/card/card.go new file mode 100644 index 0000000000..087cd4ec05 --- /dev/null +++ b/modules/card/card.go @@ -0,0 +1,343 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package card + +import ( + "bytes" + "fmt" + "image" + "image/color" + "io" + "math" + "net/http" + "strings" + "sync" + "time" + + _ "image/gif" // for processing gif images + _ "image/jpeg" // for processing jpeg images + _ "image/png" // for processing png images + + "forgejo.org/modules/log" + "forgejo.org/modules/proxy" + "forgejo.org/modules/setting" + + "github.com/golang/freetype" + "github.com/golang/freetype/truetype" + "golang.org/x/image/draw" + "golang.org/x/image/font" + "golang.org/x/image/font/gofont/goregular" + + _ "golang.org/x/image/webp" // for processing webp images +) + +type Card struct { + Img *image.RGBA + Font *truetype.Font + Margin int + Width int + Height int +} + +var fontCache = sync.OnceValues(func() (*truetype.Font, error) { + return truetype.Parse(goregular.TTF) +}) + +// DefaultSize returns the default size for a card +func DefaultSize() (int, int) { + return 1200, 600 +} + +// NewCard creates a new card with the given dimensions in pixels +func NewCard(width, height int) (*Card, error) { + img := image.NewRGBA(image.Rect(0, 0, width, height)) + draw.Draw(img, img.Bounds(), image.NewUniform(color.White), image.Point{}, draw.Src) + + font, err := fontCache() + if err != nil { + return nil, err + } + + return &Card{ + Img: img, + Font: font, + Margin: 0, + Width: width, + Height: height, + }, nil +} + +// Split splits the card horizontally or vertically by a given percentage; the first card returned has the percentage +// size, and the second card has the remainder. Both cards draw to a subsection of the same image buffer. +func (c *Card) Split(vertical bool, percentage int) (*Card, *Card) { + bounds := c.Img.Bounds() + bounds = image.Rect(bounds.Min.X+c.Margin, bounds.Min.Y+c.Margin, bounds.Max.X-c.Margin, bounds.Max.Y-c.Margin) + if vertical { + mid := (bounds.Dx() * percentage / 100) + bounds.Min.X + subleft := c.Img.SubImage(image.Rect(bounds.Min.X, bounds.Min.Y, mid, bounds.Max.Y)).(*image.RGBA) + subright := c.Img.SubImage(image.Rect(mid, bounds.Min.Y, bounds.Max.X, bounds.Max.Y)).(*image.RGBA) + return &Card{Img: subleft, Font: c.Font, Width: subleft.Bounds().Dx(), Height: subleft.Bounds().Dy()}, + &Card{Img: subright, Font: c.Font, Width: subright.Bounds().Dx(), Height: subright.Bounds().Dy()} + } + mid := (bounds.Dy() * percentage / 100) + bounds.Min.Y + subtop := c.Img.SubImage(image.Rect(bounds.Min.X, bounds.Min.Y, bounds.Max.X, mid)).(*image.RGBA) + subbottom := c.Img.SubImage(image.Rect(bounds.Min.X, mid, bounds.Max.X, bounds.Max.Y)).(*image.RGBA) + return &Card{Img: subtop, Font: c.Font, Width: subtop.Bounds().Dx(), Height: subtop.Bounds().Dy()}, + &Card{Img: subbottom, Font: c.Font, Width: subbottom.Bounds().Dx(), Height: subbottom.Bounds().Dy()} +} + +// SetMargin sets the margins for the card +func (c *Card) SetMargin(margin int) { + c.Margin = margin +} + +type ( + VAlign int64 + HAlign int64 +) + +const ( + Top VAlign = iota + Middle + Bottom +) + +const ( + Left HAlign = iota + Center + Right +) + +// DrawText draws text within the card, respecting margins and alignment +func (c *Card) DrawText(text string, textColor color.Color, sizePt float64, valign VAlign, halign HAlign) ([]string, error) { + ft := freetype.NewContext() + ft.SetDPI(72) + ft.SetFont(c.Font) + ft.SetFontSize(sizePt) + ft.SetClip(c.Img.Bounds()) + ft.SetDst(c.Img) + ft.SetSrc(image.NewUniform(textColor)) + + face := truetype.NewFace(c.Font, &truetype.Options{Size: sizePt, DPI: 72}) + fontHeight := ft.PointToFixed(sizePt).Ceil() + + bounds := c.Img.Bounds() + bounds = image.Rect(bounds.Min.X+c.Margin, bounds.Min.Y+c.Margin, bounds.Max.X-c.Margin, bounds.Max.Y-c.Margin) + boxWidth, boxHeight := bounds.Size().X, bounds.Size().Y + // draw.Draw(c.Img, bounds, image.NewUniform(color.Gray{128}), image.Point{}, draw.Src) // Debug draw box + + // Try to apply wrapping to this text; we'll find the most text that will fit into one line, record that line, move + // on. We precalculate each line before drawing so that we can support valign="middle" correctly which requires + // knowing the total height, which is related to how many lines we'll have. + lines := make([]string, 0) + textWords := strings.Split(text, " ") + currentLine := "" + heightTotal := 0 + + for { + if len(textWords) == 0 { + // Ran out of words. + if currentLine != "" { + heightTotal += fontHeight + lines = append(lines, currentLine) + } + break + } + + nextWord := textWords[0] + proposedLine := currentLine + if proposedLine != "" { + proposedLine += " " + } + proposedLine += nextWord + + proposedLineWidth := font.MeasureString(face, proposedLine) + if proposedLineWidth.Ceil() > boxWidth { + // no, proposed line is too big; we'll use the last "currentLine" + heightTotal += fontHeight + if currentLine != "" { + lines = append(lines, currentLine) + currentLine = "" + // leave nextWord in textWords and keep going + } else { + // just nextWord by itself doesn't fit on a line; well, we can't skip it, but we'll consume it + // regardless as a line by itself. It will be clipped by the drawing routine. + lines = append(lines, nextWord) + textWords = textWords[1:] + } + } else { + // yes, it will fit + currentLine = proposedLine + textWords = textWords[1:] + } + } + + textY := 0 + switch valign { + case Top: + textY = fontHeight + case Bottom: + textY = boxHeight - heightTotal + fontHeight + case Middle: + textY = ((boxHeight - heightTotal) / 2) + fontHeight + } + + for _, line := range lines { + lineWidth := font.MeasureString(face, line) + + textX := 0 + switch halign { + case Left: + textX = 0 + case Right: + textX = boxWidth - lineWidth.Ceil() + case Center: + textX = (boxWidth - lineWidth.Ceil()) / 2 + } + + pt := freetype.Pt(bounds.Min.X+textX, bounds.Min.Y+textY) + _, err := ft.DrawString(line, pt) + if err != nil { + return nil, err + } + + textY += fontHeight + } + + return lines, nil +} + +// DrawImage fills the card with an image, scaled to maintain the original aspect ratio and centered with respect to the non-filled dimension +func (c *Card) DrawImage(img image.Image) { + bounds := c.Img.Bounds() + targetRect := image.Rect(bounds.Min.X+c.Margin, bounds.Min.Y+c.Margin, bounds.Max.X-c.Margin, bounds.Max.Y-c.Margin) + srcBounds := img.Bounds() + srcAspect := float64(srcBounds.Dx()) / float64(srcBounds.Dy()) + targetAspect := float64(targetRect.Dx()) / float64(targetRect.Dy()) + + var scale float64 + if srcAspect > targetAspect { + // Image is wider than target, scale by width + scale = float64(targetRect.Dx()) / float64(srcBounds.Dx()) + } else { + // Image is taller or equal, scale by height + scale = float64(targetRect.Dy()) / float64(srcBounds.Dy()) + } + + newWidth := int(math.Round(float64(srcBounds.Dx()) * scale)) + newHeight := int(math.Round(float64(srcBounds.Dy()) * scale)) + + // Center the image within the target rectangle + offsetX := (targetRect.Dx() - newWidth) / 2 + offsetY := (targetRect.Dy() - newHeight) / 2 + + scaledRect := image.Rect(targetRect.Min.X+offsetX, targetRect.Min.Y+offsetY, targetRect.Min.X+offsetX+newWidth, targetRect.Min.Y+offsetY+newHeight) + draw.CatmullRom.Scale(c.Img, scaledRect, img, srcBounds, draw.Over, nil) +} + +func fallbackImage() image.Image { + // can't usage image.Uniform(color.White) because it's infinitely sized causing a panic in the scaler in DrawImage + img := image.NewRGBA(image.Rect(0, 0, 1, 1)) + img.Set(0, 0, color.White) + return img +} + +// As defensively as possible, attempt to load an image from a presumed external and untrusted URL +func (c *Card) fetchExternalImage(url string) (image.Image, bool) { + // Use a short timeout; in the event of any failure we'll be logging and returning a placeholder, but we don't want + // this rendering process to be slowed down + client := &http.Client{ + Timeout: 1 * time.Second, // 1 second timeout + Transport: &http.Transport{ + Proxy: proxy.Proxy(), + }, + } + + // Go expects a absolute URL, so we must change a relative to an absolute one + if !strings.Contains(url, "://") { + url = fmt.Sprintf("%s%s", setting.AppURL, strings.TrimPrefix(url, "/")) + } + + resp, err := client.Get(url) + if err != nil { + log.Warn("error when fetching external image from %s: %v", url, err) + return nil, false + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + log.Warn("non-OK error code when fetching external image from %s: %s", url, resp.Status) + return nil, false + } + + contentType := resp.Header.Get("Content-Type") + // Support content types are in-sync with the allowed custom avatar file types + if contentType != "image/png" && contentType != "image/jpeg" && contentType != "image/gif" && contentType != "image/webp" { + log.Warn("fetching external image returned unsupported Content-Type which was ignored: %s", contentType) + return nil, false + } + + body := io.LimitReader(resp.Body, setting.Avatar.MaxFileSize) + bodyBytes, err := io.ReadAll(body) + if err != nil { + log.Warn("error when fetching external image from %s: %w", url, err) + return nil, false + } + if int64(len(bodyBytes)) == setting.Avatar.MaxFileSize { + log.Warn("while fetching external image response size hit MaxFileSize (%d) and was discarded from url %s", setting.Avatar.MaxFileSize, url) + return nil, false + } + + bodyBuffer := bytes.NewReader(bodyBytes) + imgCfg, imgType, err := image.DecodeConfig(bodyBuffer) + if err != nil { + log.Warn("error when decoding external image from %s: %w", url, err) + return nil, false + } + + // Verify that we have a match between actual data understood in the image body and the reported Content-Type + if (contentType == "image/png" && imgType != "png") || + (contentType == "image/jpeg" && imgType != "jpeg") || + (contentType == "image/gif" && imgType != "gif") || + (contentType == "image/webp" && imgType != "webp") { + log.Warn("while fetching external image, mismatched image body (%s) and Content-Type (%s)", imgType, contentType) + return nil, false + } + + // do not process image which is too large, it would consume too much memory + if imgCfg.Width > setting.Avatar.MaxWidth { + log.Warn("while fetching external image, width %d exceeds Avatar.MaxWidth %d", imgCfg.Width, setting.Avatar.MaxWidth) + return nil, false + } + if imgCfg.Height > setting.Avatar.MaxHeight { + log.Warn("while fetching external image, height %d exceeds Avatar.MaxHeight %d", imgCfg.Height, setting.Avatar.MaxHeight) + return nil, false + } + + _, err = bodyBuffer.Seek(0, io.SeekStart) // reset for actual decode + if err != nil { + log.Warn("error w/ bodyBuffer.Seek") + return nil, false + } + img, _, err := image.Decode(bodyBuffer) + if err != nil { + log.Warn("error when decoding external image from %s: %w", url, err) + return nil, false + } + + return img, true +} + +func (c *Card) DrawExternalImage(url string) { + image, ok := c.fetchExternalImage(url) + if !ok { + image = fallbackImage() + } + c.DrawImage(image) +} + +// DrawRect draws a rect with the given color +func (c *Card) DrawRect(startX, startY, endX, endY int, color color.Color) { + draw.Draw(c.Img, image.Rect(startX, startY, endX, endY), &image.Uniform{color}, image.Point{}, draw.Src) +} diff --git a/modules/card/card_test.go b/modules/card/card_test.go new file mode 100644 index 0000000000..ef695b4549 --- /dev/null +++ b/modules/card/card_test.go @@ -0,0 +1,244 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package card + +import ( + "bytes" + "encoding/base64" + "fmt" + "image" + "image/color" + "image/png" + "net/http" + "net/http/httptest" + "testing" + "time" + + "forgejo.org/modules/log" + "forgejo.org/modules/test" + + "github.com/golang/freetype/truetype" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "golang.org/x/image/font/gofont/goregular" +) + +func TestNewCard(t *testing.T) { + width, height := 100, 50 + card, err := NewCard(width, height) + require.NoError(t, err, "No error should occur when creating a new card") + assert.NotNil(t, card, "Card should not be nil") + assert.Equal(t, width, card.Img.Bounds().Dx(), "Width should match the provided width") + assert.Equal(t, height, card.Img.Bounds().Dy(), "Height should match the provided height") + + // Checking default margin + assert.Equal(t, 0, card.Margin, "Default margin should be 0") + + // Checking font parsing + originalFont, _ := truetype.Parse(goregular.TTF) + assert.Equal(t, originalFont, card.Font, "Fonts should be equivalent") +} + +func TestSplit(t *testing.T) { + // Note: you normally wouldn't split the same card twice as draw operations would start to overlap each other; but + // it's fine for this limited scope test + card, _ := NewCard(200, 100) + + // Test vertical split + leftCard, rightCard := card.Split(true, 50) + assert.Equal(t, 100, leftCard.Img.Bounds().Dx(), "Left card should have half the width of original") + assert.Equal(t, 100, leftCard.Img.Bounds().Dy(), "Left card height unchanged by split") + assert.Equal(t, 100, rightCard.Img.Bounds().Dx(), "Right card should have half the width of original") + assert.Equal(t, 100, rightCard.Img.Bounds().Dy(), "Right card height unchanged by split") + + // Test horizontal split + topCard, bottomCard := card.Split(false, 50) + assert.Equal(t, 200, topCard.Img.Bounds().Dx(), "Top card width unchanged by split") + assert.Equal(t, 50, topCard.Img.Bounds().Dy(), "Top card should have half the height of original") + assert.Equal(t, 200, bottomCard.Img.Bounds().Dx(), "Bottom width unchanged by split") + assert.Equal(t, 50, bottomCard.Img.Bounds().Dy(), "Bottom card should have half the height of original") +} + +func TestDrawTextSingleLine(t *testing.T) { + card, _ := NewCard(300, 100) + lines, err := card.DrawText("This is a single line", color.Black, 12, Middle, Center) + require.NoError(t, err, "No error should occur when drawing text") + assert.Len(t, lines, 1, "Should be exactly one line") + assert.Equal(t, "This is a single line", lines[0], "Text should match the input") +} + +func TestDrawTextLongLine(t *testing.T) { + card, _ := NewCard(300, 100) + text := "This text is definitely too long to fit in three hundred pixels width without wrapping" + lines, err := card.DrawText(text, color.Black, 12, Middle, Center) + require.NoError(t, err, "No error should occur when drawing text") + assert.Len(t, lines, 2, "Text should wrap into multiple lines") + assert.Equal(t, "This text is definitely too long to fit in three hundred", lines[0], "Text should match the input") + assert.Equal(t, "pixels width without wrapping", lines[1], "Text should match the input") +} + +func TestDrawTextWordTooLong(t *testing.T) { + card, _ := NewCard(300, 100) + text := "Line 1 Superduperlongwordthatcannotbewrappedbutshouldenduponitsownsingleline Line 3" + lines, err := card.DrawText(text, color.Black, 12, Middle, Center) + require.NoError(t, err, "No error should occur when drawing text") + assert.Len(t, lines, 3, "Text should create two lines despite long word") + assert.Equal(t, "Line 1", lines[0], "First line should contain text before the long word") + assert.Equal(t, "Superduperlongwordthatcannotbewrappedbutshouldenduponitsownsingleline", lines[1], "Second line couldn't wrap the word so it just overflowed") + assert.Equal(t, "Line 3", lines[2], "Third line continued with wrapping") +} + +func TestFetchExternalImageServer(t *testing.T) { + blackPng, err := base64.URLEncoding.DecodeString("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQAAAAA3bvkkAAAACklEQVR4AWNgAAAAAgABc3UBGAAAAABJRU5ErkJggg==") + if err != nil { + t.Error(err) + return + } + + var tooWideBuf bytes.Buffer + imgTooWide := image.NewGray(image.Rect(0, 0, 16001, 10)) + err = png.Encode(&tooWideBuf, imgTooWide) + if err != nil { + t.Error(err) + return + } + imgTooWidePng := tooWideBuf.Bytes() + + var tooTallBuf bytes.Buffer + imgTooTall := image.NewGray(image.Rect(0, 0, 10, 16002)) + err = png.Encode(&tooTallBuf, imgTooTall) + if err != nil { + t.Error(err) + return + } + imgTooTallPng := tooTallBuf.Bytes() + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case "/timeout": + // Simulate a timeout by taking a long time to respond + time.Sleep(8 * time.Second) + w.Header().Set("Content-Type", "image/png") + w.Write(blackPng) + case "/notfound": + http.NotFound(w, r) + case "/image.png": + w.Header().Set("Content-Type", "image/png") + w.Write(blackPng) + case "/weird-content": + w.Header().Set("Content-Type", "text/html") + w.Write([]byte("")) + case "/giant-response": + w.Header().Set("Content-Type", "image/png") + w.Write(make([]byte, 10485760)) + case "/invalid.png": + w.Header().Set("Content-Type", "image/png") + w.Write(make([]byte, 100)) + case "/mismatched.jpg": + w.Header().Set("Content-Type", "image/jpeg") + w.Write(blackPng) // valid png, but wrong content-type + case "/too-wide.png": + w.Header().Set("Content-Type", "image/png") + w.Write(imgTooWidePng) + case "/too-tall.png": + w.Header().Set("Content-Type", "image/png") + w.Write(imgTooTallPng) + default: + w.WriteHeader(http.StatusInternalServerError) + } + })) + defer server.Close() + + tests := []struct { + name string + url string + expectedSuccess bool + expectedLog string + }{ + { + name: "timeout error", + url: "/timeout", + expectedSuccess: false, + expectedLog: "error when fetching external image from", + }, + { + name: "external fetch success", + url: "/image.png", + expectedSuccess: true, + expectedLog: "", + }, + { + name: "404 fallback", + url: "/notfound", + expectedSuccess: false, + expectedLog: "non-OK error code when fetching external image", + }, + { + name: "unsupported content type", + url: "/weird-content", + expectedSuccess: false, + expectedLog: "fetching external image returned unsupported Content-Type", + }, + { + name: "response too large", + url: "/giant-response", + expectedSuccess: false, + expectedLog: "while fetching external image response size hit MaxFileSize", + }, + { + name: "invalid png", + url: "/invalid.png", + expectedSuccess: false, + expectedLog: "error when decoding external image", + }, + { + name: "mismatched content type", + url: "/mismatched.jpg", + expectedSuccess: false, + expectedLog: "while fetching external image, mismatched image body", + }, + { + name: "too wide", + url: "/too-wide.png", + expectedSuccess: false, + expectedLog: "while fetching external image, width 16001 exceeds Avatar.MaxWidth", + }, + { + name: "too tall", + url: "/too-tall.png", + expectedSuccess: false, + expectedLog: "while fetching external image, height 16002 exceeds Avatar.MaxHeight", + }, + } + + for _, testCase := range tests { + t.Run(testCase.name, func(t *testing.T) { + // stopMark is used as a logging boundary to verify that the expected message (testCase.expectedLog) is + // logged during the `fetchExternalImage` operation. This is verified by a combination of checking that the + // stopMark message was received, and that the filtered log (logFiltered[0]) was received. + stopMark := fmt.Sprintf(">>>>>>>>>>>>>STOP: %s<<<<<<<<<<<<<<<", testCase.name) + + logChecker, cleanup := test.NewLogChecker(log.DEFAULT, log.TRACE) + logChecker.Filter(testCase.expectedLog).StopMark(stopMark) + defer cleanup() + + card, _ := NewCard(100, 100) + img, ok := card.fetchExternalImage(server.URL + testCase.url) + + if testCase.expectedSuccess { + assert.True(t, ok, "expected success from fetchExternalImage") + assert.NotNil(t, img) + } else { + assert.False(t, ok, "expected failure from fetchExternalImage") + assert.Nil(t, img) + } + + log.Info(stopMark) + + logFiltered, logStopped := logChecker.Check(5 * time.Second) + assert.True(t, logStopped, "failed to find log stop mark") + assert.True(t, logFiltered[0], "failed to find in log: '%s'", testCase.expectedLog) + }) + } +} diff --git a/modules/charset/ambiguous.go b/modules/charset/ambiguous.go index 96e0561e15..a8eacf26a0 100644 --- a/modules/charset/ambiguous.go +++ b/modules/charset/ambiguous.go @@ -9,7 +9,7 @@ import ( "strings" "unicode" - "code.gitea.io/gitea/modules/translation" + "forgejo.org/modules/translation" ) // AmbiguousTablesForLocale provides the table of ambiguous characters for this locale. diff --git a/modules/charset/ambiguous/generate.go b/modules/charset/ambiguous/generate.go index e3fda5be98..bf7c03a16c 100644 --- a/modules/charset/ambiguous/generate.go +++ b/modules/charset/ambiguous/generate.go @@ -13,7 +13,7 @@ import ( "text/template" "unicode" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" "golang.org/x/text/unicode/rangetable" ) diff --git a/modules/charset/breakwriter.go b/modules/charset/breakwriter.go deleted file mode 100644 index a87e846466..0000000000 --- a/modules/charset/breakwriter.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2022 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package charset - -import ( - "bytes" - "io" -) - -// BreakWriter wraps an io.Writer to always write '\n' as '
    ' -type BreakWriter struct { - io.Writer -} - -// Write writes the provided byte slice transparently replacing '\n' with '
    ' -func (b *BreakWriter) Write(bs []byte) (n int, err error) { - pos := 0 - for pos < len(bs) { - idx := bytes.IndexByte(bs[pos:], '\n') - if idx < 0 { - wn, err := b.Writer.Write(bs[pos:]) - return n + wn, err - } - - if idx > 0 { - wn, err := b.Writer.Write(bs[pos : pos+idx]) - n += wn - if err != nil { - return n, err - } - } - - if _, err = b.Writer.Write([]byte("
    ")); err != nil { - return n, err - } - pos += idx + 1 - - n++ - } - - return n, err -} diff --git a/modules/charset/breakwriter_test.go b/modules/charset/breakwriter_test.go deleted file mode 100644 index 5eeeedc4e2..0000000000 --- a/modules/charset/breakwriter_test.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2022 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package charset - -import ( - "strings" - "testing" -) - -func TestBreakWriter_Write(t *testing.T) { - tests := []struct { - name string - kase string - expect string - wantErr bool - }{ - { - name: "noline", - kase: "abcdefghijklmnopqrstuvwxyz", - expect: "abcdefghijklmnopqrstuvwxyz", - }, - { - name: "endline", - kase: "abcdefghijklmnopqrstuvwxyz\n", - expect: "abcdefghijklmnopqrstuvwxyz
    ", - }, - { - name: "startline", - kase: "\nabcdefghijklmnopqrstuvwxyz", - expect: "
    abcdefghijklmnopqrstuvwxyz", - }, - { - name: "onlyline", - kase: "\n\n\n", - expect: "


    ", - }, - { - name: "empty", - kase: "", - expect: "", - }, - { - name: "midline", - kase: "\nabc\ndefghijkl\nmnopqrstuvwxy\nz", - expect: "
    abc
    defghijkl
    mnopqrstuvwxy
    z", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - buf := &strings.Builder{} - b := &BreakWriter{ - Writer: buf, - } - n, err := b.Write([]byte(tt.kase)) - if (err != nil) != tt.wantErr { - t.Errorf("BreakWriter.Write() error = %v, wantErr %v", err, tt.wantErr) - return - } - if n != len(tt.kase) { - t.Errorf("BreakWriter.Write() = %v, want %v", n, len(tt.kase)) - } - if buf.String() != tt.expect { - t.Errorf("BreakWriter.Write() wrote %q, want %v", buf.String(), tt.expect) - } - }) - } -} diff --git a/modules/charset/charset.go b/modules/charset/charset.go index 1855446a98..cb03deb966 100644 --- a/modules/charset/charset.go +++ b/modules/charset/charset.go @@ -10,9 +10,9 @@ import ( "strings" "unicode/utf8" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" "github.com/gogs/chardet" "golang.org/x/net/html/charset" @@ -134,7 +134,7 @@ func DetectEncoding(content []byte) (string, error) { // First we check if the content represents valid utf8 content excepting a truncated character at the end. // Now we could decode all the runes in turn but this is not necessarily the cheapest thing to do - // instead we walk backwards from the end to trim off a the incomplete character + // instead we walk backwards from the end to trim off the incomplete character toValidate := content end := len(toValidate) - 1 diff --git a/modules/charset/charset_test.go b/modules/charset/charset_test.go index 42c8415376..ef0d1565d6 100644 --- a/modules/charset/charset_test.go +++ b/modules/charset/charset_test.go @@ -9,7 +9,7 @@ import ( "strings" "testing" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -41,14 +41,12 @@ func TestMaybeRemoveBOM(t *testing.T) { func TestToUTF8(t *testing.T) { resetDefaultCharsetsOrder() - var res string - var err error // Note: golang compiler seems so behave differently depending on the current // locale, so some conversions might behave differently. For that reason, we don't // depend on particular conversions but in expected behaviors. - res, err = ToUTF8([]byte{0x41, 0x42, 0x43}, ConvertOpts{}) + res, err := ToUTF8([]byte{0x41, 0x42, 0x43}, ConvertOpts{}) require.NoError(t, err) assert.Equal(t, "ABC", res) diff --git a/modules/charset/escape.go b/modules/charset/escape.go index ba0eb73a3a..57b13c1f18 100644 --- a/modules/charset/escape.go +++ b/modules/charset/escape.go @@ -13,9 +13,9 @@ import ( "slices" "strings" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/translation" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/translation" ) // RuneNBSP is the codepoint for NBSP diff --git a/modules/charset/escape_stream.go b/modules/charset/escape_stream.go index 29943eb858..01ebf52a15 100644 --- a/modules/charset/escape_stream.go +++ b/modules/charset/escape_stream.go @@ -10,7 +10,7 @@ import ( "unicode" "unicode/utf8" - "code.gitea.io/gitea/modules/translation" + "forgejo.org/modules/translation" "golang.org/x/net/html" ) diff --git a/modules/charset/escape_test.go b/modules/charset/escape_test.go index 2ca76f88d5..eec6f102cb 100644 --- a/modules/charset/escape_test.go +++ b/modules/charset/escape_test.go @@ -8,9 +8,9 @@ import ( "strings" "testing" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/test" - "code.gitea.io/gitea/modules/translation" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" + "forgejo.org/modules/translation" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/container/set.go b/modules/container/set.go index 15779983fd..70f837bc66 100644 --- a/modules/container/set.go +++ b/modules/container/set.go @@ -3,6 +3,11 @@ package container +import ( + "iter" + "maps" +) + type Set[T comparable] map[T]struct{} // SetOf creates a set and adds the specified elements to it. @@ -29,6 +34,15 @@ func (s Set[T]) AddMultiple(values ...T) { } } +func (s Set[T]) IsSubset(subset []T) bool { + for _, v := range subset { + if !s.Contains(v) { + return false + } + } + return true +} + // Contains determines whether a set contains the specified element. // Returns true if the set contains the specified element; otherwise, false. func (s Set[T]) Contains(value T) bool { @@ -54,3 +68,9 @@ func (s Set[T]) Values() []T { } return keys } + +// Seq returns a iterator over the elements in the set. +// It returns a single-use iterator. +func (s Set[T]) Seq() iter.Seq[T] { + return maps.Keys(s) +} diff --git a/modules/container/set_test.go b/modules/container/set_test.go index 1502236034..e54e31a052 100644 --- a/modules/container/set_test.go +++ b/modules/container/set_test.go @@ -4,6 +4,7 @@ package container import ( + "slices" "testing" "github.com/stretchr/testify/assert" @@ -29,8 +30,21 @@ func TestSet(t *testing.T) { assert.True(t, s.Contains("key4")) assert.True(t, s.Contains("key5")) + values := s.Values() + called := 0 + for value := range s.Seq() { + called++ + assert.True(t, slices.Contains(values, value)) + } + assert.EqualValues(t, len(values), called) + s = SetOf("key6", "key7") assert.False(t, s.Contains("key1")) assert.True(t, s.Contains("key6")) assert.True(t, s.Contains("key7")) + + assert.True(t, s.IsSubset([]string{"key6", "key7"})) + assert.False(t, s.IsSubset([]string{"key1"})) + + assert.True(t, s.IsSubset([]string{})) } diff --git a/modules/csv/csv.go b/modules/csv/csv.go index 35c5d6ab67..996a35bdeb 100644 --- a/modules/csv/csv.go +++ b/modules/csv/csv.go @@ -11,9 +11,9 @@ import ( "regexp" "strings" - "code.gitea.io/gitea/modules/markup" - "code.gitea.io/gitea/modules/translation" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/markup" + "forgejo.org/modules/translation" + "forgejo.org/modules/util" ) const ( diff --git a/modules/csv/csv_test.go b/modules/csv/csv_test.go index 6ed6986629..6eb3b3056f 100644 --- a/modules/csv/csv_test.go +++ b/modules/csv/csv_test.go @@ -11,9 +11,9 @@ import ( "strings" "testing" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/markup" - "code.gitea.io/gitea/modules/translation" + "forgejo.org/modules/git" + "forgejo.org/modules/markup" + "forgejo.org/modules/translation" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/eventsource/event.go b/modules/eventsource/event.go index ebcca50903..0e4dbf6e9c 100644 --- a/modules/eventsource/event.go +++ b/modules/eventsource/event.go @@ -10,7 +10,7 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" ) func wrapNewlines(w io.Writer, prefix, value []byte) (sum int64, err error) { diff --git a/modules/eventsource/manager_run.go b/modules/eventsource/manager_run.go index f66dc78c7e..0eaee5dc3c 100644 --- a/modules/eventsource/manager_run.go +++ b/modules/eventsource/manager_run.go @@ -7,15 +7,15 @@ import ( "context" "time" - activities_model "code.gitea.io/gitea/models/activities" - issues_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/modules/graceful" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/process" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/services/convert" + activities_model "forgejo.org/models/activities" + issues_model "forgejo.org/models/issues" + "forgejo.org/modules/graceful" + "forgejo.org/modules/json" + "forgejo.org/modules/log" + "forgejo.org/modules/process" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" + "forgejo.org/services/convert" ) // Init starts this eventsource @@ -90,8 +90,8 @@ loop: return } - for _, userStopwatches := range usersStopwatches { - apiSWs, err := convert.ToStopWatches(ctx, userStopwatches.StopWatches) + for uid, stopwatches := range usersStopwatches { + apiSWs, err := convert.ToStopWatches(ctx, stopwatches) if err != nil { if !issues_model.IsErrIssueNotExist(err) { log.Error("Unable to APIFormat stopwatches: %v", err) @@ -103,7 +103,7 @@ loop: log.Error("Unable to marshal stopwatches: %v", err) continue } - m.SendMessage(userStopwatches.UserID, &Event{ + m.SendMessage(uid, &Event{ Name: "stopwatches", Data: string(dataBs), }) diff --git a/modules/forgefed/activity.go b/modules/forgefed/activity_like.go similarity index 91% rename from modules/forgefed/activity.go rename to modules/forgefed/activity_like.go index 247abd255a..e52d0a9af6 100644 --- a/modules/forgefed/activity.go +++ b/modules/forgefed/activity_like.go @@ -6,7 +6,7 @@ package forgefed import ( "time" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/validation" ap "github.com/go-ap/activitypub" ) @@ -21,8 +21,8 @@ type ForgeLike struct { func NewForgeLike(actorIRI, objectIRI string, startTime time.Time) (ForgeLike, error) { result := ForgeLike{} result.Type = ap.LikeType - result.Actor = ap.IRI(actorIRI) // That's us, a User - result.Object = ap.IRI(objectIRI) // That's them, a Repository + result.Actor = ap.IRI(actorIRI) + result.Object = ap.IRI(objectIRI) result.StartTime = startTime if valid, err := validation.IsValid(result); !valid { return ForgeLike{}, err @@ -46,20 +46,23 @@ func (like ForgeLike) Validate() []string { var result []string result = append(result, validation.ValidateNotEmpty(string(like.Type), "type")...) result = append(result, validation.ValidateOneOf(string(like.Type), []any{"Like"}, "type")...) + if like.Actor == nil { result = append(result, "Actor should not be nil.") } else { result = append(result, validation.ValidateNotEmpty(like.Actor.GetID().String(), "actor")...) } - if like.Object == nil { - result = append(result, "Object should not be nil.") - } else { - result = append(result, validation.ValidateNotEmpty(like.Object.GetID().String(), "object")...) - } + result = append(result, validation.ValidateNotEmpty(like.StartTime.String(), "startTime")...) if like.StartTime.IsZero() { result = append(result, "StartTime was invalid.") } + if like.Object == nil { + result = append(result, "Object should not be nil.") + } else { + result = append(result, validation.ValidateNotEmpty(like.Object.GetID().String(), "object")...) + } + return result } diff --git a/modules/forgefed/activity_test.go b/modules/forgefed/activity_like_test.go similarity index 79% rename from modules/forgefed/activity_test.go rename to modules/forgefed/activity_like_test.go index 9a7979c4e6..815b0e02f3 100644 --- a/modules/forgefed/activity_test.go +++ b/modules/forgefed/activity_like_test.go @@ -10,17 +10,17 @@ import ( "testing" "time" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/validation" ap "github.com/go-ap/activitypub" ) func Test_NewForgeLike(t *testing.T) { + want := []byte(`{"type":"Like","startTime":"2024-03-07T00:00:00Z","actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1","object":"https://codeberg.org/api/v1/activitypub/repository-id/1"}`) + actorIRI := "https://repo.prod.meissa.de/api/v1/activitypub/user-id/1" objectIRI := "https://codeberg.org/api/v1/activitypub/repository-id/1" - want := []byte(`{"type":"Like","startTime":"2024-03-27T00:00:00Z","actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1","object":"https://codeberg.org/api/v1/activitypub/repository-id/1"}`) - - startTime, _ := time.Parse("2006-Jan-02", "2024-Mar-27") + startTime, _ := time.Parse("2006-Jan-02", "2024-Mar-07") sut, err := NewForgeLike(actorIRI, objectIRI, startTime) if err != nil { t.Errorf("unexpected error: %v\n", err) @@ -84,7 +84,6 @@ func Test_LikeUnmarshalJSON(t *testing.T) { wantErr error } - //revive:disable tests := map[string]testPair{ "with ID": { item: []byte(`{"type":"Like","actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1","object":"https://codeberg.org/api/activitypub/repository-id/1"}`), @@ -100,10 +99,9 @@ func Test_LikeUnmarshalJSON(t *testing.T) { "invalid": { item: []byte(`{"type":"Invalid","actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1","object":"https://codeberg.org/api/activitypub/repository-id/1"`), want: &ForgeLike{}, - wantErr: fmt.Errorf("cannot parse JSON:"), + wantErr: fmt.Errorf("cannot parse JSON"), }, } - //revive:enable for name, test := range tests { t.Run(name, func(t *testing.T) { @@ -120,7 +118,9 @@ func Test_LikeUnmarshalJSON(t *testing.T) { } } -func TestActivityValidation(t *testing.T) { +func Test_ForgeLikeValidation(t *testing.T) { + // Successful + sut := new(ForgeLike) sut.UnmarshalJSON([]byte(`{"type":"Like", "actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1", @@ -130,35 +130,37 @@ func TestActivityValidation(t *testing.T) { t.Errorf("sut expected to be valid: %v\n", sut.Validate()) } + // Errors + sut.UnmarshalJSON([]byte(`{"actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1", "object":"https://codeberg.org/api/activitypub/repository-id/1", "startTime": "2014-12-31T23:00:00-08:00"}`)) - if sut.Validate()[0] != "type should not be empty" { - t.Errorf("validation error expected but was: %v\n", sut.Validate()[0]) + if err := validateAndCheckError(sut, "type should not be empty"); err != nil { + t.Error(err) } sut.UnmarshalJSON([]byte(`{"type":"bad-type", "actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1", "object":"https://codeberg.org/api/activitypub/repository-id/1", "startTime": "2014-12-31T23:00:00-08:00"}`)) - if sut.Validate()[0] != "Value bad-type is not contained in allowed values [Like]" { - t.Errorf("validation error expected but was: %v\n", sut.Validate()[0]) + if err := validateAndCheckError(sut, "Value bad-type is not contained in allowed values [Like]"); err != nil { + t.Error(err) } sut.UnmarshalJSON([]byte(`{"type":"Like", "actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1", - "object":"https://codeberg.org/api/activitypub/repository-id/1", - "startTime": "not a date"}`)) - if sut.Validate()[0] != "StartTime was invalid." { - t.Errorf("validation error expected but was: %v\n", sut.Validate()) + "object":"https://codeberg.org/api/activitypub/repository-id/1", + "startTime": "not a date"}`)) + if err := validateAndCheckError(sut, "StartTime was invalid."); err != nil { + t.Error(err) } sut.UnmarshalJSON([]byte(`{"type":"Wrong", "actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1", - "object":"https://codeberg.org/api/activitypub/repository-id/1", - "startTime": "2014-12-31T23:00:00-08:00"}`)) - if sut.Validate()[0] != "Value Wrong is not contained in allowed values [Like]" { - t.Errorf("validation error expected but was: %v\n", sut.Validate()) + "object":"https://codeberg.org/api/activitypub/repository-id/1", + "startTime": "2014-12-31T23:00:00-08:00"}`)) + if err := validateAndCheckError(sut, "Value Wrong is not contained in allowed values [Like]"); err != nil { + t.Error(err) } } @@ -166,6 +168,6 @@ func TestActivityValidation_Attack(t *testing.T) { sut := new(ForgeLike) sut.UnmarshalJSON([]byte(`{rubbish}`)) if len(sut.Validate()) != 5 { - t.Errorf("5 validateion errors expected but was: %v\n", len(sut.Validate())) + t.Errorf("5 validation errors expected but was: %v\n", len(sut.Validate())) } } diff --git a/modules/forgefed/activity_undo_like.go b/modules/forgefed/activity_undo_like.go new file mode 100644 index 0000000000..8b7df582ad --- /dev/null +++ b/modules/forgefed/activity_undo_like.go @@ -0,0 +1,80 @@ +// Copyright 2023, 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package forgefed + +import ( + "time" + + "forgejo.org/modules/validation" + + ap "github.com/go-ap/activitypub" +) + +// ForgeLike activity data type +// swagger:model +type ForgeUndoLike struct { + // swagger:ignore + ap.Activity +} + +func NewForgeUndoLike(actorIRI, objectIRI string, startTime time.Time) (ForgeUndoLike, error) { + result := ForgeUndoLike{} + result.Type = ap.UndoType + result.Actor = ap.IRI(actorIRI) + result.StartTime = startTime + + like := ap.Activity{} + like.Type = ap.LikeType + like.Actor = ap.IRI(actorIRI) + like.Object = ap.IRI(objectIRI) + result.Object = &like + + if valid, err := validation.IsValid(result); !valid { + return ForgeUndoLike{}, err + } + return result, nil +} + +func (undo *ForgeUndoLike) UnmarshalJSON(data []byte) error { + return undo.Activity.UnmarshalJSON(data) +} + +func (undo ForgeUndoLike) Validate() []string { + var result []string + result = append(result, validation.ValidateNotEmpty(string(undo.Type), "type")...) + result = append(result, validation.ValidateOneOf(string(undo.Type), []any{"Undo"}, "type")...) + + if undo.Actor == nil { + result = append(result, "Actor should not be nil.") + } else { + result = append(result, validation.ValidateNotEmpty(undo.Actor.GetID().String(), "actor")...) + } + + result = append(result, validation.ValidateNotEmpty(undo.StartTime.String(), "startTime")...) + if undo.StartTime.IsZero() { + result = append(result, "StartTime was invalid.") + } + + if undo.Object == nil { + result = append(result, "object should not be empty.") + } else if activity, ok := undo.Object.(*ap.Activity); !ok { + result = append(result, "object is not of type Activity") + } else { + result = append(result, validation.ValidateNotEmpty(string(activity.Type), "type")...) + result = append(result, validation.ValidateOneOf(string(activity.Type), []any{"Like"}, "type")...) + + if activity.Actor == nil { + result = append(result, "Object.Actor should not be nil.") + } else { + result = append(result, validation.ValidateNotEmpty(activity.Actor.GetID().String(), "actor")...) + } + + if activity.Object == nil { + result = append(result, "Object.Object should not be nil.") + } else { + result = append(result, validation.ValidateNotEmpty(activity.Object.GetID().String(), "object")...) + } + } + return result +} diff --git a/modules/forgefed/activity_undo_like_test.go b/modules/forgefed/activity_undo_like_test.go new file mode 100644 index 0000000000..1b77369b67 --- /dev/null +++ b/modules/forgefed/activity_undo_like_test.go @@ -0,0 +1,246 @@ +// Copyright 2023, 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package forgefed + +import ( + "fmt" + "reflect" + "strings" + "testing" + "time" + + "forgejo.org/modules/validation" + + ap "github.com/go-ap/activitypub" +) + +func Test_NewForgeUndoLike(t *testing.T) { + actorIRI := "https://repo.prod.meissa.de/api/v1/activitypub/user-id/1" + objectIRI := "https://codeberg.org/api/v1/activitypub/repository-id/1" + want := []byte(`{"type":"Undo","startTime":"2024-03-27T00:00:00Z",` + + `"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",` + + `"object":{` + + `"type":"Like",` + + `"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",` + + `"object":"https://codeberg.org/api/v1/activitypub/repository-id/1"}}`) + + startTime, _ := time.Parse("2006-Jan-02", "2024-Mar-27") + sut, err := NewForgeUndoLike(actorIRI, objectIRI, startTime) + if err != nil { + t.Errorf("unexpected error: %v\n", err) + } + if valid, _ := validation.IsValid(sut); !valid { + t.Errorf("sut expected to be valid: %v\n", sut.Validate()) + } + + got, err := sut.MarshalJSON() + if err != nil { + t.Errorf("MarshalJSON() error = \"%v\"", err) + return + } + if !reflect.DeepEqual(got, want) { + t.Errorf("MarshalJSON() got = %q, want %q", got, want) + } +} + +func Test_UndoLikeMarshalJSON(t *testing.T) { + type testPair struct { + item ForgeUndoLike + want []byte + wantErr error + } + + startTime, _ := time.Parse("2006-Jan-02", "2024-Mar-27") + like, _ := NewForgeLike("https://repo.prod.meissa.de/api/v1/activitypub/user-id/1", "https://codeberg.org/api/v1/activitypub/repository-id/1", startTime) + tests := map[string]testPair{ + "empty": { + item: ForgeUndoLike{}, + want: nil, + }, + "valid": { + item: ForgeUndoLike{ + Activity: ap.Activity{ + StartTime: startTime, + Actor: ap.IRI("https://repo.prod.meissa.de/api/v1/activitypub/user-id/1"), + Type: "Undo", + Object: like, + }, + }, + want: []byte(`{"type":"Undo",` + + `"startTime":"2024-03-27T00:00:00Z",` + + `"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",` + + `"object":{` + + `"type":"Like",` + + `"startTime":"2024-03-27T00:00:00Z",` + + `"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",` + + `"object":"https://codeberg.org/api/v1/activitypub/repository-id/1"}}`), + }, + } + + for name, tt := range tests { + t.Run(name, func(t *testing.T) { + got, err := tt.item.MarshalJSON() + if (err != nil || tt.wantErr != nil) && tt.wantErr.Error() != err.Error() { + t.Errorf("MarshalJSON() error = \"%v\", wantErr \"%v\"", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("MarshalJSON() got = %q\nwant %q", got, tt.want) + } + }) + } +} + +func Test_UndoLikeUnmarshalJSON(t *testing.T) { + type testPair struct { + item []byte + want *ForgeUndoLike + wantErr error + } + + startTime, _ := time.Parse("2006-Jan-02", "2024-Mar-27") + like, _ := NewForgeLike("https://repo.prod.meissa.de/api/v1/activitypub/user-id/1", "https://codeberg.org/api/v1/activitypub/repository-id/1", startTime) + + tests := map[string]testPair{ + "valid": { + item: []byte(`{"type":"Undo",` + + `"startTime":"2024-03-27T00:00:00Z",` + + `"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",` + + `"object":{` + + `"type":"Like",` + + `"startTime":"2024-03-27T00:00:00Z",` + + `"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",` + + `"object":"https://codeberg.org/api/v1/activitypub/repository-id/1"}}`), + want: &ForgeUndoLike{ + Activity: ap.Activity{ + StartTime: startTime, + Actor: ap.IRI("https://repo.prod.meissa.de/api/v1/activitypub/user-id/1"), + Type: "Undo", + Object: like, + }, + }, + wantErr: nil, + }, + "invalid": { + item: []byte(`invalid JSON`), + want: nil, + wantErr: fmt.Errorf("cannot parse JSON"), + }, + } + + for name, test := range tests { + t.Run(name, func(t *testing.T) { + got := new(ForgeUndoLike) + err := got.UnmarshalJSON(test.item) + if test.wantErr != nil { + if err == nil { + t.Errorf("UnmarshalJSON() error = nil, wantErr \"%v\"", test.wantErr) + } else if !strings.Contains(err.Error(), test.wantErr.Error()) { + t.Errorf("UnmarshalJSON() error = \"%v\", wantErr \"%v\"", err, test.wantErr) + } + return + } + remarshalledgot, _ := got.MarshalJSON() + remarshalledwant, _ := test.want.MarshalJSON() + if !reflect.DeepEqual(remarshalledgot, remarshalledwant) { + t.Errorf("UnmarshalJSON() got = %#v\nwant %#v", got, test.want) + } + }) + } +} + +func TestActivityValidationUndo(t *testing.T) { + sut := new(ForgeUndoLike) + + _ = sut.UnmarshalJSON([]byte(` + {"type":"Undo", + "startTime":"2024-03-27T00:00:00Z", + "actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1", + "object":{ + "type":"Like", + "actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1", + "object":"https://codeberg.org/api/v1/activitypub/repository-id/1"}}`)) + if res, _ := validation.IsValid(sut); !res { + t.Errorf("sut expected to be valid: %v\n", sut.Validate()) + } + + _ = sut.UnmarshalJSON([]byte(` + {"startTime":"2024-03-27T00:00:00Z", + "actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1", + "object":{ + "type":"Like", + "startTime":"2024-03-27T00:00:00Z", + "actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1", + "object":"https://codeberg.org/api/v1/activitypub/repository-id/1"}}`)) + if err := validateAndCheckError(sut, "type should not be empty"); err != nil { + t.Error(*err) + } + + _ = sut.UnmarshalJSON([]byte(` + {"type":"Undo", + "startTime":"2024-03-27T00:00:00Z", + "object":{ + "type":"Like", + "actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1", + "object":"https://codeberg.org/api/v1/activitypub/repository-id/1"}}`)) + if err := validateAndCheckError(sut, "Actor should not be nil."); err != nil { + t.Error(*err) + } + + _ = sut.UnmarshalJSON([]byte(` + {"type":"Undo", + "startTime":"2024-03-27T00:00:00Z", + "actor":"string", + "object":{ + "type":"Like", + "actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1", + "object":"https://codeberg.org/api/v1/activitypub/repository-id/1"}}`)) + if err := validateAndCheckError(sut, "Actor should not be nil."); err != nil { + t.Error(*err) + } + + _ = sut.UnmarshalJSON([]byte(` + {"type":"Undo", + "startTime":"2024-03-27T00:00:00Z", + "actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1" + }`)) + if err := validateAndCheckError(sut, "object should not be empty."); err != nil { + t.Error(*err) + } + + _ = sut.UnmarshalJSON([]byte(` + {"type":"Undo", + "startTime":"2024-03-27T00:00:00Z", + "actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1", + "object":{ + "startTime":"2024-03-27T00:00:00Z", + "actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1", + "object":"https://codeberg.org/api/v1/activitypub/repository-id/1"}}`)) + if err := validateAndCheckError(sut, "object is not of type Activity"); err != nil { + t.Error(*err) + } + + _ = sut.UnmarshalJSON([]byte(` + {"type":"Undo", + "startTime":"2024-03-27T00:00:00Z", + "actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1", + "object":{ + "type":"Like", + "object":""}}`)) + if err := validateAndCheckError(sut, "Object.Actor should not be nil."); err != nil { + t.Error(*err) + } + + _ = sut.UnmarshalJSON([]byte(` + {"type":"Undo", + "startTime":"2024-03-27T00:00:00Z", + "actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1", + "object":{ + "type":"Like", + "startTime":"2024-03-27T00:00:00Z", + "actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1"}}`)) + if err := validateAndCheckError(sut, "Object.Object should not be nil."); err != nil { + t.Error(*err) + } +} diff --git a/modules/forgefed/activity_validateandcheckerror_test.go b/modules/forgefed/activity_validateandcheckerror_test.go new file mode 100644 index 0000000000..c1c9164fd2 --- /dev/null +++ b/modules/forgefed/activity_validateandcheckerror_test.go @@ -0,0 +1,23 @@ +// Copyright 2023, 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package forgefed + +import ( + "fmt" + + "forgejo.org/modules/validation" +) + +func validateAndCheckError(subject validation.Validateable, expectedError string) *string { + errors := subject.Validate() + err := errors[0] + if len(errors) < 1 { + val := "Validation error should have been returned, but was not." + return &val + } else if err != expectedError { + val := fmt.Sprintf("Validation error should be [%v] but was: %v\n", expectedError, err) + return &val + } + return nil +} diff --git a/modules/forgefed/actor.go b/modules/forgefed/actor.go index 0ef46185d1..c01175f0f6 100644 --- a/modules/forgefed/actor.go +++ b/modules/forgefed/actor.go @@ -8,7 +8,7 @@ import ( "net/url" "strings" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/validation" ap "github.com/go-ap/activitypub" ) diff --git a/modules/forgefed/actor_test.go b/modules/forgefed/actor_test.go index a3c01eceb0..e2157a96e4 100644 --- a/modules/forgefed/actor_test.go +++ b/modules/forgefed/actor_test.go @@ -8,8 +8,8 @@ import ( "strings" "testing" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/setting" + "forgejo.org/modules/validation" ap "github.com/go-ap/activitypub" ) diff --git a/modules/forgefed/repository_test.go b/modules/forgefed/repository_test.go index 13a73c10f4..5aebbbc08f 100644 --- a/modules/forgefed/repository_test.go +++ b/modules/forgefed/repository_test.go @@ -8,7 +8,7 @@ import ( "reflect" "testing" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" ap "github.com/go-ap/activitypub" ) diff --git a/modules/generate/generate.go b/modules/generate/generate.go index 41a6aa2815..9738195da9 100644 --- a/modules/generate/generate.go +++ b/modules/generate/generate.go @@ -11,7 +11,7 @@ import ( "io" "time" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/util" "github.com/golang-jwt/jwt/v5" ) diff --git a/modules/git/batch_reader.go b/modules/git/batch_reader.go index 3b1a466b2e..1297c7247f 100644 --- a/modules/git/batch_reader.go +++ b/modules/git/batch_reader.go @@ -14,7 +14,7 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" "github.com/djherbis/buffer" "github.com/djherbis/nio/v3" diff --git a/modules/git/blame.go b/modules/git/blame.go index 69e1b08f93..4ff347e31b 100644 --- a/modules/git/blame.go +++ b/modules/git/blame.go @@ -11,8 +11,8 @@ import ( "io" "os" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/util" ) // BlamePart represents block of blame - continuous lines with one sha @@ -139,7 +139,7 @@ func CreateBlameReader(ctx context.Context, objectFormat ObjectFormat, repoPath cmd := NewCommandContextNoGlobals(ctx, "blame", "--porcelain") if ignoreRevsFile != nil { // Possible improvement: use --ignore-revs-file /dev/stdin on unix - // There is no equivalent on Windows. May be implemented if Gitea uses an external git backend. + // This was not done in Gitea because it would not have been compatible with Windows. cmd.AddOptionValues("--ignore-revs-file", *ignoreRevsFile) } cmd.AddDynamicArguments(commit.ID.String()). diff --git a/modules/git/blame_sha256_test.go b/modules/git/blame_sha256_test.go index eeeeb9fdb5..c37f40775b 100644 --- a/modules/git/blame_sha256_test.go +++ b/modules/git/blame_sha256_test.go @@ -14,7 +14,7 @@ import ( func TestReadingBlameOutputSha256(t *testing.T) { skipIfSHA256NotSupported(t) - ctx, cancel := context.WithCancel(context.Background()) + ctx, cancel := context.WithCancel(t.Context()) defer cancel() t.Run("Without .git-blame-ignore-revs", func(t *testing.T) { diff --git a/modules/git/blame_test.go b/modules/git/blame_test.go index 65320c78c0..b8fc59dd9e 100644 --- a/modules/git/blame_test.go +++ b/modules/git/blame_test.go @@ -12,7 +12,7 @@ import ( ) func TestReadingBlameOutput(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) + ctx, cancel := context.WithCancel(t.Context()) defer cancel() t.Run("Without .git-blame-ignore-revs", func(t *testing.T) { diff --git a/modules/git/blob.go b/modules/git/blob.go index 2f02693428..8f912189ed 100644 --- a/modules/git/blob.go +++ b/modules/git/blob.go @@ -10,9 +10,9 @@ import ( "encoding/base64" "io" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/typesniffer" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/typesniffer" + "forgejo.org/modules/util" ) // Blob represents a Git object. @@ -126,6 +126,10 @@ func (b *blobReader) Close() error { return nil } +func (b *Blob) Repo() *Repository { + return b.repo +} + // Name returns name of the tree entry this blob object was created from (or empty string) func (b *Blob) Name() string { return b.name diff --git a/modules/git/command.go b/modules/git/command.go index a3d43aaec6..fd29ac36e9 100644 --- a/modules/git/command.go +++ b/modules/git/command.go @@ -12,14 +12,14 @@ import ( "io" "os" "os/exec" - "runtime" + "runtime/trace" "strings" "time" - "code.gitea.io/gitea/modules/git/internal" //nolint:depguard // only this file can use the internal type CmdArg, other files and packages should use AddXxx functions - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/process" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/git/internal" //nolint:depguard // only this file can use the internal type CmdArg, other files and packages should use AddXxx functions + "forgejo.org/modules/log" + "forgejo.org/modules/process" + "forgejo.org/modules/util" ) // TrustedCmdArgs returns the trusted arguments for git command. @@ -317,12 +317,13 @@ func (c *Command) Run(opts *RunOpts) error { var finished context.CancelFunc if opts.UseContextTimeout { - ctx, cancel, finished = process.GetManager().AddContext(c.parentContext, desc) + ctx, cancel, finished = process.GetManager().AddTypedContext(c.parentContext, desc, process.GitProcessType, true) } else { - ctx, cancel, finished = process.GetManager().AddContextTimeout(c.parentContext, timeout, desc) + ctx, cancel, finished = process.GetManager().AddTypedContextTimeout(c.parentContext, timeout, desc, process.GitProcessType, true) } defer finished() + trace.Log(ctx, "command", desc) startTime := time.Now() cmd := exec.CommandContext(ctx, c.prog, c.args...) @@ -357,17 +358,6 @@ func (c *Command) Run(opts *RunOpts) error { log.Debug("slow git.Command.Run: %s (%s)", c, elapsed) } - // We need to check if the context is canceled by the program on Windows. - // This is because Windows does not have signal checking when terminating the process. - // It always returns exit code 1, unlike Linux, which has many exit codes for signals. - if runtime.GOOS == "windows" && - err != nil && - err.Error() == "" && - cmd.ProcessState.ExitCode() == 1 && - ctx.Err() == context.Canceled { - return ctx.Err() - } - if err != nil && ctx.Err() != context.DeadlineExceeded { return err } @@ -457,12 +447,13 @@ func (c *Command) RunStdBytes(opts *RunOpts) (stdout, stderr []byte, runErr RunS } // AllowLFSFiltersArgs return globalCommandArgs with lfs filter, it should only be used for tests +// It also re-enables git-credential(1), which is used to test git-annex's HTTP support func AllowLFSFiltersArgs() TrustedCmdArgs { // Now here we should explicitly allow lfs filters to run filteredLFSGlobalArgs := make(TrustedCmdArgs, len(globalCommandArgs)) j := 0 for _, arg := range globalCommandArgs { - if strings.Contains(string(arg), "lfs") { + if strings.Contains(string(arg), "lfs") || strings.Contains(string(arg), "credential") { j-- } else { filteredLFSGlobalArgs[j] = arg diff --git a/modules/git/command_test.go b/modules/git/command_test.go index d3b8338d02..ace43598fc 100644 --- a/modules/git/command_test.go +++ b/modules/git/command_test.go @@ -4,7 +4,6 @@ package git import ( - "context" "testing" "github.com/stretchr/testify/assert" @@ -12,13 +11,13 @@ import ( ) func TestRunWithContextStd(t *testing.T) { - cmd := NewCommand(context.Background(), "--version") + cmd := NewCommand(t.Context(), "--version") stdout, stderr, err := cmd.RunStdString(&RunOpts{}) require.NoError(t, err) assert.Empty(t, stderr) assert.Contains(t, stdout, "git version") - cmd = NewCommand(context.Background(), "--no-such-arg") + cmd = NewCommand(t.Context(), "--no-such-arg") stdout, stderr, err = cmd.RunStdString(&RunOpts{}) if assert.Error(t, err) { assert.Equal(t, stderr, err.Stderr()) @@ -27,16 +26,16 @@ func TestRunWithContextStd(t *testing.T) { assert.Empty(t, stdout) } - cmd = NewCommand(context.Background()) + cmd = NewCommand(t.Context()) cmd.AddDynamicArguments("-test") require.ErrorIs(t, cmd.Run(&RunOpts{}), ErrBrokenCommand) - cmd = NewCommand(context.Background()) + cmd = NewCommand(t.Context()) cmd.AddDynamicArguments("--test") require.ErrorIs(t, cmd.Run(&RunOpts{}), ErrBrokenCommand) subCmd := "version" - cmd = NewCommand(context.Background()).AddDynamicArguments(subCmd) // for test purpose only, the sub-command should never be dynamic for production + cmd = NewCommand(t.Context()).AddDynamicArguments(subCmd) // for test purpose only, the sub-command should never be dynamic for production stdout, stderr, err = cmd.RunStdString(&RunOpts{}) require.NoError(t, err) assert.Empty(t, stderr) @@ -55,15 +54,15 @@ func TestGitArgument(t *testing.T) { } func TestCommandString(t *testing.T) { - cmd := NewCommandContextNoGlobals(context.Background(), "a", "-m msg", "it's a test", `say "hello"`) + cmd := NewCommandContextNoGlobals(t.Context(), "a", "-m msg", "it's a test", `say "hello"`) assert.EqualValues(t, cmd.prog+` a "-m msg" "it's a test" "say \"hello\""`, cmd.String()) - cmd = NewCommandContextNoGlobals(context.Background(), "url: https://a:b@c/") + cmd = NewCommandContextNoGlobals(t.Context(), "url: https://a:b@c/") assert.EqualValues(t, cmd.prog+` "url: https://sanitized-credential@c/"`, cmd.toString(true)) } func TestGrepOnlyFunction(t *testing.T) { - cmd := NewCommand(context.Background(), "anything-but-grep") + cmd := NewCommand(t.Context(), "anything-but-grep") assert.Panics(t, func() { cmd.AddGitGrepExpression("whatever") }) diff --git a/modules/git/commit.go b/modules/git/commit.go index b5ae2e0e52..baefe3820d 100644 --- a/modules/git/commit.go +++ b/modules/git/commit.go @@ -15,8 +15,10 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/util" + + "github.com/go-git/go-git/v5/config" ) // Commit represents a git commit. @@ -365,53 +367,48 @@ func (c *Commit) GetSubModules() (*ObjectCache, error) { return nil, err } - rd, err := entry.Blob().DataAsync() + content, err := entry.Blob().GetBlobContent(10 * 1024) if err != nil { return nil, err } - defer rd.Close() - scanner := bufio.NewScanner(rd) - c.submoduleCache = newObjectCache() - var ismodule bool - var path string - for scanner.Scan() { - if strings.HasPrefix(scanner.Text(), "[submodule") { - ismodule = true - continue - } - if ismodule { - fields := strings.Split(scanner.Text(), "=") - k := strings.TrimSpace(fields[0]) - if k == "path" { - path = strings.TrimSpace(fields[1]) - } else if k == "url" { - c.submoduleCache.Set(path, &SubModule{path, strings.TrimSpace(fields[1])}) - ismodule = false - } - } + c.submoduleCache, err = parseSubmoduleContent([]byte(content)) + if err != nil { + return nil, err } - if err = scanner.Err(); err != nil { - return nil, fmt.Errorf("GetSubModules scan: %w", err) - } - return c.submoduleCache, nil } -// GetSubModule get the sub module according entryname -func (c *Commit) GetSubModule(entryname string) (*SubModule, error) { +func parseSubmoduleContent(bs []byte) (*ObjectCache, error) { + cfg := config.NewModules() + if err := cfg.Unmarshal(bs); err != nil { + return nil, err + } + submoduleCache := newObjectCache() + if len(cfg.Submodules) == 0 { + return nil, fmt.Errorf("no submodules found") + } + for _, subModule := range cfg.Submodules { + submoduleCache.Set(subModule.Path, subModule.URL) + } + + return submoduleCache, nil +} + +// GetSubModule returns the URL to the submodule according entryname +func (c *Commit) GetSubModule(entryname string) (string, error) { modules, err := c.GetSubModules() if err != nil { - return nil, err + return "", err } if modules != nil { module, has := modules.Get(entryname) if has { - return module.(*SubModule), nil + return module.(string), nil } } - return nil, nil + return "", nil } // GetBranchName gets the closest branch name (as returned by 'git name-rev --name-only') diff --git a/modules/git/commit_info.go b/modules/git/commit_info.go index 3b34b7933a..8d9142d362 100644 --- a/modules/git/commit_info.go +++ b/modules/git/commit_info.go @@ -10,7 +10,7 @@ import ( "path" "sort" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // CommitInfo describes the first commit with the provided entry @@ -72,17 +72,15 @@ func (tes Entries) GetCommitsInfo(ctx context.Context, commit *Commit, treePath // If the entry if a submodule add a submodule file for this if entry.IsSubModule() { - subModuleURL := "" var fullPath string if len(treePath) > 0 { fullPath = treePath + "/" + entry.Name() } else { fullPath = entry.Name() } - if subModule, err := commit.GetSubModule(fullPath); err != nil { + subModuleURL, err := commit.GetSubModule(fullPath) + if err != nil { return nil, nil, err - } else if subModule != nil { - subModuleURL = subModule.URL } subModuleFile := NewSubModuleFile(commitsInfo[i].Commit, subModuleURL, entry.ID.String()) commitsInfo[i].SubModuleFile = subModuleFile diff --git a/modules/git/commit_info_test.go b/modules/git/commit_info_test.go index dbe9ab547d..898ac6b13a 100644 --- a/modules/git/commit_info_test.go +++ b/modules/git/commit_info_test.go @@ -4,7 +4,6 @@ package git import ( - "context" "path/filepath" "testing" "time" @@ -84,7 +83,7 @@ func testGetCommitsInfo(t *testing.T, repo1 *Repository) { } // FIXME: Context.TODO() - if graceful has started we should use its Shutdown context otherwise use install signals in TestMain. - commitsInfo, treeCommit, err := entries.GetCommitsInfo(context.TODO(), commit, testCase.Path) + commitsInfo, treeCommit, err := entries.GetCommitsInfo(t.Context(), commit, testCase.Path) require.NoError(t, err, "Unable to get commit information for entries of subtree: %s in commit: %s from testcase due to error: %v", testCase.Path, testCase.CommitID, err) if err != nil { t.FailNow() @@ -161,7 +160,7 @@ func BenchmarkEntries_GetCommitsInfo(b *testing.B) { b.ResetTimer() b.Run(benchmark.name, func(b *testing.B) { for i := 0; i < b.N; i++ { - _, _, err := entries.GetCommitsInfo(context.Background(), commit, "") + _, _, err := entries.GetCommitsInfo(b.Context(), commit, "") if err != nil { b.Fatal(err) } diff --git a/modules/git/commit_reader.go b/modules/git/commit_reader.go index 8e2523d7fb..ec8989f5a7 100644 --- a/modules/git/commit_reader.go +++ b/modules/git/commit_reader.go @@ -85,6 +85,8 @@ readLoop: _, _ = payloadSB.Write(line) case "encoding": _, _ = payloadSB.Write(line) + case "change-id": // jj-vcs specific header. + _, _ = payloadSB.Write(line) case "gpgsig": fallthrough case "gpgsig-sha256": // FIXME: no intertop, so only 1 exists at present. diff --git a/modules/git/commit_test.go b/modules/git/commit_test.go index af85bfe093..6b3a364d22 100644 --- a/modules/git/commit_test.go +++ b/modules/git/commit_test.go @@ -189,6 +189,55 @@ ISO-8859-1`, commitFromReader.Signature.Payload) assert.EqualValues(t, commitFromReader, commitFromReader2) } +func TestCommitWithChangeIDFromReader(t *testing.T) { + commitString := `e66911914414b0daa85d4a428c8d607b9b249a2c commit 611 +tree efd3cbedfc360ce9f60e5f92d51221be5afb4bf0 +author Nicole Patricia Mazzuca 1746965490 +0200 +committer Nicole Patricia Mazzuca 1746965630 +0200 +change-id psyxzzozmuvvwrwnpqpvmtwntqsnwzpu +gpgsig -----BEGIN PGP SIGNATURE----- +` + " " + ` + iHUEABYKAB0WIQT/T2ISZ7rMF2EbKVdDm0tNAL/2MgUCaCCUfgAKCRBDm0tNAL/2 + Mmu/AQC0OWWHsSlfDKIArdALjDLgd00OQVbP+6iYVE9e+rorFwEA5qYVAXD60EHB + +7UVcfwZ2jKajkk3q01VyT/CDo3LLQE= + =yq2Y + -----END PGP SIGNATURE----- + +views: first commit! + +includes a basic month view, and prints a nice view of an imaginary +January where the year starts on a Monday :)` + + sha := &Sha1Hash{0xe6, 0x69, 0x11, 0x91, 0x44, 0x14, 0xb0, 0xda, 0xa8, 0x5d, 0x4a, 0x42, 0x8c, 0x8d, 0x60, 0x7b, 0x9b, 0x24, 0x9a, 0x2c} + gitRepo, err := openRepositoryWithDefaultContext(filepath.Join(testReposDir, "repo1_bare")) + require.NoError(t, err) + assert.NotNil(t, gitRepo) + defer gitRepo.Close() + + commitFromReader, err := CommitFromReader(gitRepo, sha, strings.NewReader(commitString)) + require.NoError(t, err) + require.NotNil(t, commitFromReader) + assert.EqualValues(t, sha, commitFromReader.ID) + assert.Equal(t, `-----BEGIN PGP SIGNATURE----- + +iHUEABYKAB0WIQT/T2ISZ7rMF2EbKVdDm0tNAL/2MgUCaCCUfgAKCRBDm0tNAL/2 +Mmu/AQC0OWWHsSlfDKIArdALjDLgd00OQVbP+6iYVE9e+rorFwEA5qYVAXD60EHB ++7UVcfwZ2jKajkk3q01VyT/CDo3LLQE= +=yq2Y +-----END PGP SIGNATURE----- +`, commitFromReader.Signature.Signature) + assert.Equal(t, `tree efd3cbedfc360ce9f60e5f92d51221be5afb4bf0 +author Nicole Patricia Mazzuca 1746965490 +0200 +committer Nicole Patricia Mazzuca 1746965630 +0200 +change-id psyxzzozmuvvwrwnpqpvmtwntqsnwzpu + +views: first commit! + +includes a basic month view, and prints a nice view of an imaginary +January where the year starts on a Monday :)`, commitFromReader.Signature.Payload) + assert.Equal(t, "Nicole Patricia Mazzuca ", commitFromReader.Author.String()) +} + func TestHasPreviousCommit(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") @@ -369,3 +418,33 @@ func TestParseCommitRenames(t *testing.T) { assert.Equal(t, testcase.renames, renames) } } + +func Test_parseSubmoduleContent(t *testing.T) { + submoduleFiles := []struct { + fileContent string + expectedPath string + expectedURL string + }{ + { + fileContent: `[submodule "jakarta-servlet"] +url = ../../ALP-pool/jakarta-servlet +path = jakarta-servlet`, + expectedPath: "jakarta-servlet", + expectedURL: "../../ALP-pool/jakarta-servlet", + }, + { + fileContent: `[submodule "jakarta-servlet"] +path = jakarta-servlet +url = ../../ALP-pool/jakarta-servlet`, + expectedPath: "jakarta-servlet", + expectedURL: "../../ALP-pool/jakarta-servlet", + }, + } + for _, kase := range submoduleFiles { + submodule, err := parseSubmoduleContent([]byte(kase.fileContent)) + require.NoError(t, err) + v, ok := submodule.Get(kase.expectedPath) + assert.True(t, ok) + assert.Equal(t, kase.expectedURL, v) + } +} diff --git a/modules/git/diff.go b/modules/git/diff.go index 10ef3d83fb..0ba9c60912 100644 --- a/modules/git/diff.go +++ b/modules/git/diff.go @@ -14,7 +14,7 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // RawDiffType type of a raw diff. @@ -64,7 +64,10 @@ func GetRepoRawDiffForFile(repo *Repository, startCommit, endCommit string, diff } else if commit.ParentCount() == 0 { cmd.AddArguments("show").AddDynamicArguments(endCommit).AddDashesAndList(files...) } else { - c, _ := commit.Parent(0) + c, err := commit.Parent(0) + if err != nil { + return err + } cmd.AddArguments("diff", "-M").AddDynamicArguments(c.ID.String(), endCommit).AddDashesAndList(files...) } case RawDiffPatch: @@ -74,7 +77,10 @@ func GetRepoRawDiffForFile(repo *Repository, startCommit, endCommit string, diff } else if commit.ParentCount() == 0 { cmd.AddArguments("format-patch", "--no-signature", "--stdout", "--root").AddDynamicArguments(endCommit).AddDashesAndList(files...) } else { - c, _ := commit.Parent(0) + c, err := commit.Parent(0) + if err != nil { + return err + } query := fmt.Sprintf("%s...%s", endCommit, c.ID.String()) cmd.AddArguments("format-patch", "--no-signature", "--stdout").AddDynamicArguments(query).AddDashesAndList(files...) } @@ -272,6 +278,17 @@ func CutDiffAroundLine(originalDiff io.Reader, line int64, old bool, numbersOfLi // GetAffectedFiles returns the affected files between two commits func GetAffectedFiles(repo *Repository, oldCommitID, newCommitID string, env []string) ([]string, error) { + objectFormat, err := repo.GetObjectFormat() + if err != nil { + return nil, err + } + + // If the oldCommitID is empty, then we must assume its a new branch, so diff + // against the empty tree. So all changes of this new branch are included. + if oldCommitID == objectFormat.EmptyObjectID().String() { + oldCommitID = objectFormat.EmptyTree().String() + } + stdoutReader, stdoutWriter, err := os.Pipe() if err != nil { log.Error("Unable to create os.Pipe for %s", repo.Path) diff --git a/modules/git/error.go b/modules/git/error.go index 91d25eca69..427eb4a5b9 100644 --- a/modules/git/error.go +++ b/modules/git/error.go @@ -4,28 +4,14 @@ package git import ( + "context" + "errors" "fmt" "strings" - "time" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/util" ) -// ErrExecTimeout error when exec timed out -type ErrExecTimeout struct { - Duration time.Duration -} - -// IsErrExecTimeout if some error is ErrExecTimeout -func IsErrExecTimeout(err error) bool { - _, ok := err.(ErrExecTimeout) - return ok -} - -func (err ErrExecTimeout) Error() string { - return fmt.Sprintf("execution is timeout [duration: %v]", err.Duration) -} - // ErrNotExist commit not exist error type ErrNotExist struct { ID string @@ -62,21 +48,6 @@ func IsErrBadLink(err error) bool { return ok } -// ErrUnsupportedVersion error when required git version not matched -type ErrUnsupportedVersion struct { - Required string -} - -// IsErrUnsupportedVersion if some error is ErrUnsupportedVersion -func IsErrUnsupportedVersion(err error) bool { - _, ok := err.(ErrUnsupportedVersion) - return ok -} - -func (err ErrUnsupportedVersion) Error() string { - return fmt.Sprintf("Operation requires higher version [required: %s]", err.Required) -} - // ErrBranchNotExist represents a "BranchNotExist" kind of error. type ErrBranchNotExist struct { Name string @@ -185,3 +156,10 @@ func IsErrMoreThanOne(err error) bool { func (err *ErrMoreThanOne) Error() string { return fmt.Sprintf("ErrMoreThanOne Error: %v: %s\n%s", err.Err, err.StdErr, err.StdOut) } + +func IsErrCanceledOrKilled(err error) bool { + // When "cancel()" a git command's context, the returned error of "Run()" could be one of them: + // - context.Canceled + // - *exec.ExitError: "signal: killed" + return err != nil && (errors.Is(err, context.Canceled) || err.Error() == "signal: killed") +} diff --git a/modules/git/foreachref/format_test.go b/modules/git/foreachref/format_test.go index 8ff239323c..99b8207168 100644 --- a/modules/git/foreachref/format_test.go +++ b/modules/git/foreachref/format_test.go @@ -6,7 +6,7 @@ package foreachref_test import ( "testing" - "code.gitea.io/gitea/modules/git/foreachref" + "forgejo.org/modules/git/foreachref" "github.com/stretchr/testify/require" ) diff --git a/modules/git/foreachref/parser_test.go b/modules/git/foreachref/parser_test.go index 7a37ced356..1febab80c7 100644 --- a/modules/git/foreachref/parser_test.go +++ b/modules/git/foreachref/parser_test.go @@ -10,8 +10,8 @@ import ( "strings" "testing" - "code.gitea.io/gitea/modules/git/foreachref" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/git/foreachref" + "forgejo.org/modules/json" "github.com/stretchr/testify/require" ) diff --git a/modules/git/git.go b/modules/git/git.go index 851b563e88..c7d5a31b31 100644 --- a/modules/git/git.go +++ b/modules/git/git.go @@ -16,8 +16,8 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" "github.com/hashicorp/go-version" ) @@ -59,15 +59,7 @@ func loadGitVersion() error { return fmt.Errorf("invalid git version output: %s", stdout) } - var versionString string - - // Handle special case on Windows. - i := strings.Index(fields[2], "windows") - if i >= 1 { - versionString = fields[2][:i-1] - } else { - versionString = fields[2] - } + versionString := fields[2] var err error gitVersion, err = version.NewVersion(versionString) @@ -97,12 +89,12 @@ func SetExecutablePath(path string) error { } if gitVersion.LessThan(versionRequired) { - moreHint := "get git: https://git-scm.com/download/" + moreHint := "get git: https://git-scm.com/downloads" if runtime.GOOS == "linux" { // there are a lot of CentOS/RHEL users using old git, so we add a special hint for them if _, err = os.Stat("/etc/redhat-release"); err == nil { // ius.io is the recommended official(git-scm.com) method to install git - moreHint = "get git: https://git-scm.com/download/linux and https://ius.io" + moreHint = "get git: https://git-scm.com/downloads/linux and https://ius.io" } } return fmt.Errorf("installed git version %q is not supported, Gitea requires git version >= %q, %s", gitVersion.Original(), RequiredVersion, moreHint) @@ -280,24 +272,11 @@ func syncGitConfig() (err error) { // Thus the owner uid/gid for files on these filesystems will be marked as root. // As Gitea now always use its internal git config file, and access to the git repositories is managed through Gitea, // it is now safe to set "safe.directory=*" for internal usage only. - // Please note: the wildcard "*" is only supported by Git 2.30.4/2.31.3/2.32.2/2.33.3/2.34.3/2.35.3/2.36 and later - // Although only supported by Git 2.30.4/2.31.3/2.32.2/2.33.3/2.34.3/2.35.3/2.36 and later - this setting is tolerated by earlier versions + // Please note: the wildcard "*" is only supported by Git 2.30.4/2.31.3/2.32.2/2.33.3/2.34.3/2.35.3/2.36 and later, + // but is tolerated by earlier versions if err := configAddNonExist("safe.directory", "*"); err != nil { return err } - if runtime.GOOS == "windows" { - if err := configSet("core.longpaths", "true"); err != nil { - return err - } - if setting.Git.DisableCoreProtectNTFS { - err = configSet("core.protectNTFS", "false") - } else { - err = configUnsetAll("core.protectNTFS", "false") - } - if err != nil { - return err - } - } // By default partial clones are disabled, enable them from git v2.22 if !setting.Git.DisablePartialClone && CheckGitVersionAtLeast("2.22") == nil { diff --git a/modules/git/git_test.go b/modules/git/git_test.go index cdbd2a1768..bb07367e3b 100644 --- a/modules/git/git_test.go +++ b/modules/git/git_test.go @@ -10,8 +10,8 @@ import ( "strings" "testing" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/git/grep.go b/modules/git/grep.go index 5572bd994f..117b09fc83 100644 --- a/modules/git/grep.go +++ b/modules/git/grep.go @@ -17,7 +17,8 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" ) type GrepResult struct { @@ -27,13 +28,23 @@ type GrepResult struct { HighlightedRanges [][3]int } +type GrepMode int + +const ( + FixedGrepMode GrepMode = iota + FixedAnyGrepMode + RegExpGrepMode +) + +var GrepSearchOptions = [3]string{"exact", "union", "regexp"} + type GrepOptions struct { RefName string MaxResultLimit int - MatchesPerFile int + MatchesPerFile int // >= git 2.38 ContextLineNumber int - IsFuzzy bool - PathSpec []setting.Glob + Mode GrepMode + Filename string } func (opts *GrepOptions) ensureDefaults() { @@ -74,12 +85,28 @@ func GrepSearch(ctx context.Context, repo *Repository, search string, opts GrepO var results []*GrepResult // -I skips binary files cmd := NewCommand(ctx, "grep", - "-I", "--null", "--break", "--heading", "--column", - "--fixed-strings", "--line-number", "--ignore-case", "--full-name") + "-I", "--null", "--break", "--heading", + "--line-number", "--ignore-case", "--full-name") + if opts.Mode == RegExpGrepMode { + // No `--column` -- regexp mode does not support highlighting in the + // current implementation as the length of the match is unknown from + // `grep` but required for highlighting. + cmd.AddArguments("--perl-regexp") + } else { + cmd.AddArguments("--fixed-strings", "--column") + } + cmd.AddOptionValues("--context", fmt.Sprint(opts.ContextLineNumber)) - cmd.AddOptionValues("--max-count", fmt.Sprint(opts.MatchesPerFile)) + + // --max-count requires at least git 2.38 + if CheckGitVersionAtLeast("2.38.0") == nil { + cmd.AddOptionValues("--max-count", fmt.Sprint(opts.MatchesPerFile)) + } else { + log.Warn("git-grep: --max-count requires at least git 2.38") + } + words := []string{search} - if opts.IsFuzzy { + if opts.Mode == FixedAnyGrepMode { words = strings.Fields(search) } for _, word := range words { @@ -87,12 +114,38 @@ func GrepSearch(ctx context.Context, repo *Repository, search string, opts GrepO } // pathspec - files := make([]string, 0, - len(setting.Indexer.IncludePatterns)+ - len(setting.Indexer.ExcludePatterns)+ - len(opts.PathSpec)) - for _, expr := range append(setting.Indexer.IncludePatterns, opts.PathSpec...) { - files = append(files, ":"+expr.Pattern()) + includeLen := len(setting.Indexer.IncludePatterns) + if len(opts.Filename) > 0 { + includeLen = 1 + } + files := make([]string, 0, len(setting.Indexer.ExcludePatterns)+includeLen) + if len(opts.Filename) > 0 && len(setting.Indexer.IncludePatterns) > 0 { + // if the both a global include pattern and the per search path is defined + // we only include results where the path matches the globally set pattern + // (eg, global pattern = "src/**" and path = "node_modules/") + + // FIXME: this is a bit too restrictive, and fails to consider cases where the + // globally set include pattern refers to a file than a directory + // (eg, global pattern = "**.go" and path = "modules/git") + exprMatched := false + for _, expr := range setting.Indexer.IncludePatterns { + if expr.Match(opts.Filename) { + files = append(files, ":(literal)"+opts.Filename) + exprMatched = true + break + } + } + if !exprMatched { + log.Warn("git-grep: filepath %s does not match any include pattern", opts.Filename) + } + } else if len(opts.Filename) > 0 { + // if the path is only set we just include results that matches it + files = append(files, ":(literal)"+opts.Filename) + } else { + // otherwise if global include patterns are set include results that strictly match them + for _, expr := range setting.Indexer.IncludePatterns { + files = append(files, ":"+expr.Pattern()) + } } for _, expr := range setting.Indexer.ExcludePatterns { files = append(files, ":^"+expr.Pattern()) @@ -148,6 +201,7 @@ func GrepSearch(ctx context.Context, repo *Repository, search string, opts GrepO if lineNum, lineCode, ok := strings.Cut(line, "\x00"); ok { lineNumInt, _ := strconv.Atoi(lineNum) res.LineNumbers = append(res.LineNumbers, lineNumInt) + // We support highlighting only when `--column` parameter is used. if lineCol, lineCode2, ok := strings.Cut(lineCode, "\x00"); ok { lineColInt, _ := strconv.Atoi(lineCol) start := lineColInt - 1 diff --git a/modules/git/grep_test.go b/modules/git/grep_test.go index 3ba7a6efcb..534468e268 100644 --- a/modules/git/grep_test.go +++ b/modules/git/grep_test.go @@ -5,7 +5,6 @@ package git import ( "bytes" - "context" "os" "path" "path/filepath" @@ -20,7 +19,7 @@ func TestGrepSearch(t *testing.T) { require.NoError(t, err) defer repo.Close() - res, err := GrepSearch(context.Background(), repo, "public", GrepOptions{}) + res, err := GrepSearch(t.Context(), repo, "public", GrepOptions{}) require.NoError(t, err) assert.Equal(t, []*GrepResult{ { @@ -43,7 +42,7 @@ func TestGrepSearch(t *testing.T) { }, }, res) - res, err = GrepSearch(context.Background(), repo, "void", GrepOptions{MaxResultLimit: 1, ContextLineNumber: 2}) + res, err = GrepSearch(t.Context(), repo, "void", GrepOptions{MaxResultLimit: 1, ContextLineNumber: 2}) require.NoError(t, err) assert.Equal(t, []*GrepResult{ { @@ -60,7 +59,7 @@ func TestGrepSearch(t *testing.T) { }, }, res) - res, err = GrepSearch(context.Background(), repo, "world", GrepOptions{MatchesPerFile: 1}) + res, err = GrepSearch(t.Context(), repo, "world", GrepOptions{MatchesPerFile: 1}) require.NoError(t, err) assert.Equal(t, []*GrepResult{ { @@ -89,11 +88,25 @@ func TestGrepSearch(t *testing.T) { }, }, res) - res, err = GrepSearch(context.Background(), repo, "no-such-content", GrepOptions{}) + res, err = GrepSearch(t.Context(), repo, "world", GrepOptions{ + MatchesPerFile: 1, + Filename: "java-hello/", + }) + require.NoError(t, err) + assert.Equal(t, []*GrepResult{ + { + Filename: "java-hello/main.java", + LineNumbers: []int{1}, + LineCodes: []string{"public class HelloWorld"}, + HighlightedRanges: [][3]int{{0, 18, 23}}, + }, + }, res) + + res, err = GrepSearch(t.Context(), repo, "no-such-content", GrepOptions{}) require.NoError(t, err) assert.Empty(t, res) - res, err = GrepSearch(context.Background(), &Repository{Path: "no-such-git-repo"}, "no-such-content", GrepOptions{}) + res, err = GrepSearch(t.Context(), &Repository{Path: "no-such-git-repo"}, "no-such-content", GrepOptions{}) require.Error(t, err) assert.Empty(t, res) } @@ -117,7 +130,7 @@ func TestGrepDashesAreFine(t *testing.T) { err = CommitChanges(tmpDir, CommitChangesOptions{Message: "Dashes are cool sometimes"}) require.NoError(t, err) - res, err := GrepSearch(context.Background(), gitRepo, "--", GrepOptions{}) + res, err := GrepSearch(t.Context(), gitRepo, "--", GrepOptions{}) require.NoError(t, err) assert.Len(t, res, 1) assert.Equal(t, "with-dashes", res[0].Filename) @@ -142,7 +155,7 @@ func TestGrepNoBinary(t *testing.T) { err = CommitChanges(tmpDir, CommitChangesOptions{Message: "Binary and text files"}) require.NoError(t, err) - res, err := GrepSearch(context.Background(), gitRepo, "BINARY", GrepOptions{}) + res, err := GrepSearch(t.Context(), gitRepo, "BINARY", GrepOptions{}) require.NoError(t, err) assert.Len(t, res, 1) assert.Equal(t, "TEXT", res[0].Filename) @@ -166,7 +179,7 @@ func TestGrepLongFiles(t *testing.T) { err = CommitChanges(tmpDir, CommitChangesOptions{Message: "Long file"}) require.NoError(t, err) - res, err := GrepSearch(context.Background(), gitRepo, "a", GrepOptions{}) + res, err := GrepSearch(t.Context(), gitRepo, "a", GrepOptions{}) require.NoError(t, err) assert.Len(t, res, 1) assert.Len(t, res[0].LineCodes[0], 65*1024) @@ -196,8 +209,39 @@ func TestGrepRefs(t *testing.T) { err = CommitChanges(tmpDir, CommitChangesOptions{Message: "add BCD"}) require.NoError(t, err) - res, err := GrepSearch(context.Background(), gitRepo, "a", GrepOptions{RefName: "v1"}) + res, err := GrepSearch(t.Context(), gitRepo, "a", GrepOptions{RefName: "v1"}) require.NoError(t, err) assert.Len(t, res, 1) assert.Equal(t, "A", res[0].LineCodes[0]) } + +func TestGrepCanHazRegexOnDemand(t *testing.T) { + tmpDir := t.TempDir() + + err := InitRepository(DefaultContext, tmpDir, false, Sha1ObjectFormat.Name()) + require.NoError(t, err) + + gitRepo, err := openRepositoryWithDefaultContext(tmpDir) + require.NoError(t, err) + defer gitRepo.Close() + + require.NoError(t, os.WriteFile(path.Join(tmpDir, "matching"), []byte("It's a match!"), 0o666)) + require.NoError(t, os.WriteFile(path.Join(tmpDir, "not-matching"), []byte("Orisitamatch?"), 0o666)) + + err = AddChanges(tmpDir, true) + require.NoError(t, err) + + err = CommitChanges(tmpDir, CommitChangesOptions{Message: "Add fixtures for regexp test"}) + require.NoError(t, err) + + // should find nothing by default... + res, err := GrepSearch(t.Context(), gitRepo, "\\bmatch\\b", GrepOptions{}) + require.NoError(t, err) + assert.Empty(t, res) + + // ... unless configured explicitly + res, err = GrepSearch(t.Context(), gitRepo, "\\bmatch\\b", GrepOptions{Mode: RegExpGrepMode}) + require.NoError(t, err) + assert.Len(t, res, 1) + assert.Equal(t, "matching", res[0].Filename) +} diff --git a/modules/git/hook.go b/modules/git/hook.go index 46f93ce13e..bef4d024c8 100644 --- a/modules/git/hook.go +++ b/modules/git/hook.go @@ -11,8 +11,8 @@ import ( "path/filepath" "strings" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/util" ) // hookNames is a list of Git server hooks' name that are supported. diff --git a/modules/git/last_commit_cache.go b/modules/git/last_commit_cache.go index 8c7ee5a933..1d7e74a0d7 100644 --- a/modules/git/last_commit_cache.go +++ b/modules/git/last_commit_cache.go @@ -8,8 +8,8 @@ import ( "crypto/sha256" "fmt" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" ) // Cache represents a caching interface diff --git a/modules/git/log_name_status.go b/modules/git/log_name_status.go index 1fd58abfcd..e98e8c19a3 100644 --- a/modules/git/log_name_status.go +++ b/modules/git/log_name_status.go @@ -13,7 +13,7 @@ import ( "sort" "strings" - "code.gitea.io/gitea/modules/container" + "forgejo.org/modules/container" "github.com/djherbis/buffer" "github.com/djherbis/nio/v3" diff --git a/modules/git/notes.go b/modules/git/notes.go index ee628c0436..c36ab87fbd 100644 --- a/modules/git/notes.go +++ b/modules/git/notes.go @@ -6,9 +6,10 @@ package git import ( "context" "io" + "os" "strings" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // NotesRef is the git ref where Gitea will look for git-notes data. @@ -97,3 +98,41 @@ func GetNote(ctx context.Context, repo *Repository, commitID string, note *Note) return nil } + +func SetNote(ctx context.Context, repo *Repository, commitID, notes, doerName, doerEmail string) error { + _, err := repo.GetCommit(commitID) + if err != nil { + return err + } + + env := append(os.Environ(), + "GIT_AUTHOR_NAME="+doerName, + "GIT_AUTHOR_EMAIL="+doerEmail, + "GIT_COMMITTER_NAME="+doerName, + "GIT_COMMITTER_EMAIL="+doerEmail, + ) + + cmd := NewCommand(ctx, "notes", "add", "-f", "-m") + cmd.AddDynamicArguments(notes, commitID) + + _, stderr, err := cmd.RunStdString(&RunOpts{Dir: repo.Path, Env: env}) + if err != nil { + log.Error("Error while running git notes add: %s", stderr) + return err + } + + return nil +} + +func RemoveNote(ctx context.Context, repo *Repository, commitID string) error { + cmd := NewCommand(ctx, "notes", "remove") + cmd.AddDynamicArguments(commitID) + + _, stderr, err := cmd.RunStdString(&RunOpts{Dir: repo.Path}) + if err != nil { + log.Error("Error while running git notes remove: %s", stderr) + return err + } + + return nil +} diff --git a/modules/git/notes_test.go b/modules/git/notes_test.go index bbb16ccb14..c7fb433ecf 100644 --- a/modules/git/notes_test.go +++ b/modules/git/notes_test.go @@ -1,25 +1,36 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package git +package git_test import ( - "context" "path/filepath" "testing" + "forgejo.org/models/unittest" + "forgejo.org/modules/git" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) +const ( + testReposDir = "tests/repos/" +) + +// openRepositoryWithDefaultContext opens the repository at the given path with DefaultContext. +func openRepositoryWithDefaultContext(repoPath string) (*git.Repository, error) { + return git.OpenRepository(git.DefaultContext, repoPath) +} + func TestGetNotes(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") bareRepo1, err := openRepositoryWithDefaultContext(bareRepo1Path) require.NoError(t, err) defer bareRepo1.Close() - note := Note{} - err = GetNote(context.Background(), bareRepo1, "95bb4d39648ee7e325106df01a621c530863a653", ¬e) + note := git.Note{} + err = git.GetNote(t.Context(), bareRepo1, "95bb4d39648ee7e325106df01a621c530863a653", ¬e) require.NoError(t, err) assert.Equal(t, []byte("Note contents\n"), note.Message) assert.Equal(t, "Vladimir Panteleev", note.Commit.Author.Name) @@ -31,11 +42,11 @@ func TestGetNestedNotes(t *testing.T) { require.NoError(t, err) defer repo.Close() - note := Note{} - err = GetNote(context.Background(), repo, "3e668dbfac39cbc80a9ff9c61eb565d944453ba4", ¬e) + note := git.Note{} + err = git.GetNote(t.Context(), repo, "3e668dbfac39cbc80a9ff9c61eb565d944453ba4", ¬e) require.NoError(t, err) assert.Equal(t, []byte("Note 2"), note.Message) - err = GetNote(context.Background(), repo, "ba0a96fa63532d6c5087ecef070b0250ed72fa47", ¬e) + err = git.GetNote(t.Context(), repo, "ba0a96fa63532d6c5087ecef070b0250ed72fa47", ¬e) require.NoError(t, err) assert.Equal(t, []byte("Note 1"), note.Message) } @@ -46,8 +57,46 @@ func TestGetNonExistentNotes(t *testing.T) { require.NoError(t, err) defer bareRepo1.Close() - note := Note{} - err = GetNote(context.Background(), bareRepo1, "non_existent_sha", ¬e) + note := git.Note{} + err = git.GetNote(t.Context(), bareRepo1, "non_existent_sha", ¬e) require.Error(t, err) - assert.IsType(t, ErrNotExist{}, err) + assert.IsType(t, git.ErrNotExist{}, err) +} + +func TestSetNote(t *testing.T) { + bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") + + tempDir := t.TempDir() + require.NoError(t, unittest.CopyDir(bareRepo1Path, filepath.Join(tempDir, "repo1"))) + + bareRepo1, err := openRepositoryWithDefaultContext(filepath.Join(tempDir, "repo1")) + require.NoError(t, err) + defer bareRepo1.Close() + + require.NoError(t, git.SetNote(t.Context(), bareRepo1, "95bb4d39648ee7e325106df01a621c530863a653", "This is a new note", "Test", "test@test.com")) + + note := git.Note{} + err = git.GetNote(t.Context(), bareRepo1, "95bb4d39648ee7e325106df01a621c530863a653", ¬e) + require.NoError(t, err) + assert.Equal(t, []byte("This is a new note\n"), note.Message) + assert.Equal(t, "Test", note.Commit.Author.Name) +} + +func TestRemoveNote(t *testing.T) { + bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") + + tempDir := t.TempDir() + + require.NoError(t, unittest.CopyDir(bareRepo1Path, filepath.Join(tempDir, "repo1"))) + + bareRepo1, err := openRepositoryWithDefaultContext(filepath.Join(tempDir, "repo1")) + require.NoError(t, err) + defer bareRepo1.Close() + + require.NoError(t, git.RemoveNote(t.Context(), bareRepo1, "95bb4d39648ee7e325106df01a621c530863a653")) + + note := git.Note{} + err = git.GetNote(t.Context(), bareRepo1, "95bb4d39648ee7e325106df01a621c530863a653", ¬e) + require.Error(t, err) + assert.IsType(t, git.ErrNotExist{}, err) } diff --git a/modules/git/parse.go b/modules/git/parse.go index 8c2c411db6..6bc32057a7 100644 --- a/modules/git/parse.go +++ b/modules/git/parse.go @@ -11,7 +11,7 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // ParseTreeEntries parses the output of a `git ls-tree -l` command. diff --git a/modules/git/pipeline/catfile.go b/modules/git/pipeline/catfile.go index 4677218150..6ada51ae82 100644 --- a/modules/git/pipeline/catfile.go +++ b/modules/git/pipeline/catfile.go @@ -13,8 +13,8 @@ import ( "strings" "sync" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/git" + "forgejo.org/modules/log" ) // CatFileBatchCheck runs cat-file with --batch-check @@ -106,3 +106,36 @@ func BlobsLessThan1024FromCatFileBatchCheck(catFileCheckReader *io.PipeReader, s } } } + +// BlobsLessThanOrEqual32KiBFromCatFileBatchCheck reads a pipeline from cat-file --batch-check and returns the blobs <=32KiB in size +func BlobsLessThanOrEqual32KiBFromCatFileBatchCheck(catFileCheckReader *io.PipeReader, shasToBatchWriter *io.PipeWriter, wg *sync.WaitGroup) { + defer wg.Done() + defer catFileCheckReader.Close() + scanner := bufio.NewScanner(catFileCheckReader) + defer func() { + _ = shasToBatchWriter.CloseWithError(scanner.Err()) + }() + for scanner.Scan() { + line := scanner.Text() + if len(line) == 0 { + continue + } + fields := strings.Split(line, " ") + if len(fields) < 3 || fields[1] != "blob" { + continue + } + size, _ := strconv.Atoi(fields[2]) + if size > 32*1024 { + continue + } + toWrite := []byte(fields[0] + "\n") + for len(toWrite) > 0 { + n, err := shasToBatchWriter.Write(toWrite) + if err != nil { + _ = catFileCheckReader.CloseWithError(err) + break + } + toWrite = toWrite[n:] + } + } +} diff --git a/modules/git/pipeline/lfs.go b/modules/git/pipeline/lfs.go index 3407eb9838..4395e25bd7 100644 --- a/modules/git/pipeline/lfs.go +++ b/modules/git/pipeline/lfs.go @@ -13,7 +13,7 @@ import ( "sync" "time" - "code.gitea.io/gitea/modules/git" + "forgejo.org/modules/git" ) // LFSResult represents commits found using a provided pointer file hash diff --git a/modules/git/pipeline/namerev.go b/modules/git/pipeline/namerev.go index ad583a7479..70840edf19 100644 --- a/modules/git/pipeline/namerev.go +++ b/modules/git/pipeline/namerev.go @@ -11,7 +11,7 @@ import ( "strings" "sync" - "code.gitea.io/gitea/modules/git" + "forgejo.org/modules/git" ) // NameRevStdin runs name-rev --stdin diff --git a/modules/git/pipeline/revlist.go b/modules/git/pipeline/revlist.go index d88ebe78ef..f39b7113bb 100644 --- a/modules/git/pipeline/revlist.go +++ b/modules/git/pipeline/revlist.go @@ -12,8 +12,8 @@ import ( "strings" "sync" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/git" + "forgejo.org/modules/log" ) // RevListAllObjects runs rev-list --objects --all and writes to a pipewriter diff --git a/modules/git/ref.go b/modules/git/ref.go index 2db630e2ea..1475d4dc5a 100644 --- a/modules/git/ref.go +++ b/modules/git/ref.go @@ -7,7 +7,7 @@ import ( "regexp" "strings" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/util" ) const ( diff --git a/modules/git/ref_test.go b/modules/git/ref_test.go index 58f679b7d6..1fd33b5163 100644 --- a/modules/git/ref_test.go +++ b/modules/git/ref_test.go @@ -20,6 +20,8 @@ func TestRefName(t *testing.T) { // Test pull names assert.Equal(t, "1", RefName("refs/pull/1/head").PullName()) + assert.True(t, RefName("refs/pull/1/head").IsPull()) + assert.True(t, RefName("refs/pull/1/merge").IsPull()) assert.Equal(t, "my/pull", RefName("refs/pull/my/pull/head").PullName()) // Test for branch names diff --git a/modules/git/remote.go b/modules/git/remote.go index 3585313f6a..fb66d76ff0 100644 --- a/modules/git/remote.go +++ b/modules/git/remote.go @@ -5,8 +5,9 @@ package git import ( "context" + "strings" - giturl "code.gitea.io/gitea/modules/git/url" + giturl "forgejo.org/modules/git/url" ) // GetRemoteAddress returns remote url of git repository in the repoPath with special remote name @@ -37,3 +38,12 @@ func GetRemoteURL(ctx context.Context, repoPath, remoteName string) (*giturl.Git } return giturl.Parse(addr) } + +// IsRemoteNotExistError checks the prefix of the error message to see whether a remote does not exist. +func IsRemoteNotExistError(err error) bool { + // see: https://github.com/go-gitea/gitea/issues/32889#issuecomment-2571848216 + // Should not add space in the end, sometimes git will add a `:` + prefix1 := "exit status 128 - fatal: No such remote" // git < 2.30 + prefix2 := "exit status 2 - error: No such remote" // git >= 2.30 + return strings.HasPrefix(err.Error(), prefix1) || strings.HasPrefix(err.Error(), prefix2) +} diff --git a/modules/git/repo.go b/modules/git/repo.go index 84db08d70c..0f4d1f5afa 100644 --- a/modules/git/repo.go +++ b/modules/git/repo.go @@ -18,9 +18,9 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/proxy" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/proxy" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" ) // GPGSettings represents the default GPG settings for this repository diff --git a/modules/git/repo_attribute.go b/modules/git/repo_attribute.go index 3ccc1b84a6..2154467332 100644 --- a/modules/git/repo_attribute.go +++ b/modules/git/repo_attribute.go @@ -13,7 +13,7 @@ import ( "strings" "sync/atomic" - "code.gitea.io/gitea/modules/optional" + "forgejo.org/modules/optional" ) var LinguistAttributes = []string{"linguist-vendored", "linguist-generated", "linguist-language", "gitlab-language", "linguist-documentation", "linguist-detectable"} @@ -250,7 +250,7 @@ func (repo *Repository) GitAttributeChecker(treeish string, attributes ...string err = e } - if err != nil { // decorate the returned error + if err != nil && !IsErrCanceledOrKilled(err) { // decorate the returned error err = fmt.Errorf("git check-attr (stderr: %q): %w", strings.TrimSpace(stdErr.String()), err) ac.err.Store(err) } diff --git a/modules/git/repo_attribute_test.go b/modules/git/repo_attribute_test.go index fa34164816..ee89373b90 100644 --- a/modules/git/repo_attribute_test.go +++ b/modules/git/repo_attribute_test.go @@ -15,7 +15,7 @@ import ( "testing" "time" - "code.gitea.io/gitea/modules/test" + "forgejo.org/modules/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -254,7 +254,7 @@ func TestGitAttributeCheckerError(t *testing.T) { require.NoError(t, err) _, err = ac.CheckPath("i-am-a-python.p") - require.ErrorIs(t, err, context.Canceled) + require.Error(t, err) }) t.Run("Cancelled/DuringRun", func(t *testing.T) { diff --git a/modules/git/repo_base.go b/modules/git/repo_base.go index 5f17bc14f6..a82d59af3c 100644 --- a/modules/git/repo_base.go +++ b/modules/git/repo_base.go @@ -10,7 +10,7 @@ import ( "errors" "path/filepath" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // Repository represents a Git repository. diff --git a/modules/git/repo_base_test.go b/modules/git/repo_base_test.go index 323b28f476..c9ac6a8559 100644 --- a/modules/git/repo_base_test.go +++ b/modules/git/repo_base_test.go @@ -14,7 +14,7 @@ import ( // This unit test relies on the implementation detail of CatFileBatch. func TestCatFileBatch(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) + ctx, cancel := context.WithCancel(t.Context()) defer cancel() repo, err := OpenRepository(ctx, "./tests/repos/repo1_bare") @@ -89,7 +89,7 @@ func TestCatFileBatch(t *testing.T) { // This unit test relies on the implementation detail of CatFileBatchCheck. func TestCatFileBatchCheck(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) + ctx, cancel := context.WithCancel(t.Context()) defer cancel() repo, err := OpenRepository(ctx, "./tests/repos/repo1_bare") diff --git a/modules/git/repo_branch.go b/modules/git/repo_branch.go index 7339c7db0d..1992060351 100644 --- a/modules/git/repo_branch.go +++ b/modules/git/repo_branch.go @@ -13,7 +13,7 @@ import ( "io" "strings" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // BranchPrefix base dir of the branch information file store on git diff --git a/modules/git/repo_commit.go b/modules/git/repo_commit.go index 1f3d64fe03..65ab6fd3fd 100644 --- a/modules/git/repo_commit.go +++ b/modules/git/repo_commit.go @@ -12,9 +12,9 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/modules/cache" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/cache" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" ) // GetBranchCommitID returns last commit ID string of given branch. @@ -22,7 +22,9 @@ func (repo *Repository) GetBranchCommitID(name string) (string, error) { return repo.GetRefCommitID(BranchPrefix + name) } -// GetTagCommitID returns last commit ID string of given tag. +// GetTagCommitID returns last commit ID string of given tag. If the tag is an +// annotated tag it will return the objectID of that tag instead of the commitID +// the tag is pointing to. `GetTagCommit` handles annotated tags correctly. func (repo *Repository) GetTagCommitID(name string) (string, error) { return repo.GetRefCommitID(TagPrefix + name) } @@ -228,7 +230,7 @@ func (repo *Repository) CommitsByFileAndRange(opts CommitsByFileAndRangeOptions) go func() { stderr := strings.Builder{} gitCmd := NewCommand(repo.Ctx, "rev-list"). - AddOptionFormat("--max-count=%d", setting.Git.CommitsRangeSize*opts.Page). + AddOptionFormat("--max-count=%d", setting.Git.CommitsRangeSize). AddOptionFormat("--skip=%d", skip) gitCmd.AddDynamicArguments(opts.Revision) diff --git a/modules/git/repo_commit_test.go b/modules/git/repo_commit_test.go index e2a9f97fae..9cbc40eee7 100644 --- a/modules/git/repo_commit_test.go +++ b/modules/git/repo_commit_test.go @@ -7,6 +7,9 @@ import ( "path/filepath" "testing" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -101,3 +104,98 @@ func TestRepository_CommitsBetweenIDs(t *testing.T) { assert.Len(t, commits, c.ExpectedCommits, "case %d", i) } } + +func TestGetTagCommit(t *testing.T) { + t.Setenv("GIT_COMMITTER_DATE", "2006-01-01 13:37") + bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") + + clonedPath, err := cloneRepo(t, bareRepo1Path) + require.NoError(t, err) + + bareRepo1, err := openRepositoryWithDefaultContext(clonedPath) + require.NoError(t, err) + defer bareRepo1.Close() + + lTagCommitID := "6fbd69e9823458e6c4a2fc5c0f6bc022b2f2acd1" + lTagName := "lightweightTag" + bareRepo1.CreateTag(lTagName, lTagCommitID) + + aTagCommitID := "8006ff9adbf0cb94da7dad9e537e53817f9fa5c0" + aTagName := "annotatedTag" + aTagMessage := "my annotated message" + bareRepo1.CreateAnnotatedTag(aTagName, aTagMessage, aTagCommitID) + + aTagID, err := bareRepo1.GetTagCommitID(aTagName) + require.NoError(t, err) + assert.NotEqualValues(t, aTagCommitID, aTagID) + + lTagID, err := bareRepo1.GetTagCommitID(lTagName) + require.NoError(t, err) + assert.EqualValues(t, lTagCommitID, lTagID) + + aTag, err := bareRepo1.GetTagCommit(aTagName) + require.NoError(t, err) + assert.EqualValues(t, aTagCommitID, aTag.ID.String()) + + lTag, err := bareRepo1.GetTagCommit(lTagName) + require.NoError(t, err) + assert.EqualValues(t, lTagCommitID, lTag.ID.String()) +} + +func TestCommitsByRange(t *testing.T) { + bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") + bareRepo1, err := openRepositoryWithDefaultContext(bareRepo1Path) + require.NoError(t, err) + defer bareRepo1.Close() + + baseCommit, err := bareRepo1.GetBranchCommit("master") + require.NoError(t, err) + + testCases := []struct { + Page int + ExpectedCommitCount int + }{ + {1, 3}, + {2, 3}, + {3, 1}, + {4, 0}, + } + for _, testCase := range testCases { + commits, err := baseCommit.CommitsByRange(testCase.Page, 3, "") + require.NoError(t, err) + assert.Len(t, commits, testCase.ExpectedCommitCount, "page: %d", testCase.Page) + } +} + +func TestCommitsByFileAndRange(t *testing.T) { + bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") + bareRepo1, err := openRepositoryWithDefaultContext(bareRepo1Path) + require.NoError(t, err) + defer bareRepo1.Close() + defer test.MockVariableValue(&setting.Git.CommitsRangeSize, 2)() + + testCases := []struct { + File string + Page int + ExpectedCommitCount int + }{ + {"file1.txt", 1, 1}, + {"file2.txt", 1, 1}, + {"file*.txt", 1, 2}, + {"foo", 1, 2}, + {"foo", 2, 1}, + {"foo", 3, 0}, + {"f*", 1, 2}, + {"f*", 2, 2}, + {"f*", 3, 1}, + } + for _, testCase := range testCases { + commits, err := bareRepo1.CommitsByFileAndRange(CommitsByFileAndRangeOptions{ + Revision: "master", + File: testCase.File, + Page: testCase.Page, + }) + require.NoError(t, err) + assert.Len(t, commits, testCase.ExpectedCommitCount, "file: '%s', page: %d", testCase.File, testCase.Page) + } +} diff --git a/modules/git/repo_compare.go b/modules/git/repo_compare.go index b6e9d2b44a..373b5befb5 100644 --- a/modules/git/repo_compare.go +++ b/modules/git/repo_compare.go @@ -18,7 +18,7 @@ import ( "strings" "time" - logger "code.gitea.io/gitea/modules/log" + logger "forgejo.org/modules/log" ) // CompareInfo represents needed information for comparing references. diff --git a/modules/git/repo_gpg.go b/modules/git/repo_gpg.go index e2b45064fd..2c94234017 100644 --- a/modules/git/repo_gpg.go +++ b/modules/git/repo_gpg.go @@ -8,7 +8,7 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/modules/process" + "forgejo.org/modules/process" ) // LoadPublicKeyContent will load the key from gpg diff --git a/modules/git/repo_index.go b/modules/git/repo_index.go index 8390570098..f58757a9a2 100644 --- a/modules/git/repo_index.go +++ b/modules/git/repo_index.go @@ -10,8 +10,8 @@ import ( "path/filepath" "strings" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/util" ) // ReadTreeToIndex reads a treeish to the index @@ -50,25 +50,35 @@ func (repo *Repository) readTreeToIndex(id ObjectID, indexFilename ...string) er } // ReadTreeToTemporaryIndex reads a treeish to a temporary index file -func (repo *Repository) ReadTreeToTemporaryIndex(treeish string) (filename, tmpDir string, cancel context.CancelFunc, err error) { - tmpDir, err = os.MkdirTemp("", "index") - if err != nil { - return filename, tmpDir, cancel, err - } +func (repo *Repository) ReadTreeToTemporaryIndex(treeish string) (tmpIndexFilename, tmpDir string, cancel context.CancelFunc, err error) { + defer func() { + // if error happens and there is a cancel function, do clean up + if err != nil && cancel != nil { + cancel() + cancel = nil + } + }() - filename = filepath.Join(tmpDir, ".tmp-index") - cancel = func() { - err := util.RemoveAll(tmpDir) - if err != nil { - log.Error("failed to remove tmp index file: %v", err) + removeDirFn := func(dir string) func() { // it can't use the return value "tmpDir" directly because it is empty when error occurs + return func() { + if err := util.RemoveAll(dir); err != nil { + log.Error("failed to remove tmp index dir: %v", err) + } } } - err = repo.ReadTreeToIndex(treeish, filename) + + tmpDir, err = os.MkdirTemp("", "index") if err != nil { - defer cancel() - return "", "", func() {}, err + return "", "", nil, err } - return filename, tmpDir, cancel, err + + tmpIndexFilename = filepath.Join(tmpDir, ".tmp-index") + cancel = removeDirFn(tmpDir) + err = repo.ReadTreeToIndex(treeish, tmpIndexFilename) + if err != nil { + return "", "", cancel, err + } + return tmpIndexFilename, tmpDir, cancel, err } // EmptyIndex empties the index diff --git a/modules/git/repo_language_stats.go b/modules/git/repo_language_stats.go index 37c23faf68..7b76c7bcc7 100644 --- a/modules/git/repo_language_stats.go +++ b/modules/git/repo_language_stats.go @@ -10,9 +10,9 @@ import ( "strings" "unicode" - "code.gitea.io/gitea/modules/analyze" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/optional" + "forgejo.org/modules/analyze" + "forgejo.org/modules/log" + "forgejo.org/modules/optional" "github.com/go-enry/go-enry/v2" ) @@ -204,7 +204,13 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err return nil, err } } - if !isTrue(isGenerated) && enry.IsGenerated(f.Name(), content) { + + // We consider three cases: + // 1. linguist-generated=true, then we ignore the file. + // 2. linguist-generated=false, we don't ignore the file. + // 3. linguist-generated is not set, then `enry.IsGenerated` determines if the file is generated. + if isTrue(isGenerated) || !isFalse(isGenerated) && enry.IsGenerated(f.Name(), content) { + log.Trace("Ignore %q for language stats, because it is generated", f.Name()) continue } diff --git a/modules/git/repo_language_stats_test.go b/modules/git/repo_language_stats_test.go index fd80e44a86..ccd7301f81 100644 --- a/modules/git/repo_language_stats_test.go +++ b/modules/git/repo_language_stats_test.go @@ -25,6 +25,15 @@ func TestRepository_GetLanguageStats(t *testing.T) { "Python": 134, "Java": 112, }, stats) + + stats, err = gitRepo.GetLanguageStats("95d3505f2db273e40be79f84416051ae85e9ea0d") + require.NoError(t, err) + + assert.Equal(t, map[string]int64{ + "Cobra": 67, + "Python": 67, + "Java": 112, + }, stats) } func TestMergeLanguageStats(t *testing.T) { diff --git a/modules/git/repo_ref.go b/modules/git/repo_ref.go index 550c653729..3c8b863f75 100644 --- a/modules/git/repo_ref.go +++ b/modules/git/repo_ref.go @@ -10,7 +10,7 @@ import ( "io" "strings" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/util" ) // GetRefs returns all references of the repository. diff --git a/modules/git/repo_stats.go b/modules/git/repo_stats.go index 83220104bd..ef0865e3d3 100644 --- a/modules/git/repo_stats.go +++ b/modules/git/repo_stats.go @@ -13,7 +13,7 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/container" + "forgejo.org/modules/container" ) // CodeActivityStats represents git statistics data diff --git a/modules/git/repo_tag.go b/modules/git/repo_tag.go index 12b0c022cb..f7f04e1f10 100644 --- a/modules/git/repo_tag.go +++ b/modules/git/repo_tag.go @@ -5,25 +5,20 @@ package git import ( - "context" "errors" "fmt" "io" + "slices" "strings" - "code.gitea.io/gitea/modules/git/foreachref" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/git/foreachref" + "forgejo.org/modules/log" + "forgejo.org/modules/util" ) // TagPrefix tags prefix path on the repository const TagPrefix = "refs/tags/" -// IsTagExist returns true if given tag exists in the repository. -func IsTagExist(ctx context.Context, repoPath, name string) bool { - return IsReferenceExist(ctx, repoPath, TagPrefix+name) -} - // CreateTag create one tag in the repository func (repo *Repository) CreateTag(name, revision string) error { _, _, err := NewCommand(repo.Ctx, "tag").AddDashesAndList(name, revision).RunStdString(&RunOpts{Dir: repo.Path}) @@ -153,7 +148,9 @@ func (repo *Repository) GetTagInfos(page, pageSize int) ([]*Tag, int, error) { return nil, 0, fmt.Errorf("GetTagInfos: parse output: %w", err) } - sortTagsByTime(tags) + slices.SortFunc(tags, func(b, a *Tag) int { + return a.Tagger.When.Compare(b.Tagger.When) + }) tagsTotal := len(tags) if page != 0 { tags = util.PaginateSlice(tags, page, pageSize).([]*Tag) diff --git a/modules/git/repo_tag_test.go b/modules/git/repo_tag_test.go index 1cf420ad63..a4b13bf03d 100644 --- a/modules/git/repo_tag_test.go +++ b/modules/git/repo_tag_test.go @@ -6,6 +6,7 @@ package git import ( "path/filepath" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -30,9 +31,11 @@ func TestRepository_GetTags(t *testing.T) { assert.EqualValues(t, "signed-tag", tags[0].Name) assert.EqualValues(t, "36f97d9a96457e2bab511db30fe2db03893ebc64", tags[0].ID.String()) assert.EqualValues(t, "tag", tags[0].Type) + assert.EqualValues(t, time.Date(2022, time.November, 13, 16, 40, 20, 0, time.FixedZone("", 3600)), tags[0].Tagger.When) assert.EqualValues(t, "test", tags[1].Name) assert.EqualValues(t, "3ad28a9149a2864384548f3d17ed7f38014c9e8a", tags[1].ID.String()) assert.EqualValues(t, "tag", tags[1].Type) + assert.EqualValues(t, time.Date(2018, time.June, 16, 20, 13, 18, 0, time.FixedZone("", -25200)), tags[1].Tagger.When) } func TestRepository_GetTag(t *testing.T) { diff --git a/modules/git/repo_test.go b/modules/git/repo_test.go index 8fb19a5043..c4ef9dbe96 100644 --- a/modules/git/repo_test.go +++ b/modules/git/repo_test.go @@ -4,7 +4,6 @@ package git import ( - "context" "path/filepath" "testing" @@ -34,21 +33,21 @@ func TestRepoIsEmpty(t *testing.T) { func TestRepoGetDivergingCommits(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - do, err := GetDivergingCommits(context.Background(), bareRepo1Path, "master", "branch2") + do, err := GetDivergingCommits(t.Context(), bareRepo1Path, "master", "branch2") require.NoError(t, err) assert.Equal(t, DivergeObject{ Ahead: 1, Behind: 5, }, do) - do, err = GetDivergingCommits(context.Background(), bareRepo1Path, "master", "master") + do, err = GetDivergingCommits(t.Context(), bareRepo1Path, "master", "master") require.NoError(t, err) assert.Equal(t, DivergeObject{ Ahead: 0, Behind: 0, }, do) - do, err = GetDivergingCommits(context.Background(), bareRepo1Path, "master", "test") + do, err = GetDivergingCommits(t.Context(), bareRepo1Path, "master", "test") require.NoError(t, err) assert.Equal(t, DivergeObject{ Ahead: 0, diff --git a/modules/git/signature.go b/modules/git/signature.go index c368ce345c..bd9aebbdd6 100644 --- a/modules/git/signature.go +++ b/modules/git/signature.go @@ -10,8 +10,8 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/util" ) // Signature represents the Author, Committer or Tagger information. diff --git a/modules/git/tag.go b/modules/git/tag.go index 04f50e8db8..64f1b952ad 100644 --- a/modules/git/tag.go +++ b/modules/git/tag.go @@ -5,11 +5,10 @@ package git import ( "bytes" - "sort" "strings" - api "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/util" + api "forgejo.org/modules/structs" + "forgejo.org/modules/util" ) const ( @@ -107,23 +106,3 @@ l: return tag, nil } - -type tagSorter []*Tag - -func (ts tagSorter) Len() int { - return len([]*Tag(ts)) -} - -func (ts tagSorter) Less(i, j int) bool { - return []*Tag(ts)[i].Tagger.When.After([]*Tag(ts)[j].Tagger.When) -} - -func (ts tagSorter) Swap(i, j int) { - []*Tag(ts)[i], []*Tag(ts)[j] = []*Tag(ts)[j], []*Tag(ts)[i] -} - -// sortTagsByTime -func sortTagsByTime(tags []*Tag) { - sorter := tagSorter(tags) - sort.Sort(sorter) -} diff --git a/modules/git/tests/repos/language_stats_repo/index b/modules/git/tests/repos/language_stats_repo/index deleted file mode 100644 index e6c0223171..0000000000 Binary files a/modules/git/tests/repos/language_stats_repo/index and /dev/null differ diff --git a/modules/git/tests/repos/language_stats_repo/logs/HEAD b/modules/git/tests/repos/language_stats_repo/logs/HEAD deleted file mode 100644 index 9cedbb66a9..0000000000 --- a/modules/git/tests/repos/language_stats_repo/logs/HEAD +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 8fee858da5796dfb37704761701bb8e800ad9ef3 Andrew Thornton 1632140318 +0100 commit (initial): Add some test files for GetLanguageStats -8fee858da5796dfb37704761701bb8e800ad9ef3 341fca5b5ea3de596dc483e54c2db28633cd2f97 oliverpool 1711278775 +0100 push diff --git a/modules/git/tests/repos/language_stats_repo/logs/refs/heads/master b/modules/git/tests/repos/language_stats_repo/logs/refs/heads/master deleted file mode 100644 index 9cedbb66a9..0000000000 --- a/modules/git/tests/repos/language_stats_repo/logs/refs/heads/master +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 8fee858da5796dfb37704761701bb8e800ad9ef3 Andrew Thornton 1632140318 +0100 commit (initial): Add some test files for GetLanguageStats -8fee858da5796dfb37704761701bb8e800ad9ef3 341fca5b5ea3de596dc483e54c2db28633cd2f97 oliverpool 1711278775 +0100 push diff --git a/modules/git/tests/repos/language_stats_repo/objects/1e/ea60592b55dcb45c36029cc1202132e9fb756c b/modules/git/tests/repos/language_stats_repo/objects/1e/ea60592b55dcb45c36029cc1202132e9fb756c deleted file mode 100644 index 3c55bab91e..0000000000 Binary files a/modules/git/tests/repos/language_stats_repo/objects/1e/ea60592b55dcb45c36029cc1202132e9fb756c and /dev/null differ diff --git a/modules/git/tests/repos/language_stats_repo/objects/22/b6aa0588563508d8879f062470c8cbc7b2f2bb b/modules/git/tests/repos/language_stats_repo/objects/22/b6aa0588563508d8879f062470c8cbc7b2f2bb deleted file mode 100644 index 947feecea9..0000000000 Binary files a/modules/git/tests/repos/language_stats_repo/objects/22/b6aa0588563508d8879f062470c8cbc7b2f2bb and /dev/null differ diff --git a/modules/git/tests/repos/language_stats_repo/objects/34/1fca5b5ea3de596dc483e54c2db28633cd2f97 b/modules/git/tests/repos/language_stats_repo/objects/34/1fca5b5ea3de596dc483e54c2db28633cd2f97 deleted file mode 100644 index 9ce337e070..0000000000 Binary files a/modules/git/tests/repos/language_stats_repo/objects/34/1fca5b5ea3de596dc483e54c2db28633cd2f97 and /dev/null differ diff --git a/modules/git/tests/repos/language_stats_repo/objects/42/25ecfaf6bafbcfa31ea5cbd8121c36d9457085 b/modules/git/tests/repos/language_stats_repo/objects/42/25ecfaf6bafbcfa31ea5cbd8121c36d9457085 deleted file mode 100644 index ff3b642734..0000000000 Binary files a/modules/git/tests/repos/language_stats_repo/objects/42/25ecfaf6bafbcfa31ea5cbd8121c36d9457085 and /dev/null differ diff --git a/modules/git/tests/repos/language_stats_repo/objects/4a/c803638e4b8995146e329a05e096fa2c77a03d b/modules/git/tests/repos/language_stats_repo/objects/4a/c803638e4b8995146e329a05e096fa2c77a03d deleted file mode 100644 index b71abc120c..0000000000 Binary files a/modules/git/tests/repos/language_stats_repo/objects/4a/c803638e4b8995146e329a05e096fa2c77a03d and /dev/null differ diff --git a/modules/git/tests/repos/language_stats_repo/objects/64/4c37ad7fe64ac012df7e59d27a92e3137c640e b/modules/git/tests/repos/language_stats_repo/objects/64/4c37ad7fe64ac012df7e59d27a92e3137c640e deleted file mode 100644 index 5c2485d82f..0000000000 Binary files a/modules/git/tests/repos/language_stats_repo/objects/64/4c37ad7fe64ac012df7e59d27a92e3137c640e and /dev/null differ diff --git a/modules/git/tests/repos/language_stats_repo/objects/6c/633a0067b463e459ae952716b17ae36aa30adc b/modules/git/tests/repos/language_stats_repo/objects/6c/633a0067b463e459ae952716b17ae36aa30adc deleted file mode 100644 index 873cb7187d..0000000000 Binary files a/modules/git/tests/repos/language_stats_repo/objects/6c/633a0067b463e459ae952716b17ae36aa30adc and /dev/null differ diff --git a/modules/git/tests/repos/language_stats_repo/objects/8e/b563dc106e3dfd3ad0fa81f7a0c5e2604f80cd b/modules/git/tests/repos/language_stats_repo/objects/8e/b563dc106e3dfd3ad0fa81f7a0c5e2604f80cd deleted file mode 100644 index f89ecb7d60..0000000000 Binary files a/modules/git/tests/repos/language_stats_repo/objects/8e/b563dc106e3dfd3ad0fa81f7a0c5e2604f80cd and /dev/null differ diff --git a/modules/git/tests/repos/language_stats_repo/objects/8f/ee858da5796dfb37704761701bb8e800ad9ef3 b/modules/git/tests/repos/language_stats_repo/objects/8f/ee858da5796dfb37704761701bb8e800ad9ef3 deleted file mode 100644 index 0219c2d565..0000000000 Binary files a/modules/git/tests/repos/language_stats_repo/objects/8f/ee858da5796dfb37704761701bb8e800ad9ef3 and /dev/null differ diff --git a/modules/git/tests/repos/language_stats_repo/objects/aa/a21bf84c8b2304608d3fc83b747840f2456299 b/modules/git/tests/repos/language_stats_repo/objects/aa/a21bf84c8b2304608d3fc83b747840f2456299 deleted file mode 100644 index adc50f2bce..0000000000 Binary files a/modules/git/tests/repos/language_stats_repo/objects/aa/a21bf84c8b2304608d3fc83b747840f2456299 and /dev/null differ diff --git a/modules/git/tests/repos/language_stats_repo/objects/da/a5abe3c5f42cae598e362e8a8db6284565d6bb b/modules/git/tests/repos/language_stats_repo/objects/da/a5abe3c5f42cae598e362e8a8db6284565d6bb deleted file mode 100644 index 9d4d4b1a04..0000000000 Binary files a/modules/git/tests/repos/language_stats_repo/objects/da/a5abe3c5f42cae598e362e8a8db6284565d6bb and /dev/null differ diff --git a/modules/git/tests/repos/language_stats_repo/objects/pack/pack-371b1f6c24df14da4898b22c00ff8fb55303ac76.idx b/modules/git/tests/repos/language_stats_repo/objects/pack/pack-371b1f6c24df14da4898b22c00ff8fb55303ac76.idx new file mode 100644 index 0000000000..186136cb12 Binary files /dev/null and b/modules/git/tests/repos/language_stats_repo/objects/pack/pack-371b1f6c24df14da4898b22c00ff8fb55303ac76.idx differ diff --git a/modules/git/tests/repos/language_stats_repo/objects/pack/pack-371b1f6c24df14da4898b22c00ff8fb55303ac76.pack b/modules/git/tests/repos/language_stats_repo/objects/pack/pack-371b1f6c24df14da4898b22c00ff8fb55303ac76.pack new file mode 100644 index 0000000000..046061c688 Binary files /dev/null and b/modules/git/tests/repos/language_stats_repo/objects/pack/pack-371b1f6c24df14da4898b22c00ff8fb55303ac76.pack differ diff --git a/modules/git/tests/repos/language_stats_repo/objects/pack/pack-371b1f6c24df14da4898b22c00ff8fb55303ac76.rev b/modules/git/tests/repos/language_stats_repo/objects/pack/pack-371b1f6c24df14da4898b22c00ff8fb55303ac76.rev new file mode 100644 index 0000000000..7d8c6f3562 Binary files /dev/null and b/modules/git/tests/repos/language_stats_repo/objects/pack/pack-371b1f6c24df14da4898b22c00ff8fb55303ac76.rev differ diff --git a/modules/git/tests/repos/language_stats_repo/packed-refs b/modules/git/tests/repos/language_stats_repo/packed-refs new file mode 100644 index 0000000000..63e01583a4 --- /dev/null +++ b/modules/git/tests/repos/language_stats_repo/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +95d3505f2db273e40be79f84416051ae85e9ea0d refs/heads/master diff --git a/modules/git/tests/repos/language_stats_repo/refs/heads/.gitkeep b/modules/git/tests/repos/language_stats_repo/refs/heads/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/modules/git/tests/repos/language_stats_repo/refs/heads/master b/modules/git/tests/repos/language_stats_repo/refs/heads/master deleted file mode 100644 index e89143e56b..0000000000 --- a/modules/git/tests/repos/language_stats_repo/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -341fca5b5ea3de596dc483e54c2db28633cd2f97 diff --git a/modules/git/tests/repos/language_stats_repo/refs/tags/.gitkeep b/modules/git/tests/repos/language_stats_repo/refs/tags/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/modules/git/tree.go b/modules/git/tree.go index 5b06cbf359..f6201f6cc9 100644 --- a/modules/git/tree.go +++ b/modules/git/tree.go @@ -176,3 +176,14 @@ func (repo *Repository) LsTree(ref string, filenames ...string) ([]string, error return filelist, err } + +// GetTreePathLatestCommitID returns the latest commit of a tree path +func (repo *Repository) GetTreePathLatestCommit(refName, treePath string) (*Commit, error) { + stdout, _, err := NewCommand(repo.Ctx, "rev-list", "-1"). + AddDynamicArguments(refName).AddDashesAndList(treePath). + RunStdString(&RunOpts{Dir: repo.Path}) + if err != nil { + return nil, err + } + return repo.GetCommit(strings.TrimSpace(stdout)) +} diff --git a/modules/git/tree_entry.go b/modules/git/tree_entry.go index 0d9cfd2258..d51b7992fe 100644 --- a/modules/git/tree_entry.go +++ b/modules/git/tree_entry.go @@ -9,7 +9,7 @@ import ( "sort" "strings" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // TreeEntry the leaf in the git tree diff --git a/modules/git/tree_test.go b/modules/git/tree_test.go index 6e5d7f4415..7e439628f2 100644 --- a/modules/git/tree_test.go +++ b/modules/git/tree_test.go @@ -26,3 +26,18 @@ func TestSubTree_Issue29101(t *testing.T) { assert.True(t, IsErrNotExist(err)) } } + +func Test_GetTreePathLatestCommit(t *testing.T) { + repo, err := openRepositoryWithDefaultContext(filepath.Join(testReposDir, "repo6_blame")) + require.NoError(t, err) + defer repo.Close() + + commitID, err := repo.GetBranchCommitID("master") + require.NoError(t, err) + assert.EqualValues(t, "544d8f7a3b15927cddf2299b4b562d6ebd71b6a7", commitID) + + commit, err := repo.GetTreePathLatestCommit("master", "blame.txt") + require.NoError(t, err) + assert.NotNil(t, commit) + assert.EqualValues(t, "45fb6cbc12f970b04eacd5cd4165edd11c8d7376", commit.ID.String()) +} diff --git a/modules/git/utils.go b/modules/git/utils.go index 53211c6451..b84df47916 100644 --- a/modules/git/utils.go +++ b/modules/git/utils.go @@ -7,7 +7,6 @@ import ( "crypto/sha1" "encoding/hex" "fmt" - "io" "os" "strconv" "strings" @@ -105,32 +104,6 @@ func ParseBool(value string) (result, valid bool) { return intValue != 0, true } -// LimitedReaderCloser is a limited reader closer -type LimitedReaderCloser struct { - R io.Reader - C io.Closer - N int64 -} - -// Read implements io.Reader -func (l *LimitedReaderCloser) Read(p []byte) (n int, err error) { - if l.N <= 0 { - _ = l.C.Close() - return 0, io.EOF - } - if int64(len(p)) > l.N { - p = p[0:l.N] - } - n, err = l.R.Read(p) - l.N -= int64(n) - return n, err -} - -// Close implements io.Closer -func (l *LimitedReaderCloser) Close() error { - return l.C.Close() -} - func HashFilePathForWebUI(s string) string { h := sha1.New() _, _ = h.Write([]byte(s)) diff --git a/modules/gitrepo/branch.go b/modules/gitrepo/branch.go index e13a4c82e1..a46e2e6bb7 100644 --- a/modules/gitrepo/branch.go +++ b/modules/gitrepo/branch.go @@ -6,7 +6,7 @@ package gitrepo import ( "context" - "code.gitea.io/gitea/modules/git" + "forgejo.org/modules/git" ) // GetBranchesByPath returns a branch by its path diff --git a/modules/gitrepo/gitrepo.go b/modules/gitrepo/gitrepo.go index d89f8f9c0c..a9c920d564 100644 --- a/modules/gitrepo/gitrepo.go +++ b/modules/gitrepo/gitrepo.go @@ -9,8 +9,8 @@ import ( "path/filepath" "strings" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/git" + "forgejo.org/modules/setting" ) type Repository interface { diff --git a/modules/gitrepo/walk.go b/modules/gitrepo/walk.go index 8c672ea78b..8349835ff8 100644 --- a/modules/gitrepo/walk.go +++ b/modules/gitrepo/walk.go @@ -6,7 +6,7 @@ package gitrepo import ( "context" - "code.gitea.io/gitea/modules/git" + "forgejo.org/modules/git" ) // WalkReferences walks all the references from the repository diff --git a/modules/graceful/manager.go b/modules/graceful/manager.go index 077eac64f3..db5738c94c 100644 --- a/modules/graceful/manager.go +++ b/modules/graceful/manager.go @@ -9,9 +9,9 @@ import ( "sync" "time" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/process" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/log" + "forgejo.org/modules/process" + "forgejo.org/modules/setting" ) type state uint8 diff --git a/modules/graceful/manager_unix.go b/modules/graceful/manager_unix.go index 931b0f1b62..37edf79075 100644 --- a/modules/graceful/manager_unix.go +++ b/modules/graceful/manager_unix.go @@ -1,8 +1,6 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -//go:build !windows - package graceful import ( @@ -15,10 +13,10 @@ import ( "syscall" "time" - "code.gitea.io/gitea/modules/graceful/releasereopen" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/process" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/graceful/releasereopen" + "forgejo.org/modules/log" + "forgejo.org/modules/process" + "forgejo.org/modules/setting" ) func pidMsg() systemdNotifyMsg { diff --git a/modules/graceful/manager_windows.go b/modules/graceful/manager_windows.go deleted file mode 100644 index bee44381db..0000000000 --- a/modules/graceful/manager_windows.go +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright 2019 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT -// This code is heavily inspired by the archived gofacebook/gracenet/net.go handler - -//go:build windows - -package graceful - -import ( - "os" - "runtime/pprof" - "strconv" - "time" - - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - - "golang.org/x/sys/windows/svc" - "golang.org/x/sys/windows/svc/debug" -) - -// WindowsServiceName is the name of the Windows service -var WindowsServiceName = "gitea" - -const ( - hammerCode = 128 - hammerCmd = svc.Cmd(hammerCode) - acceptHammerCode = svc.Accepted(hammerCode) -) - -func (g *Manager) start() { - // Now label this and all goroutines created by this goroutine with the gracefulLifecycle manager - pprof.SetGoroutineLabels(g.managerCtx) - defer pprof.SetGoroutineLabels(g.ctx) - - if skip, _ := strconv.ParseBool(os.Getenv("SKIP_MINWINSVC")); skip { - log.Trace("Skipping SVC check as SKIP_MINWINSVC is set") - return - } - - // Make SVC process - run := svc.Run - - //lint:ignore SA1019 We use IsAnInteractiveSession because IsWindowsService has a different permissions profile - isAnInteractiveSession, err := svc.IsAnInteractiveSession() //nolint:staticcheck - if err != nil { - log.Error("Unable to ascertain if running as an Windows Service: %v", err) - return - } - if isAnInteractiveSession { - log.Trace("Not running a service ... using the debug SVC manager") - run = debug.Run - } - go func() { - _ = run(WindowsServiceName, g) - }() -} - -// Execute makes Manager implement svc.Handler -func (g *Manager) Execute(args []string, changes <-chan svc.ChangeRequest, status chan<- svc.Status) (svcSpecificEC bool, exitCode uint32) { - if setting.StartupTimeout > 0 { - status <- svc.Status{State: svc.StartPending, WaitHint: uint32(setting.StartupTimeout / time.Millisecond)} - } else { - status <- svc.Status{State: svc.StartPending} - } - - log.Trace("Awaiting server start-up") - // Now need to wait for everything to start... - if !g.awaitServer(setting.StartupTimeout) { - log.Trace("... start-up failed ... Stopped") - return false, 1 - } - - log.Trace("Sending Running state to SVC") - - // We need to implement some way of svc.AcceptParamChange/svc.ParamChange - status <- svc.Status{ - State: svc.Running, - Accepts: svc.AcceptStop | svc.AcceptShutdown | acceptHammerCode, - } - - log.Trace("Started") - - waitTime := 30 * time.Second - -loop: - for { - select { - case <-g.ctx.Done(): - log.Trace("Shutting down") - g.DoGracefulShutdown() - waitTime += setting.GracefulHammerTime - break loop - case <-g.shutdownRequested: - log.Trace("Shutting down") - waitTime += setting.GracefulHammerTime - break loop - case change := <-changes: - switch change.Cmd { - case svc.Interrogate: - log.Trace("SVC sent interrogate") - status <- change.CurrentStatus - case svc.Stop, svc.Shutdown: - log.Trace("SVC requested shutdown - shutting down") - g.DoGracefulShutdown() - waitTime += setting.GracefulHammerTime - break loop - case hammerCode: - log.Trace("SVC requested hammer - shutting down and hammering immediately") - g.DoGracefulShutdown() - g.DoImmediateHammer() - break loop - default: - log.Debug("Unexpected control request: %v", change.Cmd) - } - } - } - - log.Trace("Sending StopPending state to SVC") - status <- svc.Status{ - State: svc.StopPending, - WaitHint: uint32(waitTime / time.Millisecond), - } - -hammerLoop: - for { - select { - case change := <-changes: - switch change.Cmd { - case svc.Interrogate: - log.Trace("SVC sent interrogate") - status <- change.CurrentStatus - case svc.Stop, svc.Shutdown, hammerCmd: - log.Trace("SVC requested hammer - hammering immediately") - g.DoImmediateHammer() - break hammerLoop - default: - log.Debug("Unexpected control request: %v", change.Cmd) - } - case <-g.hammerCtx.Done(): - break hammerLoop - } - } - - log.Trace("Stopped") - return false, 0 -} - -func (g *Manager) awaitServer(limit time.Duration) bool { - c := make(chan struct{}) - go func() { - g.createServerCond.L.Lock() - for { - if g.createdServer >= numberOfServersToCreate { - g.createServerCond.L.Unlock() - close(c) - return - } - select { - case <-g.IsShutdown(): - g.createServerCond.L.Unlock() - return - default: - } - g.createServerCond.Wait() - } - }() - - var tc <-chan time.Time - if limit > 0 { - tc = time.After(limit) - } - select { - case <-c: - return true // completed normally - case <-tc: - return false // timed out - case <-g.IsShutdown(): - g.createServerCond.Signal() - return false - } -} - -func (g *Manager) notify(msg systemdNotifyMsg) { - // Windows doesn't use systemd to notify -} - -func KillParent() { - // Windows doesn't need to "kill parent" because there is no graceful restart -} diff --git a/modules/graceful/net_unix.go b/modules/graceful/net_unix.go index 796e00507c..dc38b02d82 100644 --- a/modules/graceful/net_unix.go +++ b/modules/graceful/net_unix.go @@ -3,22 +3,21 @@ // This code is heavily inspired by the archived gofacebook/gracenet/net.go handler -//go:build !windows - package graceful import ( "fmt" "net" "os" + "path/filepath" "strconv" "strings" "sync" "time" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" ) const ( @@ -237,9 +236,11 @@ func GetListenerUnix(network string, address *net.UnixAddr) (*net.UnixListener, return nil, err } - fileMode := os.FileMode(setting.UnixSocketPermission) - if err = os.Chmod(address.Name, fileMode); err != nil { - return nil, fmt.Errorf("Failed to set permission of unix socket to %s: %w", fileMode.String(), err) + if filepath.IsAbs(address.Name) { + fileMode := os.FileMode(setting.UnixSocketPermission) + if err = os.Chmod(address.Name, fileMode); err != nil { + return nil, fmt.Errorf("Failed to set permission of unix socket to %s: %w", fileMode.String(), err) + } } activeListeners = append(activeListeners, l) diff --git a/modules/graceful/net_unix_linux_test.go b/modules/graceful/net_unix_linux_test.go new file mode 100644 index 0000000000..144e5a4881 --- /dev/null +++ b/modules/graceful/net_unix_linux_test.go @@ -0,0 +1,15 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package graceful + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestAbstractUnixSocket(t *testing.T) { + _, err := DefaultGetListener("unix", "@abc") + require.NoError(t, err) +} diff --git a/modules/graceful/net_windows.go b/modules/graceful/net_windows.go deleted file mode 100644 index 9667bd4d13..0000000000 --- a/modules/graceful/net_windows.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -// This code is heavily inspired by the archived gofacebook/gracenet/net.go handler - -//go:build windows - -package graceful - -import "net" - -// DefaultGetListener obtains a listener for the local network address. -// On windows this is basically just a shim around net.Listen. -func DefaultGetListener(network, address string) (net.Listener, error) { - // Add a deferral to say that we've tried to grab a listener - defer GetManager().InformCleanup() - - return net.Listen(network, address) -} diff --git a/modules/graceful/restart_unix.go b/modules/graceful/restart_unix.go index 98d5c5cc20..a0f3147ec6 100644 --- a/modules/graceful/restart_unix.go +++ b/modules/graceful/restart_unix.go @@ -3,8 +3,6 @@ // This code is heavily inspired by the archived gofacebook/gracenet/net.go handler -//go:build !windows - package graceful import ( diff --git a/modules/graceful/server.go b/modules/graceful/server.go index 2525a83e77..121bbed364 100644 --- a/modules/graceful/server.go +++ b/modules/graceful/server.go @@ -15,9 +15,9 @@ import ( "syscall" "time" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/proxyprotocol" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/log" + "forgejo.org/modules/proxyprotocol" + "forgejo.org/modules/setting" ) // GetListener returns a net listener diff --git a/modules/graceful/server_hooks.go b/modules/graceful/server_hooks.go index 9b67589571..06be783361 100644 --- a/modules/graceful/server_hooks.go +++ b/modules/graceful/server_hooks.go @@ -7,7 +7,7 @@ import ( "os" "runtime" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // awaitShutdown waits for the shutdown signal from the Manager diff --git a/modules/hcaptcha/hcaptcha.go b/modules/hcaptcha/hcaptcha.go index b970d491c5..7f5df9af5a 100644 --- a/modules/hcaptcha/hcaptcha.go +++ b/modules/hcaptcha/hcaptcha.go @@ -10,8 +10,8 @@ import ( "net/url" "strings" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/json" + "forgejo.org/modules/setting" ) const verifyURL = "https://hcaptcha.com/siteverify" diff --git a/modules/highlight/highlight.go b/modules/highlight/highlight.go index 4ee47b7a13..ba3ba479d5 100644 --- a/modules/highlight/highlight.go +++ b/modules/highlight/highlight.go @@ -15,10 +15,10 @@ import ( "strings" "sync" - "code.gitea.io/gitea/modules/analyze" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/analyze" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" "github.com/alecthomas/chroma/v2" "github.com/alecthomas/chroma/v2/formatters/html" @@ -96,7 +96,7 @@ func Code(fileName, language, code string) (output template.HTML, lexerName stri } if lexer == nil { - lexer = lexers.Match(fileName) + lexer = lexers.Match(strings.ToLower(fileName)) if lexer == nil { lexer = lexers.Fallback } @@ -134,6 +134,13 @@ func CodeFromLexer(lexer chroma.Lexer, code string) template.HTML { return template.HTML(strings.TrimSuffix(htmlbuf.String(), "\n")) } +// For the case where Enry recognizes the language, but doesn't use the naming +// that Chroma expects. +var normalizeEnryToChroma = map[string]string{ + "F#": "FSharp", + "Gradle Kotlin DSL": "Kotlin", +} + // File returns a slice of chroma syntax highlighted HTML lines of code and the matched lexer name func File(fileName, language string, code []byte) ([]template.HTML, string, error) { NewContext() @@ -162,10 +169,13 @@ func File(fileName, language string, code []byte) ([]template.HTML, string, erro if lexer == nil { guessLanguage := analyze.GetCodeLanguage(fileName, code) + if normalizedGuessLanguage, ok := normalizeEnryToChroma[guessLanguage]; ok { + guessLanguage = normalizedGuessLanguage + } lexer = lexers.Get(guessLanguage) if lexer == nil { - lexer = lexers.Match(fileName) + lexer = lexers.Match(strings.ToLower(fileName)) if lexer == nil { lexer = lexers.Fallback } diff --git a/modules/highlight/highlight_test.go b/modules/highlight/highlight_test.go index 83d35d93ef..6464999033 100644 --- a/modules/highlight/highlight_test.go +++ b/modules/highlight/highlight_test.go @@ -109,6 +109,24 @@ c=2 ), lexerName: "Python", }, + { + name: "DOS.PAS", + code: "", + want: lines(""), + lexerName: "ObjectPascal", + }, + { + name: "test.fs", + code: "module Crypt = let generateCryptTable: array =", + want: lines(`module Crypt = let generateCryptTable: array<uint32> =`), + lexerName: "FSharp", + }, + { + name: "test.gradle.kts", + code: "@file:Suppress(\"UnstableApiUsage\")", + want: lines("@file:Suppress("UnstableApiUsage")"), // codespell:ignore + lexerName: "Kotlin", + }, } for _, tt := range tests { diff --git a/modules/httpcache/httpcache.go b/modules/httpcache/httpcache.go index b4af371541..7978fc38a1 100644 --- a/modules/httpcache/httpcache.go +++ b/modules/httpcache/httpcache.go @@ -10,7 +10,7 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" ) // SetCacheControlInHeader sets suitable cache-control headers in the response @@ -76,7 +76,8 @@ func HandleGenericETagTimeCache(req *http.Request, w http.ResponseWriter, etag s w.Header().Set("Etag", etag) } if lastModified != nil && !lastModified.IsZero() { - w.Header().Set("Last-Modified", lastModified.Format(http.TimeFormat)) + // http.TimeFormat required a UTC time, refer to https://pkg.go.dev/net/http#TimeFormat + w.Header().Set("Last-Modified", lastModified.UTC().Format(http.TimeFormat)) } if len(etag) > 0 { diff --git a/modules/httplib/serve.go b/modules/httplib/serve.go index 6e147d76f5..cd35367bc9 100644 --- a/modules/httplib/serve.go +++ b/modules/httplib/serve.go @@ -16,13 +16,13 @@ import ( "strings" "time" - charsetModule "code.gitea.io/gitea/modules/charset" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/httpcache" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/typesniffer" - "code.gitea.io/gitea/modules/util" + charsetModule "forgejo.org/modules/charset" + "forgejo.org/modules/container" + "forgejo.org/modules/httpcache" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/typesniffer" + "forgejo.org/modules/util" "github.com/klauspost/compress/gzhttp" ) @@ -79,6 +79,7 @@ func ServeSetHeaders(w http.ResponseWriter, opts *ServeHeaderOptions) { httpcache.SetCacheControlInHeader(header, duration) if !opts.LastModified.IsZero() { + // http.TimeFormat required a UTC time, refer to https://pkg.go.dev/net/http#TimeFormat header.Set("Last-Modified", opts.LastModified.UTC().Format(http.TimeFormat)) } } diff --git a/modules/httplib/url.go b/modules/httplib/url.go index 14b95898f5..32a02e3277 100644 --- a/modules/httplib/url.go +++ b/modules/httplib/url.go @@ -7,7 +7,7 @@ import ( "net/url" "strings" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" ) // IsRiskyRedirectURL returns true if the URL is considered risky for redirects diff --git a/modules/httplib/url_test.go b/modules/httplib/url_test.go index 2842edd514..cd2ceac267 100644 --- a/modules/httplib/url_test.go +++ b/modules/httplib/url_test.go @@ -6,8 +6,8 @@ package httplib import ( "testing" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/test" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" "github.com/stretchr/testify/assert" ) diff --git a/modules/indexer/code/bleve/bleve.go b/modules/indexer/code/bleve/bleve.go index cf9fcbd8b5..5428a9d313 100644 --- a/modules/indexer/code/bleve/bleve.go +++ b/modules/indexer/code/bleve/bleve.go @@ -12,17 +12,18 @@ import ( "strings" "time" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/modules/analyze" - "code.gitea.io/gitea/modules/charset" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/gitrepo" - "code.gitea.io/gitea/modules/indexer/code/internal" - indexer_internal "code.gitea.io/gitea/modules/indexer/internal" - inner_bleve "code.gitea.io/gitea/modules/indexer/internal/bleve" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/typesniffer" + repo_model "forgejo.org/models/repo" + "forgejo.org/modules/analyze" + "forgejo.org/modules/charset" + "forgejo.org/modules/git" + "forgejo.org/modules/gitrepo" + tokenizer_hierarchy "forgejo.org/modules/indexer/code/bleve/tokenizer/hierarchy" + "forgejo.org/modules/indexer/code/internal" + indexer_internal "forgejo.org/modules/indexer/internal" + inner_bleve "forgejo.org/modules/indexer/internal/bleve" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/typesniffer" "github.com/blevesearch/bleve/v2" analyzer_custom "github.com/blevesearch/bleve/v2/analysis/analyzer/custom" @@ -39,10 +40,6 @@ import ( const ( unicodeNormalizeName = "unicodeNormalize" maxBatchSize = 16 - // fuzzyDenominator determines the levenshtein distance per each character of a keyword - fuzzyDenominator = 4 - // see https://github.com/blevesearch/bleve/issues/1563#issuecomment-786822311 - maxFuzziness = 2 ) func addUnicodeNormalizeTokenFilter(m *mapping.IndexMappingImpl) error { @@ -56,6 +53,7 @@ func addUnicodeNormalizeTokenFilter(m *mapping.IndexMappingImpl) error { type RepoIndexerData struct { RepoID int64 CommitID string + Filename string Content string Language string UpdatedAt time.Time @@ -69,7 +67,8 @@ func (d *RepoIndexerData) Type() string { const ( repoIndexerAnalyzer = "repoIndexerAnalyzer" repoIndexerDocType = "repoIndexerDocType" - repoIndexerLatestVersion = 6 + pathHierarchyAnalyzer = "pathHierarchyAnalyzer" + repoIndexerLatestVersion = 7 ) // generateBleveIndexMapping generates a bleve index mapping for the repo indexer @@ -89,6 +88,11 @@ func generateBleveIndexMapping() (mapping.IndexMapping, error) { docMapping.AddFieldMappingsAt("Language", termFieldMapping) docMapping.AddFieldMappingsAt("CommitID", termFieldMapping) + pathFieldMapping := bleve.NewTextFieldMapping() + pathFieldMapping.IncludeInAll = false + pathFieldMapping.Analyzer = pathHierarchyAnalyzer + docMapping.AddFieldMappingsAt("Filename", pathFieldMapping) + timeFieldMapping := bleve.NewDateTimeFieldMapping() timeFieldMapping.IncludeInAll = false docMapping.AddFieldMappingsAt("UpdatedAt", timeFieldMapping) @@ -103,6 +107,13 @@ func generateBleveIndexMapping() (mapping.IndexMapping, error) { "token_filters": []string{unicodeNormalizeName, camelcase.Name, lowercase.Name}, }); err != nil { return nil, err + } else if err := mapping.AddCustomAnalyzer(pathHierarchyAnalyzer, map[string]any{ + "type": analyzer_custom.Name, + "char_filters": []string{}, + "tokenizer": tokenizer_hierarchy.Name, + "token_filters": []string{unicodeNormalizeName}, + }); err != nil { + return nil, err } mapping.DefaultAnalyzer = repoIndexerAnalyzer mapping.AddDocumentMapping(repoIndexerDocType, docMapping) @@ -178,6 +189,7 @@ func (b *Indexer) addUpdate(ctx context.Context, batchWriter git.WriteCloserErro return batch.Index(id, &RepoIndexerData{ RepoID: repo.ID, CommitID: commitSha, + Filename: update.Filename, Content: string(charset.ToUTF8DropErrors(fileContents, charset.ConvertOpts{})), Language: analyze.GetCodeLanguage(update.Filename, fileContents), UpdatedAt: time.Now().UTC(), @@ -244,12 +256,14 @@ func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int keywordQuery query.Query ) - phraseQuery := bleve.NewMatchPhraseQuery(opts.Keyword) - phraseQuery.FieldVal = "Content" - phraseQuery.Analyzer = repoIndexerAnalyzer - keywordQuery = phraseQuery - if opts.IsKeywordFuzzy { - phraseQuery.Fuzziness = min(maxFuzziness, len(opts.Keyword)/fuzzyDenominator) + if opts.Mode == internal.CodeSearchModeUnion { + query := bleve.NewDisjunctionQuery() + for _, field := range strings.Fields(opts.Keyword) { + query.AddQuery(inner_bleve.MatchPhraseQuery(field, "Content", repoIndexerAnalyzer, false)) + } + keywordQuery = query + } else { + keywordQuery = inner_bleve.MatchPhraseQuery(opts.Keyword, "Content", repoIndexerAnalyzer, false) } if len(opts.RepoIDs) > 0 { @@ -266,28 +280,38 @@ func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int indexerQuery = keywordQuery } + opts.Filename = strings.Trim(opts.Filename, "/") + if len(opts.Filename) > 0 { + // we use a keyword analyzer for the query than path hierarchy analyzer + // to match only the exact path + // eg, a query for modules/indexer/code + // should not provide results for modules/ nor modules/indexer + indexerQuery = bleve.NewConjunctionQuery( + indexerQuery, + inner_bleve.MatchQuery(opts.Filename, "Filename", analyzer_keyword.Name, 0), + ) + } + // Save for reuse without language filter facetQuery := indexerQuery if len(opts.Language) > 0 { - languageQuery := bleve.NewMatchQuery(opts.Language) - languageQuery.FieldVal = "Language" - languageQuery.Analyzer = analyzer_keyword.Name - indexerQuery = bleve.NewConjunctionQuery( indexerQuery, - languageQuery, + inner_bleve.MatchQuery(opts.Language, "Language", analyzer_keyword.Name, 0), ) } from, pageSize := opts.GetSkipTake() searchRequest := bleve.NewSearchRequestOptions(indexerQuery, pageSize, from, false) - searchRequest.Fields = []string{"Content", "RepoID", "Language", "CommitID", "UpdatedAt"} + searchRequest.Fields = []string{"Content", "RepoID", "Filename", "Language", "CommitID", "UpdatedAt"} searchRequest.IncludeLocations = true if len(opts.Language) == 0 { searchRequest.AddFacet("languages", bleve.NewFacetRequest("Language", 10)) } + searchRequest.SortBy([]string{"-_score", "UpdatedAt"}) + result, err := b.inner.Indexer.SearchInContext(ctx, searchRequest) if err != nil { return 0, nil, nil, err @@ -299,13 +323,16 @@ func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int for i, hit := range result.Hits { startIndex, endIndex := -1, -1 for _, locations := range hit.Locations["Content"] { + if startIndex != -1 && endIndex != -1 { + break + } location := locations[0] locationStart := int(location.Start) locationEnd := int(location.End) if startIndex < 0 || locationStart < startIndex { startIndex = locationStart } - if endIndex < 0 || locationEnd > endIndex { + if endIndex < 0 && locationEnd > endIndex { endIndex = locationEnd } } @@ -318,7 +345,7 @@ func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int RepoID: int64(hit.Fields["RepoID"].(float64)), StartIndex: startIndex, EndIndex: endIndex, - Filename: internal.FilenameOfIndexerID(hit.ID), + Filename: hit.Fields["Filename"].(string), Content: hit.Fields["Content"].(string), CommitID: hit.Fields["CommitID"].(string), UpdatedUnix: updatedUnix, @@ -331,7 +358,7 @@ func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int if len(opts.Language) > 0 { // Use separate query to go get all language counts facetRequest := bleve.NewSearchRequestOptions(facetQuery, 1, 0, false) - facetRequest.Fields = []string{"Content", "RepoID", "Language", "CommitID", "UpdatedAt"} + facetRequest.Fields = []string{"Content", "RepoID", "Filename", "Language", "CommitID", "UpdatedAt"} facetRequest.IncludeLocations = true facetRequest.AddFacet("languages", bleve.NewFacetRequest("Language", 10)) diff --git a/modules/indexer/code/bleve/tokenizer/hierarchy/hierarchy.go b/modules/indexer/code/bleve/tokenizer/hierarchy/hierarchy.go new file mode 100644 index 0000000000..c44aa78c46 --- /dev/null +++ b/modules/indexer/code/bleve/tokenizer/hierarchy/hierarchy.go @@ -0,0 +1,71 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package hierarchy + +import ( + "bytes" + + "github.com/blevesearch/bleve/v2/analysis" + "github.com/blevesearch/bleve/v2/registry" +) + +const Name = "path_hierarchy" + +type PathHierarchyTokenizer struct{} + +// Similar to elastic's path_hierarchy tokenizer +// This tokenizes a given path into all the possible hierarchies +// For example, +// modules/indexer/code/search.go => +// +// modules/ +// modules/indexer +// modules/indexer/code +// modules/indexer/code/search.go +func (t *PathHierarchyTokenizer) Tokenize(input []byte) analysis.TokenStream { + // trim any extra slashes + input = bytes.Trim(input, "/") + + // zero allocations until the nested directories exceed a depth of 8 (which is unlikely) + rv := make(analysis.TokenStream, 0, 8) + count, off := 1, 0 + + // iterate till all directory separators + for i := bytes.IndexRune(input[off:], '/'); i != -1; i = bytes.IndexRune(input[off:], '/') { + // the index is relative to input[offset...] + // add this index to the accumulated offset to get the index of the current separator in input[0...] + off += i + rv = append(rv, &analysis.Token{ + Term: input[:off], // take the slice, input[0...index of separator] + Start: 0, + End: off, + Position: count, + Type: analysis.AlphaNumeric, + }) + // increment the offset after considering the separator + off++ + count++ + } + + // the entire file path should always be the last token + rv = append(rv, &analysis.Token{ + Term: input, + Start: 0, + End: len(input), + Position: count, + Type: analysis.AlphaNumeric, + }) + + return rv +} + +func TokenizerConstructor(config map[string]any, cache *registry.Cache) (analysis.Tokenizer, error) { + return &PathHierarchyTokenizer{}, nil +} + +func init() { + if err := registry.RegisterTokenizer(Name, TokenizerConstructor); err != nil { + panic(err) + } +} diff --git a/modules/indexer/code/bleve/tokenizer/hierarchy/hierarchy_test.go b/modules/indexer/code/bleve/tokenizer/hierarchy/hierarchy_test.go new file mode 100644 index 0000000000..0ca3c2941d --- /dev/null +++ b/modules/indexer/code/bleve/tokenizer/hierarchy/hierarchy_test.go @@ -0,0 +1,59 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package hierarchy + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestIndexerBleveHierarchyTokenizer(t *testing.T) { + tokenizer := &PathHierarchyTokenizer{} + keywords := []struct { + Term string + Results []string + }{ + { + Term: "modules/indexer/code/search.go", + Results: []string{ + "modules", + "modules/indexer", + "modules/indexer/code", + "modules/indexer/code/search.go", + }, + }, + { + Term: "/tmp/forgejo/", + Results: []string{ + "tmp", + "tmp/forgejo", + }, + }, + { + Term: "a/b/c/d/e/f/g/h/i/j", + Results: []string{ + "a", + "a/b", + "a/b/c", + "a/b/c/d", + "a/b/c/d/e", + "a/b/c/d/e/f", + "a/b/c/d/e/f/g", + "a/b/c/d/e/f/g/h", + "a/b/c/d/e/f/g/h/i", + "a/b/c/d/e/f/g/h/i/j", + }, + }, + } + + for _, kw := range keywords { + tokens := tokenizer.Tokenize([]byte(kw.Term)) + assert.Len(t, tokens, len(kw.Results)) + for i, token := range tokens { + assert.Equal(t, i+1, token.Position) + assert.Equal(t, kw.Results[i], string(token.Term)) + } + } +} diff --git a/modules/indexer/code/elasticsearch/elasticsearch.go b/modules/indexer/code/elasticsearch/elasticsearch.go index 0bda180fac..3903d77fe0 100644 --- a/modules/indexer/code/elasticsearch/elasticsearch.go +++ b/modules/indexer/code/elasticsearch/elasticsearch.go @@ -11,29 +11,30 @@ import ( "strconv" "strings" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/modules/analyze" - "code.gitea.io/gitea/modules/charset" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/gitrepo" - "code.gitea.io/gitea/modules/indexer/code/internal" - indexer_internal "code.gitea.io/gitea/modules/indexer/internal" - inner_elasticsearch "code.gitea.io/gitea/modules/indexer/internal/elasticsearch" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/typesniffer" + repo_model "forgejo.org/models/repo" + "forgejo.org/modules/analyze" + "forgejo.org/modules/charset" + "forgejo.org/modules/git" + "forgejo.org/modules/gitrepo" + "forgejo.org/modules/indexer/code/internal" + indexer_internal "forgejo.org/modules/indexer/internal" + inner_elasticsearch "forgejo.org/modules/indexer/internal/elasticsearch" + "forgejo.org/modules/json" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/typesniffer" "github.com/go-enry/go-enry/v2" "github.com/olivere/elastic/v7" ) const ( - esRepoIndexerLatestVersion = 1 + esRepoIndexerLatestVersion = 2 // multi-match-types, currently only 2 types are used // Reference: https://www.elastic.co/guide/en/elasticsearch/reference/7.0/query-dsl-multi-match-query.html#multi-match-types - esMultiMatchTypeBestFields = "best_fields" - esMultiMatchTypePhrasePrefix = "phrase_prefix" + esMultiMatchTypeBestFields = "best_fields" + esMultiMatchTypePhrase = "phrase" ) var _ internal.Indexer = &Indexer{} @@ -56,6 +57,21 @@ func NewIndexer(url, indexerName string) *Indexer { const ( defaultMapping = `{ + "settings": { + "analysis": { + "analyzer": { + "custom_path_tree": { + "tokenizer": "custom_hierarchy" + } + }, + "tokenizer": { + "custom_hierarchy": { + "type": "path_hierarchy", + "delimiter": "/" + } + } + } + }, "mappings": { "properties": { "repo_id": { @@ -71,6 +87,15 @@ const ( "type": "keyword", "index": true }, + "filename": { + "type": "text", + "fields": { + "tree": { + "type": "text", + "analyzer": "custom_path_tree" + } + } + }, "language": { "type": "keyword", "index": true @@ -137,6 +162,7 @@ func (b *Indexer) addUpdate(ctx context.Context, batchWriter git.WriteCloserErro "repo_id": repo.ID, "content": string(charset.ToUTF8DropErrors(fileContents, charset.ConvertOpts{})), "commit_id": sha, + "filename": update.Filename, "language": analyze.GetCodeLanguage(update.Filename, fileContents), "updated_at": timeutil.TimeStampNow(), }), @@ -197,8 +223,33 @@ func (b *Indexer) Index(ctx context.Context, repo *repo_model.Repository, sha st return nil } -// Delete deletes indexes by ids +// Delete entries by repoId func (b *Indexer) Delete(ctx context.Context, repoID int64) error { + if err := b.doDelete(ctx, repoID); err != nil { + // Maybe there is a conflict during the delete operation, so we should retry after a refresh + log.Warn("Deletion of entries of repo %v within index %v was erroneous. Trying to refresh index before trying again", repoID, b.inner.VersionedIndexName(), err) + if err := b.refreshIndex(ctx); err != nil { + return err + } + if err := b.doDelete(ctx, repoID); err != nil { + log.Error("Could not delete entries of repo %v within index %v", repoID, b.inner.VersionedIndexName()) + return err + } + } + return nil +} + +func (b *Indexer) refreshIndex(ctx context.Context) error { + if _, err := b.inner.Client.Refresh(b.inner.VersionedIndexName()).Do(ctx); err != nil { + log.Error("Error while trying to refresh index %v", b.inner.VersionedIndexName(), err) + return err + } + + return nil +} + +// Delete entries by repoId +func (b *Indexer) doDelete(ctx context.Context, repoID int64) error { _, err := b.inner.Client.DeleteByQuery(b.inner.VersionedIndexName()). Query(elastic.NewTermsQuery("repo_id", repoID)). Do(ctx) @@ -241,7 +292,6 @@ func convertResult(searchResult *elastic.SearchResult, kw string, pageSize int) panic(fmt.Sprintf("2===%#v", hit.Highlight)) } - repoID, fileName := internal.ParseIndexerID(hit.Id) res := make(map[string]any) if err := json.Unmarshal(hit.Source, &res); err != nil { return 0, nil, nil, err @@ -250,8 +300,8 @@ func convertResult(searchResult *elastic.SearchResult, kw string, pageSize int) language := res["language"].(string) hits = append(hits, &internal.SearchResult{ - RepoID: repoID, - Filename: fileName, + RepoID: int64(res["repo_id"].(float64)), + Filename: res["filename"].(string), CommitID: res["commit_id"].(string), Content: res["content"].(string), UpdatedUnix: timeutil.TimeStamp(res["updated_at"].(float64)), @@ -284,8 +334,8 @@ func extractAggs(searchResult *elastic.SearchResult) []*internal.SearchResultLan // Search searches for codes and language stats by given conditions. func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int64, []*internal.SearchResult, []*internal.SearchResultLanguages, error) { - searchType := esMultiMatchTypePhrasePrefix - if opts.IsKeywordFuzzy { + searchType := esMultiMatchTypePhrase + if opts.Mode == internal.CodeSearchModeUnion { searchType = esMultiMatchTypeBestFields } @@ -300,6 +350,9 @@ func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int repoQuery := elastic.NewTermsQuery("repo_id", repoStrs...) query = query.Must(repoQuery) } + if len(opts.Filename) > 0 { + query = query.Filter(elastic.NewTermsQuery("filename.tree", opts.Filename)) + } var ( start, pageSize = opts.GetSkipTake() @@ -318,7 +371,8 @@ func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int NumOfFragments(0). // return all highting content on fragments HighlighterType("fvh"), ). - Sort("repo_id", true). + Sort("_score", false). + Sort("updated_at", true). From(start).Size(pageSize). Do(ctx) if err != nil { @@ -349,7 +403,8 @@ func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int NumOfFragments(0). // return all highting content on fragments HighlighterType("fvh"), ). - Sort("repo_id", true). + Sort("_score", false). + Sort("updated_at", true). From(start).Size(pageSize). Do(ctx) if err != nil { diff --git a/modules/indexer/code/git.go b/modules/indexer/code/git.go index c7ffcfdd40..14a43cf3be 100644 --- a/modules/indexer/code/git.go +++ b/modules/indexer/code/git.go @@ -8,11 +8,11 @@ import ( "strconv" "strings" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/indexer/code/internal" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + repo_model "forgejo.org/models/repo" + "forgejo.org/modules/git" + "forgejo.org/modules/indexer/code/internal" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" ) func getDefaultBranchSha(ctx context.Context, repo *repo_model.Repository) (string, error) { diff --git a/modules/indexer/code/indexer.go b/modules/indexer/code/indexer.go index 0a8ce27907..c32b637ab4 100644 --- a/modules/indexer/code/indexer.go +++ b/modules/indexer/code/indexer.go @@ -11,16 +11,16 @@ import ( "sync/atomic" "time" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/modules/graceful" - "code.gitea.io/gitea/modules/indexer/code/bleve" - "code.gitea.io/gitea/modules/indexer/code/elasticsearch" - "code.gitea.io/gitea/modules/indexer/code/internal" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/process" - "code.gitea.io/gitea/modules/queue" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/modules/graceful" + "forgejo.org/modules/indexer/code/bleve" + "forgejo.org/modules/indexer/code/elasticsearch" + "forgejo.org/modules/indexer/code/internal" + "forgejo.org/modules/log" + "forgejo.org/modules/process" + "forgejo.org/modules/queue" + "forgejo.org/modules/setting" ) var ( diff --git a/modules/indexer/code/indexer_test.go b/modules/indexer/code/indexer_test.go index 967aad1b54..29b2936fa1 100644 --- a/modules/indexer/code/indexer_test.go +++ b/modules/indexer/code/indexer_test.go @@ -4,20 +4,20 @@ package code import ( - "context" "os" "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/indexer/code/bleve" - "code.gitea.io/gitea/modules/indexer/code/elasticsearch" - "code.gitea.io/gitea/modules/indexer/code/internal" + "forgejo.org/models/db" + "forgejo.org/models/unittest" + "forgejo.org/modules/git" + "forgejo.org/modules/indexer/code/bleve" + "forgejo.org/modules/indexer/code/elasticsearch" + "forgejo.org/modules/indexer/code/internal" - _ "code.gitea.io/gitea/models" - _ "code.gitea.io/gitea/models/actions" - _ "code.gitea.io/gitea/models/activities" + _ "forgejo.org/models" + _ "forgejo.org/models/actions" + _ "forgejo.org/models/activities" + _ "forgejo.org/models/forgefed" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -33,10 +33,11 @@ func testIndexer(name string, t *testing.T, indexer internal.Indexer) { err := index(git.DefaultContext, indexer, repoID) require.NoError(t, err) keywords := []struct { - RepoIDs []int64 - Keyword string - IDs []int64 - Langs int + RepoIDs []int64 + Keyword string + IDs []int64 + Langs int + Filename string }{ { RepoIDs: nil, @@ -50,6 +51,20 @@ func testIndexer(name string, t *testing.T, indexer internal.Indexer) { IDs: []int64{}, Langs: 0, }, + { + RepoIDs: nil, + Keyword: "Description", + IDs: []int64{}, + Langs: 0, + Filename: "NOT-README.md", + }, + { + RepoIDs: nil, + Keyword: "Description", + IDs: []int64{repoID}, + Langs: 1, + Filename: "README.md", + }, { RepoIDs: nil, Keyword: "Description for", @@ -78,14 +93,15 @@ func testIndexer(name string, t *testing.T, indexer internal.Indexer) { for _, kw := range keywords { t.Run(kw.Keyword, func(t *testing.T) { - total, res, langs, err := indexer.Search(context.TODO(), &internal.SearchOptions{ + total, res, langs, err := indexer.Search(t.Context(), &internal.SearchOptions{ RepoIDs: kw.RepoIDs, Keyword: kw.Keyword, Paginator: &db.ListOptions{ Page: 1, PageSize: 10, }, - IsKeywordFuzzy: true, + Filename: kw.Filename, + Mode: SearchModeUnion, }) require.NoError(t, err) assert.Len(t, kw.IDs, int(total)) @@ -100,7 +116,7 @@ func testIndexer(name string, t *testing.T, indexer internal.Indexer) { }) } - require.NoError(t, indexer.Delete(context.Background(), repoID)) + require.NoError(t, indexer.Delete(t.Context(), repoID)) }) } @@ -110,7 +126,7 @@ func TestBleveIndexAndSearch(t *testing.T) { dir := t.TempDir() idx := bleve.NewIndexer(dir) - _, err := idx.Init(context.Background()) + _, err := idx.Init(t.Context()) if err != nil { if idx != nil { idx.Close() @@ -132,7 +148,7 @@ func TestESIndexAndSearch(t *testing.T) { } indexer := elasticsearch.NewIndexer(u, "gitea_codes") - if _, err := indexer.Init(context.Background()); err != nil { + if _, err := indexer.Init(t.Context()); err != nil { if indexer != nil { indexer.Close() } diff --git a/modules/indexer/code/internal/indexer.go b/modules/indexer/code/internal/indexer.go index c259fcd26e..cc2c2aaf06 100644 --- a/modules/indexer/code/internal/indexer.go +++ b/modules/indexer/code/internal/indexer.go @@ -7,9 +7,9 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/modules/indexer/internal" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/modules/indexer/internal" ) // Indexer defines an interface to index and search code contents @@ -20,12 +20,27 @@ type Indexer interface { Search(ctx context.Context, opts *SearchOptions) (int64, []*SearchResult, []*SearchResultLanguages, error) } +type CodeSearchMode int + +const ( + CodeSearchModeExact CodeSearchMode = iota + CodeSearchModeUnion +) + +func (mode CodeSearchMode) String() string { + if mode == CodeSearchModeUnion { + return "union" + } + return "exact" +} + type SearchOptions struct { RepoIDs []int64 Keyword string Language string + Filename string - IsKeywordFuzzy bool + Mode CodeSearchMode db.Paginator } diff --git a/modules/indexer/code/internal/model.go b/modules/indexer/code/internal/model.go index f75263c83c..ad0a7934d9 100644 --- a/modules/indexer/code/internal/model.go +++ b/modules/indexer/code/internal/model.go @@ -3,7 +3,7 @@ package internal -import "code.gitea.io/gitea/modules/timeutil" +import "forgejo.org/modules/timeutil" type FileUpdate struct { Filename string diff --git a/modules/indexer/code/internal/util.go b/modules/indexer/code/internal/util.go index 689c4f4584..f5a4ec8e4e 100644 --- a/modules/indexer/code/internal/util.go +++ b/modules/indexer/code/internal/util.go @@ -3,30 +3,8 @@ package internal -import ( - "strings" - - "code.gitea.io/gitea/modules/indexer/internal" - "code.gitea.io/gitea/modules/log" -) +import "forgejo.org/modules/indexer/internal" func FilenameIndexerID(repoID int64, filename string) string { return internal.Base36(repoID) + "_" + filename } - -func ParseIndexerID(indexerID string) (int64, string) { - index := strings.IndexByte(indexerID, '_') - if index == -1 { - log.Error("Unexpected ID in repo indexer: %s", indexerID) - } - repoID, _ := internal.ParseBase36(indexerID[:index]) - return repoID, indexerID[index+1:] -} - -func FilenameOfIndexerID(indexerID string) string { - index := strings.IndexByte(indexerID, '_') - if index == -1 { - log.Error("Unexpected ID in repo indexer: %s", indexerID) - } - return indexerID[index+1:] -} diff --git a/modules/indexer/code/search.go b/modules/indexer/code/search.go index f45907ad90..adf51a76d7 100644 --- a/modules/indexer/code/search.go +++ b/modules/indexer/code/search.go @@ -9,10 +9,10 @@ import ( "html/template" "strings" - "code.gitea.io/gitea/modules/highlight" - "code.gitea.io/gitea/modules/indexer/code/internal" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/services/gitdiff" + "forgejo.org/modules/highlight" + "forgejo.org/modules/indexer/code/internal" + "forgejo.org/modules/timeutil" + "forgejo.org/services/gitdiff" ) // Result a search result to display @@ -35,6 +35,15 @@ type SearchResultLanguages = internal.SearchResultLanguages type SearchOptions = internal.SearchOptions +var CodeSearchOptions = [2]string{"exact", "union"} + +type SearchMode = internal.CodeSearchMode + +const ( + SearchModeExact = internal.CodeSearchModeExact + SearchModeUnion = internal.CodeSearchModeUnion +) + func indices(content string, selectionStartIndex, selectionEndIndex int) (int, int) { startIndex := selectionStartIndex numLinesBefore := 0 @@ -204,7 +213,6 @@ func searchResult(result *internal.SearchResult, startIndex, endIndex int) (*Res } // PerformSearch perform a search on a repository -// if isFuzzy is true set the Damerau-Levenshtein distance from 0 to 2 func PerformSearch(ctx context.Context, opts *SearchOptions) (int, []*Result, []*SearchResultLanguages, error) { if opts == nil || len(opts.Keyword) == 0 { return 0, nil, nil, nil diff --git a/modules/indexer/internal/bleve/indexer.go b/modules/indexer/internal/bleve/indexer.go index 1435d2f519..4a61a80765 100644 --- a/modules/indexer/internal/bleve/indexer.go +++ b/modules/indexer/internal/bleve/indexer.go @@ -7,8 +7,8 @@ import ( "context" "fmt" - "code.gitea.io/gitea/modules/indexer/internal" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/indexer/internal" + "forgejo.org/modules/log" "github.com/blevesearch/bleve/v2" "github.com/blevesearch/bleve/v2/mapping" diff --git a/modules/indexer/internal/bleve/metadata.go b/modules/indexer/internal/bleve/metadata.go index 3c570ab4ba..08979d3e98 100644 --- a/modules/indexer/internal/bleve/metadata.go +++ b/modules/indexer/internal/bleve/metadata.go @@ -9,7 +9,7 @@ import ( "os" "path/filepath" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" ) const metaFilename = "rupture_meta.json" diff --git a/modules/indexer/internal/bleve/query.go b/modules/indexer/internal/bleve/query.go index 90626da4f1..7f411b516b 100644 --- a/modules/indexer/internal/bleve/query.go +++ b/modules/indexer/internal/bleve/query.go @@ -4,7 +4,7 @@ package bleve import ( - "code.gitea.io/gitea/modules/optional" + "forgejo.org/modules/optional" "github.com/blevesearch/bleve/v2" "github.com/blevesearch/bleve/v2/search/query" @@ -13,21 +13,30 @@ import ( // NumericEqualityQuery generates a numeric equality query for the given value and field func NumericEqualityQuery(value int64, field string) *query.NumericRangeQuery { f := float64(value) - tru := true // codespell-ignore - q := bleve.NewNumericRangeInclusiveQuery(&f, &f, &tru, &tru) // codespell-ignore + tru := true // codespell:ignore + q := bleve.NewNumericRangeInclusiveQuery(&f, &f, &tru, &tru) // codespell:ignore q.SetField(field) return q } -// MatchPhraseQuery generates a match phrase query for the given phrase, field and analyzer -func MatchPhraseQuery(matchPhrase, field, analyzer string, fuzziness int) *query.MatchPhraseQuery { - q := bleve.NewMatchPhraseQuery(matchPhrase) +// MatchQuery generates a match query for the given phrase, field and analyzer +func MatchQuery(matchTerm, field, analyzer string, fuzziness int) *query.MatchQuery { + q := bleve.NewMatchQuery(matchTerm) q.FieldVal = field q.Analyzer = analyzer q.Fuzziness = fuzziness return q } +// MatchPhraseQuery generates a match phrase query for the given phrase, field and analyzer +func MatchPhraseQuery(matchPhrase, field, analyzer string, autoFuzzy bool) *query.MatchPhraseQuery { + q := bleve.NewMatchPhraseQuery(matchPhrase) + q.FieldVal = field + q.Analyzer = analyzer + q.SetAutoFuzziness(autoFuzzy) + return q +} + // BoolFieldQuery generates a bool field query for the given value and field func BoolFieldQuery(value bool, field string) *query.BoolFieldQuery { q := bleve.NewBoolFieldQuery(value) diff --git a/modules/indexer/internal/bleve/util.go b/modules/indexer/internal/bleve/util.go index d05b679765..e7311aec6c 100644 --- a/modules/indexer/internal/bleve/util.go +++ b/modules/indexer/internal/bleve/util.go @@ -7,8 +7,8 @@ import ( "errors" "os" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/util" "github.com/blevesearch/bleve/v2" "github.com/blevesearch/bleve/v2/index/upsidedown" diff --git a/modules/indexer/internal/db/indexer.go b/modules/indexer/internal/db/indexer.go index 3deec836c4..a1121db333 100644 --- a/modules/indexer/internal/db/indexer.go +++ b/modules/indexer/internal/db/indexer.go @@ -6,7 +6,7 @@ package db import ( "context" - "code.gitea.io/gitea/modules/indexer/internal" + "forgejo.org/modules/indexer/internal" ) var _ internal.Indexer = &Indexer{} diff --git a/modules/indexer/internal/elasticsearch/indexer.go b/modules/indexer/internal/elasticsearch/indexer.go index 395eea3bce..9cd29f3e49 100644 --- a/modules/indexer/internal/elasticsearch/indexer.go +++ b/modules/indexer/internal/elasticsearch/indexer.go @@ -7,7 +7,7 @@ import ( "context" "fmt" - "code.gitea.io/gitea/modules/indexer/internal" + "forgejo.org/modules/indexer/internal" "github.com/olivere/elastic/v7" ) diff --git a/modules/indexer/internal/elasticsearch/util.go b/modules/indexer/internal/elasticsearch/util.go index 18cb152d3c..8458bd1326 100644 --- a/modules/indexer/internal/elasticsearch/util.go +++ b/modules/indexer/internal/elasticsearch/util.go @@ -8,7 +8,7 @@ import ( "fmt" "time" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" "github.com/olivere/elastic/v7" ) diff --git a/modules/indexer/internal/meilisearch/util.go b/modules/indexer/internal/meilisearch/util.go index 845bdb6e7f..ff41b3a857 100644 --- a/modules/indexer/internal/meilisearch/util.go +++ b/modules/indexer/internal/meilisearch/util.go @@ -6,7 +6,7 @@ package meilisearch import ( "fmt" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // VersionedIndexName returns the full index name with version diff --git a/modules/indexer/internal/paginator.go b/modules/indexer/internal/paginator.go index ee204bf047..3ef800c630 100644 --- a/modules/indexer/internal/paginator.go +++ b/modules/indexer/internal/paginator.go @@ -6,7 +6,7 @@ package internal import ( "math" - "code.gitea.io/gitea/models/db" + "forgejo.org/models/db" ) // ParsePaginator parses a db.Paginator into a skip and limit diff --git a/modules/indexer/issues/bleve/bleve.go b/modules/indexer/issues/bleve/bleve.go index b20fcc6f80..64d3c8122e 100644 --- a/modules/indexer/issues/bleve/bleve.go +++ b/modules/indexer/issues/bleve/bleve.go @@ -6,9 +6,9 @@ package bleve import ( "context" - indexer_internal "code.gitea.io/gitea/modules/indexer/internal" - inner_bleve "code.gitea.io/gitea/modules/indexer/internal/bleve" - "code.gitea.io/gitea/modules/indexer/issues/internal" + indexer_internal "forgejo.org/modules/indexer/internal" + inner_bleve "forgejo.org/modules/indexer/internal/bleve" + "forgejo.org/modules/indexer/issues/internal" "github.com/blevesearch/bleve/v2" "github.com/blevesearch/bleve/v2/analysis/analyzer/custom" @@ -35,13 +35,7 @@ func addUnicodeNormalizeTokenFilter(m *mapping.IndexMappingImpl) error { }) } -const ( - maxBatchSize = 16 - // fuzzyDenominator determines the levenshtein distance per each character of a keyword - fuzzyDenominator = 4 - // see https://github.com/blevesearch/bleve/issues/1563#issuecomment-786822311 - maxFuzziness = 2 -) +const maxBatchSize = 16 // IndexerData an update to the issue indexer type IndexerData internal.IndexerData @@ -162,16 +156,27 @@ func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) ( var queries []query.Query if options.Keyword != "" { - fuzziness := 0 - if options.IsFuzzyKeyword { - fuzziness = min(maxFuzziness, len(options.Keyword)/fuzzyDenominator) + tokens, err := options.Tokens() + if err != nil { + return nil, err } + q := bleve.NewBooleanQuery() + for _, token := range tokens { + innerQ := bleve.NewDisjunctionQuery( + inner_bleve.MatchPhraseQuery(token.Term, "title", issueIndexerAnalyzer, token.Fuzzy), + inner_bleve.MatchPhraseQuery(token.Term, "content", issueIndexerAnalyzer, token.Fuzzy), + inner_bleve.MatchPhraseQuery(token.Term, "comments", issueIndexerAnalyzer, token.Fuzzy)) - queries = append(queries, bleve.NewDisjunctionQuery([]query.Query{ - inner_bleve.MatchPhraseQuery(options.Keyword, "title", issueIndexerAnalyzer, fuzziness), - inner_bleve.MatchPhraseQuery(options.Keyword, "content", issueIndexerAnalyzer, fuzziness), - inner_bleve.MatchPhraseQuery(options.Keyword, "comments", issueIndexerAnalyzer, fuzziness), - }...)) + switch token.Kind { + case internal.BoolOptMust: + q.AddMust(innerQ) + case internal.BoolOptShould: + q.AddShould(innerQ) + case internal.BoolOptNot: + q.AddMustNot(innerQ) + } + } + queries = append(queries, q) } if len(options.RepoIDs) > 0 || options.AllPublic { diff --git a/modules/indexer/issues/bleve/bleve_test.go b/modules/indexer/issues/bleve/bleve_test.go index 908514a01a..ead57b572f 100644 --- a/modules/indexer/issues/bleve/bleve_test.go +++ b/modules/indexer/issues/bleve/bleve_test.go @@ -6,7 +6,7 @@ package bleve import ( "testing" - "code.gitea.io/gitea/modules/indexer/issues/internal/tests" + "forgejo.org/modules/indexer/issues/internal/tests" ) func TestBleveIndexer(t *testing.T) { diff --git a/modules/indexer/issues/db/db.go b/modules/indexer/issues/db/db.go index 05ec548435..9dd026e74f 100644 --- a/modules/indexer/issues/db/db.go +++ b/modules/indexer/issues/db/db.go @@ -6,11 +6,11 @@ package db import ( "context" - "code.gitea.io/gitea/models/db" - issue_model "code.gitea.io/gitea/models/issues" - indexer_internal "code.gitea.io/gitea/modules/indexer/internal" - inner_db "code.gitea.io/gitea/modules/indexer/internal/db" - "code.gitea.io/gitea/modules/indexer/issues/internal" + "forgejo.org/models/db" + issue_model "forgejo.org/models/issues" + indexer_internal "forgejo.org/modules/indexer/internal" + inner_db "forgejo.org/modules/indexer/internal/db" + "forgejo.org/modules/indexer/issues/internal" "xorm.io/builder" ) diff --git a/modules/indexer/issues/db/options.go b/modules/indexer/issues/db/options.go index 875a4ca279..4411cc1c37 100644 --- a/modules/indexer/issues/db/options.go +++ b/modules/indexer/issues/db/options.go @@ -7,11 +7,11 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - issue_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/indexer/issues/internal" - "code.gitea.io/gitea/modules/optional" + "forgejo.org/models/db" + issue_model "forgejo.org/models/issues" + "forgejo.org/modules/container" + "forgejo.org/modules/indexer/issues/internal" + "forgejo.org/modules/optional" ) func ToDBOptions(ctx context.Context, options *internal.SearchOptions) (*issue_model.IssuesOptions, error) { diff --git a/modules/indexer/issues/dboptions.go b/modules/indexer/issues/dboptions.go index c1f454eeee..d67dc68bfc 100644 --- a/modules/indexer/issues/dboptions.go +++ b/modules/indexer/issues/dboptions.go @@ -4,9 +4,9 @@ package issues import ( - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/modules/optional" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + "forgejo.org/modules/optional" ) func ToSearchOptions(keyword string, opts *issues_model.IssuesOptions) *SearchOptions { @@ -78,7 +78,9 @@ func ToSearchOptions(keyword string, opts *issues_model.IssuesOptions) *SearchOp searchOpt.Paginator = opts.Paginator switch opts.SortType { - case "", "latest": + case "", "relevance": + searchOpt.SortBy = SortByScore + case "latest": searchOpt.SortBy = SortByCreatedDesc case "oldest": searchOpt.SortBy = SortByCreatedAsc diff --git a/modules/indexer/issues/elasticsearch/elasticsearch.go b/modules/indexer/issues/elasticsearch/elasticsearch.go index 42e709a5e8..1bf0145796 100644 --- a/modules/indexer/issues/elasticsearch/elasticsearch.go +++ b/modules/indexer/issues/elasticsearch/elasticsearch.go @@ -9,10 +9,10 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/modules/graceful" - indexer_internal "code.gitea.io/gitea/modules/indexer/internal" - inner_elasticsearch "code.gitea.io/gitea/modules/indexer/internal/elasticsearch" - "code.gitea.io/gitea/modules/indexer/issues/internal" + "forgejo.org/modules/graceful" + indexer_internal "forgejo.org/modules/indexer/internal" + inner_elasticsearch "forgejo.org/modules/indexer/internal/elasticsearch" + "forgejo.org/modules/indexer/issues/internal" "github.com/olivere/elastic/v7" ) @@ -23,6 +23,10 @@ const ( // Reference: https://www.elastic.co/guide/en/elasticsearch/reference/7.0/query-dsl-multi-match-query.html#multi-match-types esMultiMatchTypeBestFields = "best_fields" esMultiMatchTypePhrasePrefix = "phrase_prefix" + + // fuzziness options + // Reference: https://www.elastic.co/guide/en/elasticsearch/reference/7.0/common-options.html#fuzziness + esFuzzyAuto = "AUTO" ) var _ internal.Indexer = &Indexer{} @@ -145,12 +149,30 @@ func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) ( query := elastic.NewBoolQuery() if options.Keyword != "" { - searchType := esMultiMatchTypePhrasePrefix - if options.IsFuzzyKeyword { - searchType = esMultiMatchTypeBestFields + q := elastic.NewBoolQuery() + tokens, err := options.Tokens() + if err != nil { + return nil, err } + for _, token := range tokens { + innerQ := elastic.NewMultiMatchQuery(token.Term, "title", "content", "comments") + if token.Fuzzy { + // If the term is not a phrase use fuzziness set to AUTO + innerQ = innerQ.Type(esMultiMatchTypeBestFields).Fuzziness(esFuzzyAuto) + } else { + innerQ = innerQ.Type(esMultiMatchTypePhrasePrefix) + } - query.Must(elastic.NewMultiMatchQuery(options.Keyword, "title", "content", "comments").Type(searchType)) + switch token.Kind { + case internal.BoolOptMust: + q.Must(innerQ) + case internal.BoolOptShould: + q.Should(innerQ) + case internal.BoolOptNot: + q.MustNot(innerQ) + } + } + query.Must(q) } if len(options.RepoIDs) > 0 { @@ -236,7 +258,7 @@ func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) ( } if options.SortBy == "" { - options.SortBy = internal.SortByCreatedAsc + options.SortBy = internal.SortByScore } sortBy := []elastic.Sorter{ parseSortBy(options.SortBy), diff --git a/modules/indexer/issues/elasticsearch/elasticsearch_test.go b/modules/indexer/issues/elasticsearch/elasticsearch_test.go index 4ed0b84442..f8cd4e02f6 100644 --- a/modules/indexer/issues/elasticsearch/elasticsearch_test.go +++ b/modules/indexer/issues/elasticsearch/elasticsearch_test.go @@ -10,7 +10,7 @@ import ( "testing" "time" - "code.gitea.io/gitea/modules/indexer/issues/internal/tests" + "forgejo.org/modules/indexer/issues/internal/tests" ) func TestElasticsearchIndexer(t *testing.T) { diff --git a/modules/indexer/issues/indexer.go b/modules/indexer/issues/indexer.go index d7310529fc..446e714735 100644 --- a/modules/indexer/issues/indexer.go +++ b/modules/indexer/issues/indexer.go @@ -8,22 +8,23 @@ import ( "fmt" "os" "runtime/pprof" + "strings" "sync/atomic" "time" - db_model "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/modules/graceful" - "code.gitea.io/gitea/modules/indexer/issues/bleve" - "code.gitea.io/gitea/modules/indexer/issues/db" - "code.gitea.io/gitea/modules/indexer/issues/elasticsearch" - "code.gitea.io/gitea/modules/indexer/issues/internal" - "code.gitea.io/gitea/modules/indexer/issues/meilisearch" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/process" - "code.gitea.io/gitea/modules/queue" - "code.gitea.io/gitea/modules/setting" + db_model "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/modules/graceful" + "forgejo.org/modules/indexer/issues/bleve" + "forgejo.org/modules/indexer/issues/db" + "forgejo.org/modules/indexer/issues/elasticsearch" + "forgejo.org/modules/indexer/issues/internal" + "forgejo.org/modules/indexer/issues/meilisearch" + "forgejo.org/modules/log" + "forgejo.org/modules/optional" + "forgejo.org/modules/process" + "forgejo.org/modules/queue" + "forgejo.org/modules/setting" ) // IndexerMetadata is used to send data to the queue, so it contains only the ids. @@ -269,6 +270,7 @@ func IsAvailable(ctx context.Context) bool { type SearchOptions = internal.SearchOptions const ( + SortByScore = internal.SortByScore SortByCreatedDesc = internal.SortByCreatedDesc SortByUpdatedDesc = internal.SortByUpdatedDesc SortByCommentsDesc = internal.SortByCommentsDesc @@ -279,6 +281,33 @@ const ( SortByDeadlineAsc = internal.SortByDeadlineAsc ) +// ParseSortBy parses the `sortBy` string and returns the associated `SortBy` +// value, if one exists. Otherwise return `defaultSortBy`. +func ParseSortBy(sortBy string, defaultSortBy internal.SortBy) internal.SortBy { + switch strings.ToLower(sortBy) { + case "relevance": + return SortByScore + case "latest": + return SortByCreatedDesc + case "oldest": + return SortByCreatedAsc + case "recentupdate": + return SortByUpdatedDesc + case "leastupdate": + return SortByUpdatedAsc + case "mostcomment": + return SortByCommentsDesc + case "leastcomment": + return SortByCommentsAsc + case "nearduedate": + return SortByDeadlineAsc + case "farduedate": + return SortByDeadlineDesc + default: + return defaultSortBy + } +} + // SearchIssues search issues by options. func SearchIssues(ctx context.Context, opts *SearchOptions) ([]int64, int64, error) { indexer := *globalIndexer.Load() diff --git a/modules/indexer/issues/indexer_test.go b/modules/indexer/issues/indexer_test.go index a010218b72..d3b3494672 100644 --- a/modules/indexer/issues/indexer_test.go +++ b/modules/indexer/issues/indexer_test.go @@ -4,19 +4,19 @@ package issues import ( - "context" "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/indexer/issues/internal" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/db" + "forgejo.org/models/issues" + "forgejo.org/models/unittest" + "forgejo.org/modules/indexer/issues/internal" + "forgejo.org/modules/optional" + "forgejo.org/modules/setting" - _ "code.gitea.io/gitea/models" - _ "code.gitea.io/gitea/models/actions" - _ "code.gitea.io/gitea/models/activities" + _ "forgejo.org/models" + _ "forgejo.org/models/actions" + _ "forgejo.org/models/activities" + _ "forgejo.org/models/forgefed" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -81,7 +81,7 @@ func searchIssueWithKeyword(t *testing.T) { } for _, test := range tests { - issueIDs, _, err := SearchIssues(context.TODO(), &test.opts) + issueIDs, _, err := SearchIssues(t.Context(), &test.opts) require.NoError(t, err) assert.Equal(t, test.expectedIDs, issueIDs) @@ -126,7 +126,7 @@ func searchIssueInRepo(t *testing.T) { } for _, test := range tests { - issueIDs, _, err := SearchIssues(context.TODO(), &test.opts) + issueIDs, _, err := SearchIssues(t.Context(), &test.opts) require.NoError(t, err) assert.Equal(t, test.expectedIDs, issueIDs) @@ -197,7 +197,7 @@ func searchIssueByID(t *testing.T) { } for _, test := range tests { - issueIDs, _, err := SearchIssues(context.TODO(), &test.opts) + issueIDs, _, err := SearchIssues(t.Context(), &test.opts) require.NoError(t, err) assert.Equal(t, test.expectedIDs, issueIDs) } @@ -222,7 +222,7 @@ func searchIssueIsPull(t *testing.T) { }, } for _, test := range tests { - issueIDs, _, err := SearchIssues(context.TODO(), &test.opts) + issueIDs, _, err := SearchIssues(t.Context(), &test.opts) require.NoError(t, err) assert.Equal(t, test.expectedIDs, issueIDs) @@ -248,7 +248,7 @@ func searchIssueIsClosed(t *testing.T) { }, } for _, test := range tests { - issueIDs, _, err := SearchIssues(context.TODO(), &test.opts) + issueIDs, _, err := SearchIssues(t.Context(), &test.opts) require.NoError(t, err) assert.Equal(t, test.expectedIDs, issueIDs) } @@ -273,7 +273,7 @@ func searchIssueByMilestoneID(t *testing.T) { }, } for _, test := range tests { - issueIDs, _, err := SearchIssues(context.TODO(), &test.opts) + issueIDs, _, err := SearchIssues(t.Context(), &test.opts) require.NoError(t, err) assert.Equal(t, test.expectedIDs, issueIDs) @@ -305,7 +305,7 @@ func searchIssueByLabelID(t *testing.T) { }, } for _, test := range tests { - issueIDs, _, err := SearchIssues(context.TODO(), &test.opts) + issueIDs, _, err := SearchIssues(t.Context(), &test.opts) require.NoError(t, err) assert.Equal(t, test.expectedIDs, issueIDs) @@ -325,7 +325,7 @@ func searchIssueByTime(t *testing.T) { }, } for _, test := range tests { - issueIDs, _, err := SearchIssues(context.TODO(), &test.opts) + issueIDs, _, err := SearchIssues(t.Context(), &test.opts) require.NoError(t, err) assert.Equal(t, test.expectedIDs, issueIDs) @@ -345,7 +345,7 @@ func searchIssueWithOrder(t *testing.T) { }, } for _, test := range tests { - issueIDs, _, err := SearchIssues(context.TODO(), &test.opts) + issueIDs, _, err := SearchIssues(t.Context(), &test.opts) require.NoError(t, err) assert.Equal(t, test.expectedIDs, issueIDs) @@ -377,7 +377,7 @@ func searchIssueInProject(t *testing.T) { }, } for _, test := range tests { - issueIDs, _, err := SearchIssues(context.TODO(), &test.opts) + issueIDs, _, err := SearchIssues(t.Context(), &test.opts) require.NoError(t, err) assert.Equal(t, test.expectedIDs, issueIDs) @@ -401,7 +401,7 @@ func searchIssueWithPaginator(t *testing.T) { }, } for _, test := range tests { - issueIDs, total, err := SearchIssues(context.TODO(), &test.opts) + issueIDs, total, err := SearchIssues(t.Context(), &test.opts) require.NoError(t, err) assert.Equal(t, test.expectedIDs, issueIDs) diff --git a/modules/indexer/issues/internal/indexer.go b/modules/indexer/issues/internal/indexer.go index 95740bc598..2f3b4029dc 100644 --- a/modules/indexer/issues/internal/indexer.go +++ b/modules/indexer/issues/internal/indexer.go @@ -7,7 +7,7 @@ import ( "context" "fmt" - "code.gitea.io/gitea/modules/indexer/internal" + "forgejo.org/modules/indexer/internal" ) // Indexer defines an interface to indexer issues contents diff --git a/modules/indexer/issues/internal/model.go b/modules/indexer/issues/internal/model.go index 2dfee8b72e..03f5595a5b 100644 --- a/modules/indexer/issues/internal/model.go +++ b/modules/indexer/issues/internal/model.go @@ -4,9 +4,9 @@ package internal import ( - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/modules/optional" + "forgejo.org/modules/timeutil" ) // IndexerData data stored in the issue indexer @@ -74,8 +74,6 @@ type SearchResult struct { type SearchOptions struct { Keyword string // keyword to search - IsFuzzyKeyword bool // if false the levenshtein distance is 0 - RepoIDs []int64 // repository IDs which the issues belong to AllPublic bool // if include all public repositories @@ -127,6 +125,7 @@ func (o *SearchOptions) Copy(edit ...func(options *SearchOptions)) *SearchOption type SortBy string const ( + SortByScore SortBy = "-_score" SortByCreatedDesc SortBy = "-created_unix" SortByUpdatedDesc SortBy = "-updated_unix" SortByCommentsDesc SortBy = "-comment_count" diff --git a/modules/indexer/issues/internal/qstring.go b/modules/indexer/issues/internal/qstring.go new file mode 100644 index 0000000000..fdb89b09e9 --- /dev/null +++ b/modules/indexer/issues/internal/qstring.go @@ -0,0 +1,112 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package internal + +import ( + "io" + "strings" +) + +type BoolOpt int + +const ( + BoolOptMust BoolOpt = iota + BoolOptShould + BoolOptNot +) + +type Token struct { + Term string + Kind BoolOpt + Fuzzy bool +} + +type Tokenizer struct { + in *strings.Reader +} + +func (t *Tokenizer) next() (tk Token, err error) { + var ( + sb strings.Builder + r rune + ) + tk.Kind = BoolOptShould + tk.Fuzzy = true + + // skip all leading white space + for { + if r, _, err = t.in.ReadRune(); err == nil && r == ' ' { + //nolint:staticcheck,wastedassign // SA4006 the variable is used after the loop + r, _, err = t.in.ReadRune() + continue + } + break + } + if err != nil { + return tk, err + } + + // check for +/- op, increment to the next rune in both cases + switch r { + case '+': + tk.Kind = BoolOptMust + r, _, err = t.in.ReadRune() + case '-': + tk.Kind = BoolOptNot + r, _, err = t.in.ReadRune() + } + if err != nil { + return tk, err + } + + // parse the string, escaping special characters + for esc := false; err == nil; r, _, err = t.in.ReadRune() { + if esc { + if !strings.ContainsRune("+-\\\"", r) { + sb.WriteRune('\\') + } + sb.WriteRune(r) + esc = false + continue + } + switch r { + case '\\': + esc = true + case '"': + if !tk.Fuzzy { + goto nextEnd + } + tk.Fuzzy = false + case ' ', '\t': + if tk.Fuzzy { + goto nextEnd + } + sb.WriteRune(r) + default: + sb.WriteRune(r) + } + } +nextEnd: + + tk.Term = sb.String() + if err == io.EOF { + err = nil + } // do not consider EOF as an error at the end + return tk, err +} + +// Tokenize the keyword +func (o *SearchOptions) Tokens() (tokens []Token, err error) { + in := strings.NewReader(o.Keyword) + it := Tokenizer{in: in} + + for token, err := it.next(); err == nil; token, err = it.next() { + tokens = append(tokens, token) + } + if err != nil && err != io.EOF { + return nil, err + } + + return tokens, nil +} diff --git a/modules/indexer/issues/internal/qstring_test.go b/modules/indexer/issues/internal/qstring_test.go new file mode 100644 index 0000000000..a911b86e2f --- /dev/null +++ b/modules/indexer/issues/internal/qstring_test.go @@ -0,0 +1,171 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package internal + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +type testIssueQueryStringOpt struct { + Keyword string + Results []Token +} + +var testOpts = []testIssueQueryStringOpt{ + { + Keyword: "Hello", + Results: []Token{ + { + Term: "Hello", + Fuzzy: true, + Kind: BoolOptShould, + }, + }, + }, + { + Keyword: "Hello World", + Results: []Token{ + { + Term: "Hello", + Fuzzy: true, + Kind: BoolOptShould, + }, + { + Term: "World", + Fuzzy: true, + Kind: BoolOptShould, + }, + }, + }, + { + Keyword: "+Hello +World", + Results: []Token{ + { + Term: "Hello", + Fuzzy: true, + Kind: BoolOptMust, + }, + { + Term: "World", + Fuzzy: true, + Kind: BoolOptMust, + }, + }, + }, + { + Keyword: "+Hello World", + Results: []Token{ + { + Term: "Hello", + Fuzzy: true, + Kind: BoolOptMust, + }, + { + Term: "World", + Fuzzy: true, + Kind: BoolOptShould, + }, + }, + }, + { + Keyword: "+Hello -World", + Results: []Token{ + { + Term: "Hello", + Fuzzy: true, + Kind: BoolOptMust, + }, + { + Term: "World", + Fuzzy: true, + Kind: BoolOptNot, + }, + }, + }, + { + Keyword: "\"Hello World\"", + Results: []Token{ + { + Term: "Hello World", + Fuzzy: false, + Kind: BoolOptShould, + }, + }, + }, + { + Keyword: "+\"Hello World\"", + Results: []Token{ + { + Term: "Hello World", + Fuzzy: false, + Kind: BoolOptMust, + }, + }, + }, + { + Keyword: "-\"Hello World\"", + Results: []Token{ + { + Term: "Hello World", + Fuzzy: false, + Kind: BoolOptNot, + }, + }, + }, + { + Keyword: "\"+Hello -World\"", + Results: []Token{ + { + Term: "+Hello -World", + Fuzzy: false, + Kind: BoolOptShould, + }, + }, + }, + { + Keyword: "\\+Hello", // \+Hello => +Hello + Results: []Token{ + { + Term: "+Hello", + Fuzzy: true, + Kind: BoolOptShould, + }, + }, + }, + { + Keyword: "\\\\Hello", // \\Hello => \Hello + Results: []Token{ + { + Term: "\\Hello", + Fuzzy: true, + Kind: BoolOptShould, + }, + }, + }, + { + Keyword: "\\\"Hello", // \"Hello => "Hello + Results: []Token{ + { + Term: "\"Hello", + Fuzzy: true, + Kind: BoolOptShould, + }, + }, + }, +} + +func TestIssueQueryString(t *testing.T) { + var opt SearchOptions + for _, res := range testOpts { + t.Run(opt.Keyword, func(t *testing.T) { + opt.Keyword = res.Keyword + tokens, err := opt.Tokens() + require.NoError(t, err) + assert.Equal(t, res.Results, tokens) + }) + } +} diff --git a/modules/indexer/issues/internal/tests/tests.go b/modules/indexer/issues/internal/tests/tests.go index a93b2913e9..8308cb7f60 100644 --- a/modules/indexer/issues/internal/tests/tests.go +++ b/modules/indexer/issues/internal/tests/tests.go @@ -14,20 +14,20 @@ import ( "testing" "time" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/indexer/issues/internal" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + "forgejo.org/modules/indexer/issues/internal" + "forgejo.org/modules/optional" + "forgejo.org/modules/timeutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestIndexer(t *testing.T, indexer internal.Indexer) { - _, err := indexer.Init(context.Background()) + _, err := indexer.Init(t.Context()) require.NoError(t, err) - require.NoError(t, indexer.Ping(context.Background())) + require.NoError(t, indexer.Ping(t.Context())) var ( ids []int64 @@ -39,32 +39,32 @@ func TestIndexer(t *testing.T, indexer internal.Indexer) { ids = append(ids, v.ID) data[v.ID] = v } - require.NoError(t, indexer.Index(context.Background(), d...)) + require.NoError(t, indexer.Index(t.Context(), d...)) require.NoError(t, waitData(indexer, int64(len(data)))) } defer func() { - require.NoError(t, indexer.Delete(context.Background(), ids...)) + require.NoError(t, indexer.Delete(t.Context(), ids...)) }() for _, c := range cases { t.Run(c.Name, func(t *testing.T) { if len(c.ExtraData) > 0 { - require.NoError(t, indexer.Index(context.Background(), c.ExtraData...)) + require.NoError(t, indexer.Index(t.Context(), c.ExtraData...)) for _, v := range c.ExtraData { data[v.ID] = v } require.NoError(t, waitData(indexer, int64(len(data)))) defer func() { for _, v := range c.ExtraData { - require.NoError(t, indexer.Delete(context.Background(), v.ID)) + require.NoError(t, indexer.Delete(t.Context(), v.ID)) delete(data, v.ID) } require.NoError(t, waitData(indexer, int64(len(data)))) }() } - result, err := indexer.Search(context.Background(), c.SearchOptions) + result, err := indexer.Search(t.Context(), c.SearchOptions) require.NoError(t, err) if c.Expected != nil { @@ -80,7 +80,7 @@ func TestIndexer(t *testing.T, indexer internal.Indexer) { // test counting c.SearchOptions.Paginator = &db.ListOptions{PageSize: 0} - countResult, err := indexer.Search(context.Background(), c.SearchOptions) + countResult, err := indexer.Search(t.Context(), c.SearchOptions) require.NoError(t, err) assert.Empty(t, countResult.Hits) assert.Equal(t, result.Total, countResult.Total) @@ -126,10 +126,25 @@ var cases = []*testIndexerCase{ }, SearchOptions: &internal.SearchOptions{ Keyword: "hello", + SortBy: internal.SortByCreatedDesc, }, ExpectedIDs: []int64{1002, 1001, 1000}, ExpectedTotal: 3, }, + { + Name: "Keyword Exclude", + ExtraData: []*internal.IndexerData{ + {ID: 1000, Title: "hi hello world"}, + {ID: 1001, Content: "hi hello world"}, + {ID: 1002, Comments: []string{"hello", "hello world"}}, + }, + SearchOptions: &internal.SearchOptions{ + Keyword: "hello world -hi", + SortBy: internal.SortByCreatedDesc, + }, + ExpectedIDs: []int64{1002}, + ExpectedTotal: 1, + }, { Name: "Keyword Fuzzy", ExtraData: []*internal.IndexerData{ @@ -138,8 +153,8 @@ var cases = []*testIndexerCase{ {ID: 1002, Comments: []string{"hi", "hello world"}}, }, SearchOptions: &internal.SearchOptions{ - Keyword: "hello world", - IsFuzzyKeyword: true, + Keyword: "hello world", + SortBy: internal.SortByCreatedDesc, }, ExpectedIDs: []int64{1002, 1001, 1000}, ExpectedTotal: 3, @@ -157,6 +172,7 @@ var cases = []*testIndexerCase{ }, SearchOptions: &internal.SearchOptions{ Keyword: "hello", + SortBy: internal.SortByCreatedDesc, RepoIDs: []int64{1, 4}, }, ExpectedIDs: []int64{1006, 1002, 1001}, @@ -175,6 +191,7 @@ var cases = []*testIndexerCase{ }, SearchOptions: &internal.SearchOptions{ Keyword: "hello", + SortBy: internal.SortByCreatedDesc, RepoIDs: []int64{1, 4}, AllPublic: true, }, @@ -597,6 +614,22 @@ var cases = []*testIndexerCase{ } }, }, + { + Name: "SortByScore", + SearchOptions: &internal.SearchOptions{ + Paginator: &db.ListOptionsAll, + SortBy: internal.SortByScore, + }, + Expected: func(t *testing.T, data map[int64]*internal.IndexerData, result *internal.SearchResult) { + assert.Equal(t, len(data), len(result.Hits)) + assert.Equal(t, len(data), int(result.Total)) + for i, v := range result.Hits { + if i < len(result.Hits)-1 { + assert.GreaterOrEqual(t, v.Score, result.Hits[i+1].Score) + } + } + }, + }, { Name: "SortByCreatedAsc", SearchOptions: &internal.SearchOptions{ diff --git a/modules/indexer/issues/meilisearch/meilisearch.go b/modules/indexer/issues/meilisearch/meilisearch.go index 7d18444e6c..17a8ba2452 100644 --- a/modules/indexer/issues/meilisearch/meilisearch.go +++ b/modules/indexer/issues/meilisearch/meilisearch.go @@ -10,9 +10,9 @@ import ( "strconv" "strings" - indexer_internal "code.gitea.io/gitea/modules/indexer/internal" - inner_meilisearch "code.gitea.io/gitea/modules/indexer/internal/meilisearch" - "code.gitea.io/gitea/modules/indexer/issues/internal" + indexer_internal "forgejo.org/modules/indexer/internal" + inner_meilisearch "forgejo.org/modules/indexer/internal/meilisearch" + "forgejo.org/modules/indexer/issues/internal" "github.com/meilisearch/meilisearch-go" ) @@ -208,12 +208,18 @@ func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) ( query.And(inner_meilisearch.NewFilterLte("updated_unix", options.UpdatedBeforeUnix.Value())) } - if options.SortBy == "" { - options.SortBy = internal.SortByCreatedAsc - } - sortBy := []string{ - parseSortBy(options.SortBy), - "id:desc", + var sortBy []string + switch options.SortBy { + // sort by relevancy (no explicit sorting) + case internal.SortByScore: + fallthrough + case "": + sortBy = []string{} + default: + sortBy = []string{ + parseSortBy(options.SortBy), + "id:desc", + } } skip, limit := indexer_internal.ParsePaginator(options.Paginator, maxTotalHits) @@ -226,20 +232,36 @@ func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) ( limit = 1 } - keyword := options.Keyword - if !options.IsFuzzyKeyword { - // to make it non fuzzy ("typo tolerance" in meilisearch terms), we have to quote the keyword(s) - // https://www.meilisearch.com/docs/reference/api/search#phrase-search - keyword = doubleQuoteKeyword(keyword) + var keywords []string + if options.Keyword != "" { + tokens, err := options.Tokens() + if err != nil { + return nil, err + } + for _, token := range tokens { + if !token.Fuzzy { + // to make it a phrase search, we have to quote the keyword(s) + // https://www.meilisearch.com/docs/reference/api/search#phrase-search + token.Term = doubleQuoteKeyword(token.Term) + } + + // internal.BoolOptShould (Default, requires no modifications) + // internal.BoolOptMust (Not supported by meilisearch) + if token.Kind == internal.BoolOptNot { + token.Term = "-" + token.Term + } + keywords = append(keywords, token.Term) + } } - searchRes, err := b.inner.Client.Index(b.inner.VersionedIndexName()).Search(keyword, &meilisearch.SearchRequest{ - Filter: query.Statement(), - Limit: int64(limit), - Offset: int64(skip), - Sort: sortBy, - MatchingStrategy: meilisearch.All, - }) + searchRes, err := b.inner.Client.Index(b.inner.VersionedIndexName()). + Search(strings.Join(keywords, " "), &meilisearch.SearchRequest{ + Filter: query.Statement(), + Limit: int64(limit), + Offset: int64(skip), + Sort: sortBy, + MatchingStrategy: meilisearch.All, + }) if err != nil { return nil, err } diff --git a/modules/indexer/issues/meilisearch/meilisearch_test.go b/modules/indexer/issues/meilisearch/meilisearch_test.go index 349102b762..01160a5240 100644 --- a/modules/indexer/issues/meilisearch/meilisearch_test.go +++ b/modules/indexer/issues/meilisearch/meilisearch_test.go @@ -10,8 +10,8 @@ import ( "testing" "time" - "code.gitea.io/gitea/modules/indexer/issues/internal" - "code.gitea.io/gitea/modules/indexer/issues/internal/tests" + "forgejo.org/modules/indexer/issues/internal" + "forgejo.org/modules/indexer/issues/internal/tests" "github.com/meilisearch/meilisearch-go" "github.com/stretchr/testify/assert" diff --git a/modules/indexer/issues/util.go b/modules/indexer/issues/util.go index e752ae6f24..3e6c8babe4 100644 --- a/modules/indexer/issues/util.go +++ b/modules/indexer/issues/util.go @@ -8,12 +8,12 @@ import ( "errors" "fmt" - "code.gitea.io/gitea/models/db" - issue_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/indexer/issues/internal" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/queue" + "forgejo.org/models/db" + issue_model "forgejo.org/models/issues" + "forgejo.org/modules/container" + "forgejo.org/modules/indexer/issues/internal" + "forgejo.org/modules/log" + "forgejo.org/modules/queue" ) // getIssueIndexerData returns the indexer data of an issue and a bool value indicating whether the issue exists. diff --git a/modules/indexer/stats/db.go b/modules/indexer/stats/db.go index 98a977c700..0d25192e3c 100644 --- a/modules/indexer/stats/db.go +++ b/modules/indexer/stats/db.go @@ -6,13 +6,13 @@ package stats import ( "fmt" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/gitrepo" - "code.gitea.io/gitea/modules/graceful" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/process" - "code.gitea.io/gitea/modules/setting" + repo_model "forgejo.org/models/repo" + "forgejo.org/modules/git" + "forgejo.org/modules/gitrepo" + "forgejo.org/modules/graceful" + "forgejo.org/modules/log" + "forgejo.org/modules/process" + "forgejo.org/modules/setting" ) // DBIndexer implements Indexer interface to use database's like search diff --git a/modules/indexer/stats/indexer.go b/modules/indexer/stats/indexer.go index 7ec89e2afb..482c4b2ab4 100644 --- a/modules/indexer/stats/indexer.go +++ b/modules/indexer/stats/indexer.go @@ -6,10 +6,10 @@ package stats import ( "context" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/modules/graceful" - "code.gitea.io/gitea/modules/log" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/modules/graceful" + "forgejo.org/modules/log" ) // Indexer defines an interface to index repository stats diff --git a/modules/indexer/stats/indexer_test.go b/modules/indexer/stats/indexer_test.go index 3ab2e58546..a5899d2506 100644 --- a/modules/indexer/stats/indexer_test.go +++ b/modules/indexer/stats/indexer_test.go @@ -4,19 +4,19 @@ package stats import ( - "context" "testing" "time" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/queue" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" + "forgejo.org/modules/queue" + "forgejo.org/modules/setting" - _ "code.gitea.io/gitea/models" - _ "code.gitea.io/gitea/models/actions" - _ "code.gitea.io/gitea/models/activities" + _ "forgejo.org/models" + _ "forgejo.org/models/actions" + _ "forgejo.org/models/activities" + _ "forgejo.org/models/forgefed" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -41,7 +41,7 @@ func TestRepoStatsIndex(t *testing.T) { err = UpdateRepoIndexer(repo) require.NoError(t, err) - require.NoError(t, queue.GetManager().FlushAll(context.Background(), 5*time.Second)) + require.NoError(t, queue.GetManager().FlushAll(t.Context(), 5*time.Second)) status, err := repo_model.GetIndexerStatus(db.DefaultContext, repo, repo_model.RepoIndexerTypeStats) require.NoError(t, err) diff --git a/modules/indexer/stats/queue.go b/modules/indexer/stats/queue.go index d002bd57cf..2403eb8dca 100644 --- a/modules/indexer/stats/queue.go +++ b/modules/indexer/stats/queue.go @@ -6,11 +6,11 @@ package stats import ( "fmt" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/modules/graceful" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/queue" - "code.gitea.io/gitea/modules/setting" + repo_model "forgejo.org/models/repo" + "forgejo.org/modules/graceful" + "forgejo.org/modules/log" + "forgejo.org/modules/queue" + "forgejo.org/modules/setting" ) // statsQueue represents a queue to handle repository stats updates diff --git a/modules/issue/template/template.go b/modules/issue/template/template.go index 967bed0261..8e07cbecd8 100644 --- a/modules/issue/template/template.go +++ b/modules/issue/template/template.go @@ -10,10 +10,10 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/modules/container" - api "code.gitea.io/gitea/modules/structs" + "forgejo.org/modules/container" + api "forgejo.org/modules/structs" - "gitea.com/go-chi/binding" + "code.forgejo.org/go-chi/binding" ) // Validate checks whether an IssueTemplate is considered valid, and returns the first error diff --git a/modules/issue/template/template_test.go b/modules/issue/template/template_test.go index 349dbeabb0..89e8924e95 100644 --- a/modules/issue/template/template_test.go +++ b/modules/issue/template/template_test.go @@ -7,8 +7,8 @@ import ( "net/url" "testing" - "code.gitea.io/gitea/modules/json" - api "code.gitea.io/gitea/modules/structs" + "forgejo.org/modules/json" + api "forgejo.org/modules/structs" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/issue/template/unmarshal.go b/modules/issue/template/unmarshal.go index 0fc13d7ddf..8df71a3299 100644 --- a/modules/issue/template/unmarshal.go +++ b/modules/issue/template/unmarshal.go @@ -9,11 +9,11 @@ import ( "path" "strconv" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/markup/markdown" - "code.gitea.io/gitea/modules/setting" - api "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/git" + "forgejo.org/modules/markup/markdown" + "forgejo.org/modules/setting" + api "forgejo.org/modules/structs" + "forgejo.org/modules/util" "gopkg.in/yaml.v3" ) diff --git a/modules/keying/keying.go b/modules/keying/keying.go index 7c595c7f92..30c664180c 100644 --- a/modules/keying/keying.go +++ b/modules/keying/keying.go @@ -1,8 +1,8 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -// Keying is a module that allows for subkeys to be determistically generated -// from the same master key. It allows for domain seperation to take place by +// Keying is a module that allows for subkeys to be deterministically generated +// from the same master key. It allows for domain separation to take place by // using new keys for new subsystems/domains. These subkeys are provided with // an API to encrypt and decrypt data. The module panics if a bad interaction // happened, the panic should be seen as an non-recoverable error. @@ -16,50 +16,58 @@ package keying import ( + "crypto/hkdf" "crypto/rand" "crypto/sha256" "encoding/binary" "golang.org/x/crypto/chacha20poly1305" - "golang.org/x/crypto/hkdf" ) var ( // The hash used for HKDF. hash = sha256.New // The AEAD used for encryption/decryption. - aead = chacha20poly1305.NewX - aeadKeySize = chacha20poly1305.KeySize - aeadNonceSize = chacha20poly1305.NonceSizeX + aead = chacha20poly1305.NewX // The pseudorandom key generated by HKDF-Extract. prk []byte ) +const ( + aeadKeySize = chacha20poly1305.KeySize + aeadNonceSize = chacha20poly1305.NonceSizeX +) + // Set the main IKM for this module. func Init(ikm []byte) { // Salt is intentionally left empty, it's not useful to Forgejo's use case. - prk = hkdf.Extract(hash, ikm, nil) + var err error + prk, err = hkdf.Extract(hash, ikm, nil) + if err != nil { + panic(err) + } } // Specifies the context for which a subkey should be derived for. // This must be a hardcoded string and must not be arbitrarily constructed. type Context string -// Used for the `push_mirror` table. -var ContextPushMirror Context = "pushmirror" +var ( + // Used for the `push_mirror` table. + ContextPushMirror Context = "pushmirror" + // Used for the `two_factor` table. + ContextTOTP Context = "totp" +) -// Derive *the* key for a given context, this is a determistic function. The -// same key will be provided for the same context. +// Derive *the* key for a given context, this is a deterministic function. +// The same key will be provided for the same context. func DeriveKey(context Context) *Key { - if len(prk) == 0 { + if len(prk) != sha256.Size { panic("keying: not initialized") } - r := hkdf.Expand(hash, prk, []byte(context)) - - key := make([]byte, aeadKeySize) - // This should never return an error, but if it does, panic. - if _, err := r.Read(key); err != nil { + key, err := hkdf.Expand(hash, prk, string(context), aeadKeySize) + if err != nil { panic(err) } @@ -73,7 +81,7 @@ type Key struct { // Encrypts the specified plaintext with some additional data that is tied to // this plaintext. The additional data can be seen as the context in which the // data is being encrypted for, this is different than the context for which the -// key was derrived this allows for more granuality without deriving new keys. +// key was derived; this allows for more granularity without deriving new keys. // Avoid any user-generated data to be passed into the additional data. The most // common usage of this would be to encrypt a database field, in that case use // the ID and database column name as additional data. The additional data isn't @@ -88,7 +96,7 @@ func (k *Key) Encrypt(plaintext, additionalData []byte) []byte { // Generate a random nonce. nonce := make([]byte, aeadNonceSize) - if _, err := rand.Read(nonce); err != nil { + if n, err := rand.Read(nonce); err != nil || n != aeadNonceSize { panic(err) } diff --git a/modules/keying/keying_test.go b/modules/keying/keying_test.go index 8a6e8d5ab4..87dce0a566 100644 --- a/modules/keying/keying_test.go +++ b/modules/keying/keying_test.go @@ -7,7 +7,7 @@ import ( "math" "testing" - "code.gitea.io/gitea/modules/keying" + "forgejo.org/modules/keying" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -15,7 +15,7 @@ import ( ) func TestKeying(t *testing.T) { - t.Run("Not initalized", func(t *testing.T) { + t.Run("Not initialized", func(t *testing.T) { assert.Panics(t, func() { keying.DeriveKey(keying.Context("TESTING")) }) @@ -25,7 +25,7 @@ func TestKeying(t *testing.T) { keying.Init([]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}) }) - t.Run("Context seperation", func(t *testing.T) { + t.Run("Context separation", func(t *testing.T) { key1 := keying.DeriveKey(keying.Context("TESTING")) key2 := keying.DeriveKey(keying.Context("TESTING2")) @@ -49,20 +49,20 @@ func TestKeying(t *testing.T) { cipherText = key.Encrypt(plainText, []byte{0x05, 0x06}) cipherText2 := key.Encrypt(plainText, []byte{0x05, 0x06}) - // Ensure ciphertexts don't have an determistic output. + // Ensure ciphertexts don't have an deterministic output. assert.NotEqualValues(t, cipherText, cipherText2) }) t.Run("Decrypt", func(t *testing.T) { key := keying.DeriveKey(context) - t.Run("Succesful", func(t *testing.T) { + t.Run("Successful", func(t *testing.T) { convertedPlainText, err := key.Decrypt(cipherText, []byte{0x05, 0x06}) require.NoError(t, err) assert.EqualValues(t, plainText, convertedPlainText) }) - t.Run("Not enougn additional data", func(t *testing.T) { + t.Run("Not enough additional data", func(t *testing.T) { plainText, err := key.Decrypt(cipherText, []byte{0x05}) require.Error(t, err) assert.Empty(t, plainText) diff --git a/modules/label/parser.go b/modules/label/parser.go index 511bac823f..558ae68def 100644 --- a/modules/label/parser.go +++ b/modules/label/parser.go @@ -8,7 +8,7 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/modules/options" + "forgejo.org/modules/options" "gopkg.in/yaml.v3" ) diff --git a/modules/lfs/content_store.go b/modules/lfs/content_store.go index 0d9c0c98ac..ba23cec2be 100644 --- a/modules/lfs/content_store.go +++ b/modules/lfs/content_store.go @@ -11,8 +11,8 @@ import ( "io" "os" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/storage" + "forgejo.org/modules/log" + "forgejo.org/modules/storage" ) var ( diff --git a/modules/lfs/endpoint.go b/modules/lfs/endpoint.go index 97bd7d4446..b8df4be3ee 100644 --- a/modules/lfs/endpoint.go +++ b/modules/lfs/endpoint.go @@ -10,8 +10,8 @@ import ( "path/filepath" "strings" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/util" ) // DetermineEndpoint determines an endpoint from the clone url or uses the specified LFS url. diff --git a/modules/lfs/filesystem_client.go b/modules/lfs/filesystem_client.go index 71bef5c899..164dfa0011 100644 --- a/modules/lfs/filesystem_client.go +++ b/modules/lfs/filesystem_client.go @@ -10,7 +10,7 @@ import ( "os" "path/filepath" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/util" ) // FilesystemClient is used to read LFS data from a filesystem path diff --git a/modules/lfs/http_client.go b/modules/lfs/http_client.go index 4859fe61e1..e531e2c1fe 100644 --- a/modules/lfs/http_client.go +++ b/modules/lfs/http_client.go @@ -13,12 +13,13 @@ import ( "net/url" "strings" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/proxy" -) + "forgejo.org/modules/json" + "forgejo.org/modules/log" + "forgejo.org/modules/proxy" + "forgejo.org/modules/setting" -const httpBatchSize = 20 + "golang.org/x/sync/errgroup" +) // HTTPClient is used to communicate with the LFS server // https://github.com/git-lfs/git-lfs/blob/main/docs/api/batch.md @@ -30,7 +31,7 @@ type HTTPClient struct { // BatchSize returns the preferred size of batchs to process func (c *HTTPClient) BatchSize() int { - return httpBatchSize + return setting.LFSClient.BatchSize } func newHTTPClient(endpoint *url.URL, httpTransport *http.Transport) *HTTPClient { @@ -71,7 +72,14 @@ func (c *HTTPClient) batch(ctx context.Context, operation string, objects []Poin url := fmt.Sprintf("%s/objects/batch", c.endpoint) + // Original: In some lfs server implementations, they require the ref attribute. #32838 + // `ref` is an "optional object describing the server ref that the objects belong to" + // but some (incorrect) lfs servers like aliyun require it, so maybe adding an empty ref here doesn't break the correct ones. + // https://github.com/git-lfs/git-lfs/blob/a32a02b44bf8a511aa14f047627c49e1a7fd5021/docs/api/batch.md?plain=1#L37 + // + // UPDATE: it can't use "empty ref" here because it breaks others like https://github.com/go-gitea/gitea/issues/33453 request := &BatchRequest{operation, c.transferNames(), nil, objects} + payload := new(bytes.Buffer) err := json.NewEncoder(payload).Encode(request) if err != nil { @@ -114,6 +122,7 @@ func (c *HTTPClient) Upload(ctx context.Context, objects []Pointer, callback Upl return c.performOperation(ctx, objects, nil, callback) } +// performOperation takes a slice of LFS object pointers, batches them, and performs the upload/download operations concurrently in each batch func (c *HTTPClient) performOperation(ctx context.Context, objects []Pointer, dc DownloadCallback, uc UploadCallback) error { if len(objects) == 0 { return nil @@ -134,71 +143,90 @@ func (c *HTTPClient) performOperation(ctx context.Context, objects []Pointer, dc return fmt.Errorf("TransferAdapter not found: %s", result.Transfer) } + if setting.LFSClient.BatchOperationConcurrency <= 0 { + panic("BatchOperationConcurrency must be greater than 0, forgot to init?") + } + errGroup, groupCtx := errgroup.WithContext(ctx) + errGroup.SetLimit(setting.LFSClient.BatchOperationConcurrency) for _, object := range result.Objects { - if object.Error != nil { - log.Trace("Error on object %v: %v", object.Pointer, object.Error) - if uc != nil { - if _, err := uc(object.Pointer, object.Error); err != nil { - return err - } - } else { - if err := dc(object.Pointer, nil, object.Error); err != nil { - return err - } - } - continue - } - - if uc != nil { - if len(object.Actions) == 0 { - log.Trace("%v already present on server", object.Pointer) - continue - } - - link, ok := object.Actions["upload"] - if !ok { - log.Debug("%+v", object) - return errors.New("missing action 'upload'") - } - - content, err := uc(object.Pointer, nil) - if err != nil { - return err - } - - err = transferAdapter.Upload(ctx, link, object.Pointer, content) - if err != nil { - return err - } - - link, ok = object.Actions["verify"] - if ok { - if err := transferAdapter.Verify(ctx, link, object.Pointer); err != nil { - return err - } - } - } else { - link, ok := object.Actions["download"] - if !ok { - // no actions block in response, try legacy response schema - link, ok = object.Links["download"] - } - if !ok { - log.Debug("%+v", object) - return errors.New("missing action 'download'") - } - - content, err := transferAdapter.Download(ctx, link) - if err != nil { - return err - } - - if err := dc(object.Pointer, content, nil); err != nil { - return err - } - } + errGroup.Go(func() error { + return performSingleOperation(groupCtx, object, dc, uc, transferAdapter) + }) } + // only the first error is returned, preserving legacy behavior before concurrency + return errGroup.Wait() +} + +// performSingleOperation performs an LFS upload or download operation on a single object +func performSingleOperation(ctx context.Context, object *ObjectResponse, dc DownloadCallback, uc UploadCallback, transferAdapter TransferAdapter) error { + // the response from a lfs batch api request for this specific object id contained an error + if object.Error != nil { + log.Trace("Error on object %v: %v", object.Pointer, object.Error) + + // this was an 'upload' request inside the batch request + if uc != nil { + if _, err := uc(object.Pointer, object.Error); err != nil { + return err + } + } else { + // this was NOT an 'upload' request inside the batch request, meaning it must be a 'download' request + if err := dc(object.Pointer, nil, object.Error); err != nil { + return err + } + } + // if the callback returns no err, then the error could be ignored, and the operations should continue + return nil + } + + // the response from an lfs batch api request contained necessary upload/download fields to act upon + if uc != nil { + if len(object.Actions) == 0 { + log.Trace("%v already present on server", object.Pointer) + return nil + } + + link, ok := object.Actions["upload"] + if !ok { + return errors.New("missing action 'upload'") + } + + content, err := uc(object.Pointer, nil) + if err != nil { + return err + } + + err = transferAdapter.Upload(ctx, link, object.Pointer, content) + if err != nil { + return err + } + + link, ok = object.Actions["verify"] + if ok { + if err := transferAdapter.Verify(ctx, link, object.Pointer); err != nil { + return err + } + } + } else { + link, ok := object.Actions["download"] + if !ok { + // no actions block in response, try legacy response schema + link, ok = object.Links["download"] + } + if !ok { + log.Debug("%+v", object) + return errors.New("missing action 'download'") + } + + content, err := transferAdapter.Download(ctx, link) + if err != nil { + return err + } + + if err := dc(object.Pointer, content, nil); err != nil { + return err + } + } return nil } @@ -215,6 +243,7 @@ func createRequest(ctx context.Context, method, url string, headers map[string]s req.Header.Set(key, value) } req.Header.Set("Accept", AcceptHeader) + req.Header.Set("User-Agent", UserAgentHeader) return req, nil } diff --git a/modules/lfs/http_client_test.go b/modules/lfs/http_client_test.go index 534a445310..f825d95951 100644 --- a/modules/lfs/http_client_test.go +++ b/modules/lfs/http_client_test.go @@ -11,7 +11,9 @@ import ( "strings" "testing" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -184,93 +186,84 @@ func TestHTTPClientDownload(t *testing.T) { cases := []struct { endpoint string - expectederror string + expectedError string }{ - // case 0 { endpoint: "https://status-not-ok.io", - expectederror: io.ErrUnexpectedEOF.Error(), + expectedError: io.ErrUnexpectedEOF.Error(), }, - // case 1 { endpoint: "https://invalid-json-response.io", - expectederror: "invalid json", + expectedError: "invalid json", }, - // case 2 { endpoint: "https://valid-batch-request-download.io", - expectederror: "", + expectedError: "", }, - // case 3 { endpoint: "https://response-no-objects.io", - expectederror: "", + expectedError: "", }, - // case 4 { endpoint: "https://unknown-transfer-adapter.io", - expectederror: "TransferAdapter not found: ", + expectedError: "TransferAdapter not found: ", }, - // case 5 { endpoint: "https://error-in-response-objects.io", - expectederror: "Object not found", + expectedError: "Object not found", }, - // case 6 { endpoint: "https://empty-actions-map.io", - expectederror: "missing action 'download'", + expectedError: "missing action 'download'", }, - // case 7 { endpoint: "https://download-actions-map.io", - expectederror: "", + expectedError: "", }, - // case 8 { endpoint: "https://upload-actions-map.io", - expectederror: "missing action 'download'", + expectedError: "missing action 'download'", }, - // case 9 { endpoint: "https://verify-actions-map.io", - expectederror: "missing action 'download'", + expectedError: "missing action 'download'", }, - // case 10 { endpoint: "https://unknown-actions-map.io", - expectederror: "missing action 'download'", + expectedError: "missing action 'download'", }, - // case 11 { endpoint: "https://legacy-batch-request-download.io", - expectederror: "", + expectedError: "", }, } - for n, c := range cases { - client := &HTTPClient{ - client: hc, - endpoint: c.endpoint, - transfers: map[string]TransferAdapter{ - "dummy": dummy, - }, - } - - err := client.Download(context.Background(), []Pointer{p}, func(p Pointer, content io.ReadCloser, objectError error) error { - if objectError != nil { - return objectError + defer test.MockVariableValue(&setting.LFSClient.BatchOperationConcurrency, 8)() + for _, c := range cases { + t.Run(c.endpoint, func(t *testing.T) { + client := &HTTPClient{ + client: hc, + endpoint: c.endpoint, + transfers: map[string]TransferAdapter{ + "dummy": dummy, + }, + } + + err := client.Download(t.Context(), []Pointer{p}, func(p Pointer, content io.ReadCloser, objectError error) error { + if objectError != nil { + return objectError + } + b, err := io.ReadAll(content) + require.NoError(t, err) + assert.Equal(t, []byte("dummy"), b) + return nil + }) + if c.expectedError != "" { + assert.ErrorContains(t, err, c.expectedError) + } else { + require.NoError(t, err) } - b, err := io.ReadAll(content) - require.NoError(t, err) - assert.Equal(t, []byte("dummy"), b) - return nil }) - if len(c.expectederror) > 0 { - assert.True(t, strings.Contains(err.Error(), c.expectederror), "case %d: '%s' should contain '%s'", n, err.Error(), c.expectederror) - } else { - require.NoError(t, err, "case %d", n) - } } } @@ -297,81 +290,73 @@ func TestHTTPClientUpload(t *testing.T) { cases := []struct { endpoint string - expectederror string + expectedError string }{ - // case 0 { endpoint: "https://status-not-ok.io", - expectederror: io.ErrUnexpectedEOF.Error(), + expectedError: io.ErrUnexpectedEOF.Error(), }, - // case 1 { endpoint: "https://invalid-json-response.io", - expectederror: "invalid json", + expectedError: "invalid json", }, - // case 2 { endpoint: "https://valid-batch-request-upload.io", - expectederror: "", + expectedError: "", }, - // case 3 { endpoint: "https://response-no-objects.io", - expectederror: "", + expectedError: "", }, - // case 4 { endpoint: "https://unknown-transfer-adapter.io", - expectederror: "TransferAdapter not found: ", + expectedError: "TransferAdapter not found: ", }, - // case 5 { endpoint: "https://error-in-response-objects.io", - expectederror: "Object not found", + expectedError: "Object not found", }, - // case 6 { endpoint: "https://empty-actions-map.io", - expectederror: "", + expectedError: "", }, - // case 7 { endpoint: "https://download-actions-map.io", - expectederror: "missing action 'upload'", + expectedError: "missing action 'upload'", }, - // case 8 { endpoint: "https://upload-actions-map.io", - expectederror: "", + expectedError: "", }, - // case 9 { endpoint: "https://verify-actions-map.io", - expectederror: "missing action 'upload'", + expectedError: "missing action 'upload'", }, - // case 10 { endpoint: "https://unknown-actions-map.io", - expectederror: "missing action 'upload'", + expectedError: "missing action 'upload'", }, } - for n, c := range cases { - client := &HTTPClient{ - client: hc, - endpoint: c.endpoint, - transfers: map[string]TransferAdapter{ - "dummy": dummy, - }, - } + defer test.MockVariableValue(&setting.LFSClient.BatchOperationConcurrency, 8)() + for _, c := range cases { + t.Run(c.endpoint, func(t *testing.T) { + client := &HTTPClient{ + client: hc, + endpoint: c.endpoint, + transfers: map[string]TransferAdapter{ + "dummy": dummy, + }, + } - err := client.Upload(context.Background(), []Pointer{p}, func(p Pointer, objectError error) (io.ReadCloser, error) { - return io.NopCloser(new(bytes.Buffer)), objectError + err := client.Upload(t.Context(), []Pointer{p}, func(p Pointer, objectError error) (io.ReadCloser, error) { + return io.NopCloser(new(bytes.Buffer)), objectError + }) + if c.expectedError != "" { + assert.ErrorContains(t, err, c.expectedError) + } else { + require.NoError(t, err) + } }) - if len(c.expectederror) > 0 { - assert.True(t, strings.Contains(err.Error(), c.expectederror), "case %d: '%s' should contain '%s'", n, err.Error(), c.expectederror) - } else { - require.NoError(t, err, "case %d", n) - } } } diff --git a/modules/lfs/pointer_scanner.go b/modules/lfs/pointer_scanner.go index 8bbf7a8692..632ecd19ae 100644 --- a/modules/lfs/pointer_scanner.go +++ b/modules/lfs/pointer_scanner.go @@ -11,8 +11,8 @@ import ( "strings" "sync" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/git/pipeline" + "forgejo.org/modules/git" + "forgejo.org/modules/git/pipeline" ) // SearchPointerBlobs scans the whole repository for LFS pointer files diff --git a/modules/lfs/shared.go b/modules/lfs/shared.go index a4326b57b2..504a726bce 100644 --- a/modules/lfs/shared.go +++ b/modules/lfs/shared.go @@ -8,14 +8,18 @@ import ( "fmt" "time" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/util" ) const ( // MediaType contains the media type for LFS server requests MediaType = "application/vnd.git-lfs+json" - // Some LFS servers offer content with other types, so fallback to '*/*' if application/vnd.git-lfs+json cannot be served + // AcceptHeader Some LFS servers offer content with other types, so fallback to '*/*' if application/vnd.git-lfs+json cannot be served AcceptHeader = "application/vnd.git-lfs+json;q=0.9, */*;q=0.8" + // UserAgentHeader Add User-Agent for gitea's self-implemented lfs client, + // and the version is consistent with the latest version of git lfs can be avoided incompatibilities. + // Some lfs servers will check this + UserAgentHeader = "git-lfs/3.6.0 (Forgejo)" ) // BatchRequest contains multiple requests processed in one batch operation. diff --git a/modules/lfs/transferadapter.go b/modules/lfs/transferadapter.go index fbc3a3ad8c..98ac8b9a49 100644 --- a/modules/lfs/transferadapter.go +++ b/modules/lfs/transferadapter.go @@ -9,8 +9,8 @@ import ( "io" "net/http" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/json" + "forgejo.org/modules/log" ) // TransferAdapter represents an adapter for downloading/uploading LFS objects. diff --git a/modules/lfs/transferadapter_test.go b/modules/lfs/transferadapter_test.go index 0766e4a0a9..aa87d2e01a 100644 --- a/modules/lfs/transferadapter_test.go +++ b/modules/lfs/transferadapter_test.go @@ -5,13 +5,12 @@ package lfs import ( "bytes" - "context" "io" "net/http" "strings" "testing" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -95,9 +94,9 @@ func TestBasicTransferAdapter(t *testing.T) { } for n, c := range cases { - _, err := a.Download(context.Background(), c.link) + _, err := a.Download(t.Context(), c.link) if len(c.expectederror) > 0 { - assert.True(t, strings.Contains(err.Error(), c.expectederror), "case %d: '%s' should contain '%s'", n, err.Error(), c.expectederror) + assert.Contains(t, err.Error(), c.expectederror, "case %d: '%s' should contain '%s'", n, err.Error(), c.expectederror) } else { require.NoError(t, err, "case %d", n) } @@ -128,9 +127,9 @@ func TestBasicTransferAdapter(t *testing.T) { } for n, c := range cases { - err := a.Upload(context.Background(), c.link, p, bytes.NewBufferString("dummy")) + err := a.Upload(t.Context(), c.link, p, bytes.NewBufferString("dummy")) if len(c.expectederror) > 0 { - assert.True(t, strings.Contains(err.Error(), c.expectederror), "case %d: '%s' should contain '%s'", n, err.Error(), c.expectederror) + assert.Contains(t, err.Error(), c.expectederror, "case %d: '%s' should contain '%s'", n, err.Error(), c.expectederror) } else { require.NoError(t, err, "case %d", n) } @@ -161,9 +160,9 @@ func TestBasicTransferAdapter(t *testing.T) { } for n, c := range cases { - err := a.Verify(context.Background(), c.link, p) + err := a.Verify(t.Context(), c.link, p) if len(c.expectederror) > 0 { - assert.True(t, strings.Contains(err.Error(), c.expectederror), "case %d: '%s' should contain '%s'", n, err.Error(), c.expectederror) + assert.Contains(t, err.Error(), c.expectederror, "case %d: '%s' should contain '%s'", n, err.Error(), c.expectederror) } else { require.NoError(t, err, "case %d", n) } diff --git a/modules/locale/utils.go b/modules/locale/utils.go new file mode 100644 index 0000000000..726dc92adc --- /dev/null +++ b/modules/locale/utils.go @@ -0,0 +1,74 @@ +// Copyright 2023 The Gitea Authors. All rights reserved. +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +// extracted from `/build/lint-locale.go`, `/build/lint-locale-usage.go` + +package locale + +import ( + "encoding/json" //nolint:depguard + "fmt" + + "gopkg.in/ini.v1" //nolint:depguard +) + +func IterateMessagesContent(localeContent []byte, onMsgid func(string, string) error) error { + // Same configuration as Forgejo uses. + cfg := ini.Empty(ini.LoadOptions{ + IgnoreContinuation: true, + }) + cfg.NameMapper = ini.SnackCase + + if err := cfg.Append(localeContent); err != nil { + return err + } + + for _, section := range cfg.Sections() { + for _, key := range section.Keys() { + var trKey string + if section.Name() == "" || section.Name() == "DEFAULT" || section.Name() == "common" { + trKey = key.Name() + } else { + trKey = section.Name() + "." + key.Name() + } + if err := onMsgid(trKey, key.Value()); err != nil { + return err + } + } + } + + return nil +} + +func iterateMessagesNextInner(onMsgid func(string, string) error, data map[string]any, trKey ...string) error { + for key, value := range data { + currentKey := key + if len(trKey) == 1 { + currentKey = trKey[0] + "." + key + } + + switch value := value.(type) { + case string: + if err := onMsgid(currentKey, value); err != nil { + return err + } + case map[string]any: + if err := iterateMessagesNextInner(onMsgid, value, currentKey); err != nil { + return err + } + default: + return fmt.Errorf("unexpected type: %s - %T", currentKey, value) + } + } + + return nil +} + +func IterateMessagesNextContent(localeContent []byte, onMsgid func(string, string) error) error { + var localeData map[string]any + if err := json.Unmarshal(localeContent, &localeData); err != nil { + return err + } + return iterateMessagesNextInner(onMsgid, localeData) +} diff --git a/modules/log/color_console_other.go b/modules/log/color_console_other.go index c08b38c674..6573d093a5 100644 --- a/modules/log/color_console_other.go +++ b/modules/log/color_console_other.go @@ -1,8 +1,6 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -//go:build !windows - package log import ( diff --git a/modules/log/color_console_windows.go b/modules/log/color_console_windows.go deleted file mode 100644 index 3f59e934da..0000000000 --- a/modules/log/color_console_windows.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2019 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package log - -import ( - "os" - - "github.com/mattn/go-isatty" - "golang.org/x/sys/windows" -) - -func enableVTMode(console windows.Handle) bool { - mode := uint32(0) - err := windows.GetConsoleMode(console, &mode) - if err != nil { - return false - } - - // EnableVirtualTerminalProcessing is the console mode to allow ANSI code - // interpretation on the console. See: - // https://docs.microsoft.com/en-us/windows/console/setconsolemode - // It only works on Windows 10. Earlier terminals will fail with an err which we will - // handle to say don't color - mode |= windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING - err = windows.SetConsoleMode(console, mode) - return err == nil -} - -func init() { - if isatty.IsTerminal(os.Stdout.Fd()) { - CanColorStdout = enableVTMode(windows.Stdout) - } else { - CanColorStdout = isatty.IsCygwinTerminal(os.Stderr.Fd()) - } - - if isatty.IsTerminal(os.Stderr.Fd()) { - CanColorStderr = enableVTMode(windows.Stderr) - } else { - CanColorStderr = isatty.IsCygwinTerminal(os.Stderr.Fd()) - } -} diff --git a/modules/log/event_writer_buffer.go b/modules/log/event_writer_buffer.go new file mode 100644 index 0000000000..28857c2189 --- /dev/null +++ b/modules/log/event_writer_buffer.go @@ -0,0 +1,22 @@ +// Copyright 2025 The Forgejo Authors. +// SPDX-License-Identifier: GPL-3.0-or-later + +package log + +import ( + "bytes" +) + +type EventWriterBuffer struct { + *EventWriterBaseImpl + Buffer *bytes.Buffer +} + +var _ EventWriter = (*EventWriterBuffer)(nil) + +func NewEventWriterBuffer(name string, mode WriterMode) *EventWriterBuffer { + w := &EventWriterBuffer{EventWriterBaseImpl: NewEventWriterBase(name, "buffer", mode)} + w.Buffer = new(bytes.Buffer) + w.OutputWriteCloser = nopCloser{w.Buffer} + return w +} diff --git a/modules/log/event_writer_buffer_test.go b/modules/log/event_writer_buffer_test.go new file mode 100644 index 0000000000..ba9455ba69 --- /dev/null +++ b/modules/log/event_writer_buffer_test.go @@ -0,0 +1,33 @@ +// Copyright 2025 The Forgejo Authors. +// SPDX-License-Identifier: GPL-3.0-or-later + +package log_test + +import ( + "testing" + + "forgejo.org/modules/log" + + "github.com/stretchr/testify/assert" +) + +func TestBufferLogger(t *testing.T) { + prefix := "TestPrefix " + level := log.INFO + expected := "something" + + bufferWriter := log.NewEventWriterBuffer("test-buffer", log.WriterMode{ + Level: level, + Prefix: prefix, + Expression: expected, + }) + + logger := log.NewLoggerWithWriters(t.Context(), "test", bufferWriter) + + logger.SendLogEvent(&log.Event{ + Level: log.INFO, + MsgSimpleText: expected, + }) + logger.Close() + assert.Contains(t, bufferWriter.Buffer.String(), expected) +} diff --git a/modules/log/event_writer_conn_test.go b/modules/log/event_writer_conn_test.go index de8694f2c5..0cf447149a 100644 --- a/modules/log/event_writer_conn_test.go +++ b/modules/log/event_writer_conn_test.go @@ -4,7 +4,6 @@ package log import ( - "context" "fmt" "io" "net" @@ -41,7 +40,7 @@ func TestConnLogger(t *testing.T) { level := INFO flags := LstdFlags | LUTC | Lfuncname - logger := NewLoggerWithWriters(context.Background(), "test", NewEventWriterConn("test-conn", WriterMode{ + logger := NewLoggerWithWriters(t.Context(), "test", NewEventWriterConn("test-conn", WriterMode{ Level: level, Prefix: prefix, Flags: FlagsFromBits(flags), diff --git a/modules/log/event_writer_file.go b/modules/log/event_writer_file.go index fd73d7d30a..fd7189e2df 100644 --- a/modules/log/event_writer_file.go +++ b/modules/log/event_writer_file.go @@ -6,7 +6,7 @@ package log import ( "io" - "code.gitea.io/gitea/modules/util/rotatingfilewriter" + "forgejo.org/modules/util/rotatingfilewriter" ) type WriterFileOption struct { diff --git a/modules/log/flags.go b/modules/log/flags.go index cadf54fdd3..afce30680d 100644 --- a/modules/log/flags.go +++ b/modules/log/flags.go @@ -7,7 +7,7 @@ import ( "sort" "strings" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" ) // These flags define which text to prefix to each log entry generated diff --git a/modules/log/flags_test.go b/modules/log/flags_test.go index a101c42a78..1ee322c630 100644 --- a/modules/log/flags_test.go +++ b/modules/log/flags_test.go @@ -6,7 +6,7 @@ package log import ( "testing" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/log/groutinelabel.go b/modules/log/groutinelabel.go index 56d7af42da..cd5fb96d52 100644 --- a/modules/log/groutinelabel.go +++ b/modules/log/groutinelabel.go @@ -1,3 +1,5 @@ +//go:build !go1.24 + // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT diff --git a/modules/log/groutinelabel_go1.24.go b/modules/log/groutinelabel_go1.24.go new file mode 100644 index 0000000000..e849811bc2 --- /dev/null +++ b/modules/log/groutinelabel_go1.24.go @@ -0,0 +1,38 @@ +//go:build go1.24 + +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package log + +import "unsafe" + +//go:linkname runtime_getProfLabel runtime/pprof.runtime_getProfLabel +func runtime_getProfLabel() unsafe.Pointer //nolint + +// Struct definitions copied from: https://github.com/golang/go/blob/ca63101df47a4467bc80faa654fc19d68e583952/src/runtime/pprof/label.go +type label struct { + key string + value string +} + +type LabelSet struct { + list []label +} + +type labelMap struct { + LabelSet +} + +func getGoroutineLabels() map[string]string { + l := (*labelMap)(runtime_getProfLabel()) + if l == nil { + return nil + } + + m := make(map[string]string, len(l.list)) + for _, label := range l.list { + m[label.key] = label.value + } + return m +} diff --git a/modules/log/groutinelabel_test.go b/modules/log/groutinelabel_test.go index 34e99653d6..df8c1e9259 100644 --- a/modules/log/groutinelabel_test.go +++ b/modules/log/groutinelabel_test.go @@ -12,7 +12,7 @@ import ( ) func Test_getGoroutineLabels(t *testing.T) { - pprof.Do(context.Background(), pprof.Labels(), func(ctx context.Context) { + pprof.Do(t.Context(), pprof.Labels(), func(ctx context.Context) { currentLabels := getGoroutineLabels() pprof.ForLabels(ctx, func(key, value string) bool { assert.EqualValues(t, value, currentLabels[key]) diff --git a/modules/log/init.go b/modules/log/init.go index 3fb5200ad7..4c6b7b5f82 100644 --- a/modules/log/init.go +++ b/modules/log/init.go @@ -8,8 +8,8 @@ import ( "runtime" "strings" - "code.gitea.io/gitea/modules/process" - "code.gitea.io/gitea/modules/util/rotatingfilewriter" + "forgejo.org/modules/process" + "forgejo.org/modules/util/rotatingfilewriter" ) var projectPackagePrefix string diff --git a/modules/log/level.go b/modules/log/level.go index 47f7b83f0b..2ad1d67f1a 100644 --- a/modules/log/level.go +++ b/modules/log/level.go @@ -7,7 +7,7 @@ import ( "bytes" "strings" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" ) // Level is the level of the logger diff --git a/modules/log/level_test.go b/modules/log/level_test.go index 9831ca5650..e6cacc723b 100644 --- a/modules/log/level_test.go +++ b/modules/log/level_test.go @@ -7,7 +7,7 @@ import ( "fmt" "testing" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/log/logger_impl.go b/modules/log/logger_impl.go index d38c6516ed..b21e800f52 100644 --- a/modules/log/logger_impl.go +++ b/modules/log/logger_impl.go @@ -11,8 +11,8 @@ import ( "sync/atomic" "time" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/json" + "forgejo.org/modules/util" ) type LoggerImpl struct { @@ -191,7 +191,7 @@ func (l *LoggerImpl) Log(skip int, level Level, format string, logArgs ...any) { if ok { fn := runtime.FuncForPC(pc) if fn != nil { - event.Caller = fn.Name() + "()" + event.Caller = strings.TrimSuffix(fn.Name(), "[...]") + "()" } } event.Filename, event.Line = strings.TrimPrefix(filename, projectPackagePrefix), line diff --git a/modules/log/logger_impl_test.go b/modules/log/logger_impl_test.go new file mode 100644 index 0000000000..59276a83f4 --- /dev/null +++ b/modules/log/logger_impl_test.go @@ -0,0 +1,27 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package log + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func testGeneric[T any](log *LoggerImpl, t T) { + log.Log(0, INFO, "Just testing the logging of a generic function %v", t) +} + +func TestLog(t *testing.T) { + bufferWriter := NewEventWriterBuffer("test-buffer", WriterMode{ + Level: INFO, + }) + + logger := NewLoggerWithWriters(t.Context(), "test", bufferWriter) + + testGeneric(logger, "I'm the generic value!") + logger.Close() + + assert.Contains(t, bufferWriter.Buffer.String(), ".../logger_impl_test.go:13:testGeneric() [I] Just testing the logging of a generic function I'm the generic value!") +} diff --git a/modules/log/logger_test.go b/modules/log/logger_test.go index 0de14eb411..e04c9da8b0 100644 --- a/modules/log/logger_test.go +++ b/modules/log/logger_test.go @@ -4,7 +4,6 @@ package log import ( - "context" "sync" "testing" "time" @@ -53,7 +52,7 @@ func newDummyWriter(name string, level Level, delay time.Duration) *dummyWriter } func TestLogger(t *testing.T) { - logger := NewLoggerWithWriters(context.Background(), "test") + logger := NewLoggerWithWriters(t.Context(), "test") dump := logger.DumpWriters() assert.Empty(t, dump) @@ -88,7 +87,7 @@ func TestLogger(t *testing.T) { } func TestLoggerPause(t *testing.T) { - logger := NewLoggerWithWriters(context.Background(), "test") + logger := NewLoggerWithWriters(t.Context(), "test") w1 := newDummyWriter("dummy-1", DEBUG, 0) logger.AddWriters(w1) @@ -117,7 +116,7 @@ func (t testLogString) LogString() string { } func TestLoggerLogString(t *testing.T) { - logger := NewLoggerWithWriters(context.Background(), "test") + logger := NewLoggerWithWriters(t.Context(), "test") w1 := newDummyWriter("dummy-1", DEBUG, 0) w1.Mode.Colorize = true @@ -130,7 +129,7 @@ func TestLoggerLogString(t *testing.T) { } func TestLoggerExpressionFilter(t *testing.T) { - logger := NewLoggerWithWriters(context.Background(), "test") + logger := NewLoggerWithWriters(t.Context(), "test") w1 := newDummyWriter("dummy-1", DEBUG, 0) w1.Mode.Expression = "foo.*" diff --git a/modules/markup/asciicast/asciicast.go b/modules/markup/asciicast/asciicast.go index 0678062340..739a035977 100644 --- a/modules/markup/asciicast/asciicast.go +++ b/modules/markup/asciicast/asciicast.go @@ -9,8 +9,8 @@ import ( "net/url" "regexp" - "code.gitea.io/gitea/modules/markup" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/markup" + "forgejo.org/modules/setting" ) func init() { @@ -39,7 +39,7 @@ const ( // SanitizerRules implements markup.Renderer func (Renderer) SanitizerRules() []setting.MarkupSanitizerRule { return []setting.MarkupSanitizerRule{ - {Element: "div", AllowAttr: "class", Regexp: regexp.MustCompile(playerClassName)}, + {Element: "div", AllowAttr: "class", Regexp: regexp.MustCompile("^" + playerClassName + "$")}, {Element: "div", AllowAttr: playerSrcAttr}, } } diff --git a/modules/markup/camo.go b/modules/markup/camo.go index e93797de2b..8380f79280 100644 --- a/modules/markup/camo.go +++ b/modules/markup/camo.go @@ -10,8 +10,8 @@ import ( "net/url" "strings" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" ) // CamoEncode encodes a lnk to fit with the go-camo and camo proxy links. The purposes of camo-proxy are: @@ -38,7 +38,7 @@ func camoHandleLink(link string) string { if setting.Camo.Enabled { lnkURL, err := url.Parse(link) if err == nil && lnkURL.IsAbs() && !strings.HasPrefix(link, setting.AppURL) && - (setting.Camo.Allways || lnkURL.Scheme != "https") { + (setting.Camo.Always || lnkURL.Scheme != "https") { return CamoEncode(link) } } diff --git a/modules/markup/camo_test.go b/modules/markup/camo_test.go index ba58835221..d5600996c9 100644 --- a/modules/markup/camo_test.go +++ b/modules/markup/camo_test.go @@ -6,7 +6,7 @@ package markup import ( "testing" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" ) @@ -28,7 +28,7 @@ func TestCamoHandleLink(t *testing.T) { "https://image.proxy/eivin43gJwGVIjR9MiYYtFIk0mw/aHR0cDovL3Rlc3RpbWFnZXMub3JnL2ltZy5qcGc", camoHandleLink("http://testimages.org/img.jpg")) - setting.Camo.Allways = true + setting.Camo.Always = true assert.Equal(t, "https://gitea.com/img.jpg", camoHandleLink("https://gitea.com/img.jpg")) diff --git a/modules/markup/console/console.go b/modules/markup/console/console.go index f544ab218d..c61b6495d3 100644 --- a/modules/markup/console/console.go +++ b/modules/markup/console/console.go @@ -10,8 +10,8 @@ import ( "regexp" "strings" - "code.gitea.io/gitea/modules/markup" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/markup" + "forgejo.org/modules/setting" trend "github.com/buildkite/terminal-to-html/v3" "github.com/go-enry/go-enry/v2" diff --git a/modules/markup/console/console_test.go b/modules/markup/console/console_test.go index 0d4a2bbeb9..11e0a54e5d 100644 --- a/modules/markup/console/console_test.go +++ b/modules/markup/console/console_test.go @@ -7,8 +7,8 @@ import ( "strings" "testing" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/markup" + "forgejo.org/modules/git" + "forgejo.org/modules/markup" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/markup/csv/csv.go b/modules/markup/csv/csv.go index 3d952b0de4..6a05088ae1 100644 --- a/modules/markup/csv/csv.go +++ b/modules/markup/csv/csv.go @@ -10,11 +10,11 @@ import ( "regexp" "strconv" - "code.gitea.io/gitea/modules/csv" - "code.gitea.io/gitea/modules/markup" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/translation" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/csv" + "forgejo.org/modules/markup" + "forgejo.org/modules/setting" + "forgejo.org/modules/translation" + "forgejo.org/modules/util" ) func init() { @@ -37,9 +37,9 @@ func (Renderer) Extensions() []string { // SanitizerRules implements markup.Renderer func (Renderer) SanitizerRules() []setting.MarkupSanitizerRule { return []setting.MarkupSanitizerRule{ - {Element: "table", AllowAttr: "class", Regexp: regexp.MustCompile(`data-table`)}, - {Element: "th", AllowAttr: "class", Regexp: regexp.MustCompile(`line-num`)}, - {Element: "td", AllowAttr: "class", Regexp: regexp.MustCompile(`line-num`)}, + {Element: "table", AllowAttr: "class", Regexp: regexp.MustCompile(`^data-table$`)}, + {Element: "th", AllowAttr: "class", Regexp: regexp.MustCompile(`^line-num$`)}, + {Element: "td", AllowAttr: "class", Regexp: regexp.MustCompile(`^line-num$`)}, } } diff --git a/modules/markup/csv/csv_test.go b/modules/markup/csv/csv_test.go index 383f134155..008a899c05 100644 --- a/modules/markup/csv/csv_test.go +++ b/modules/markup/csv/csv_test.go @@ -7,8 +7,8 @@ import ( "strings" "testing" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/markup" + "forgejo.org/modules/git" + "forgejo.org/modules/markup" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/markup/external/external.go b/modules/markup/external/external.go index 122517ed11..950da6e828 100644 --- a/modules/markup/external/external.go +++ b/modules/markup/external/external.go @@ -9,15 +9,15 @@ import ( "io" "os" "os/exec" - "runtime" "strings" - "code.gitea.io/gitea/modules/graceful" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/markup" - "code.gitea.io/gitea/modules/process" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/annex" + "forgejo.org/modules/graceful" + "forgejo.org/modules/log" + "forgejo.org/modules/markup" + "forgejo.org/modules/process" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" ) // RegisterRenderers registers all supported third part renderers according settings @@ -70,9 +70,6 @@ func (p *Renderer) DisplayInIFrame() bool { } func envMark(envName string) string { - if runtime.GOOS == "windows" { - return "%" + envName + "%" - } return "$" + envName } @@ -86,8 +83,22 @@ func (p *Renderer) Render(ctx *markup.RenderContext, input io.Reader, output io. commands = strings.Fields(command) args = commands[1:] ) - - if p.IsInputFile { + isAnnexed, _ := annex.IsAnnexed(ctx.Blob) + // if a renderer wants to read a file, and we have annexed content, we can + // provide the annex key file location directly to the renderer. git-annex + // takes care of having that location be read-only, so no critical + // protection layer is needed. Moreover, the file readily exists, and + // expensive temporary files can be avoided, also allowing an operator + // to raise MAX_DISPLAY_FILE_SIZE without much negative impact. + if p.IsInputFile && isAnnexed { + // look for annexed content, will be empty, if there is none + annexContentLocation, _ := annex.ContentLocation(ctx.Blob) + // we call the renderer, even if there is no annex content present. + // showing the pointer file content is not much use, and a topical + // renderer might be able to produce something useful from the + // filename alone (present in ENV) + args = append(args, annexContentLocation) + } else if p.IsInputFile { // write to temp file f, err := os.CreateTemp("", "gitea_input") if err != nil { @@ -130,6 +141,12 @@ func (p *Renderer) Render(ctx *markup.RenderContext, input io.Reader, output io. os.Environ(), "GITEA_PREFIX_SRC="+ctx.Links.SrcLink(), "GITEA_PREFIX_RAW="+ctx.Links.RawLink(), + // also communicate the relative path of the to-be-rendered item. + // this enables the renderer to make use of the original file name + // and path, e.g., to make rendering or dtype-detection decisions + // that go beyond the originally matched extension. Even if the + // content is directly streamed to STDIN + "GITEA_RELATIVE_PATH="+ctx.RelativePath, ) if !p.IsInputFile { cmd.Stdin = input diff --git a/modules/markup/file_preview.go b/modules/markup/file_preview.go index 49a5f1e8ba..5499eff18c 100644 --- a/modules/markup/file_preview.go +++ b/modules/markup/file_preview.go @@ -8,16 +8,17 @@ import ( "bytes" "html/template" "io" + "net/url" "regexp" "slices" "strconv" "strings" - "code.gitea.io/gitea/modules/charset" - "code.gitea.io/gitea/modules/highlight" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/translation" + "forgejo.org/modules/charset" + "forgejo.org/modules/highlight" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/translation" "golang.org/x/net/html" "golang.org/x/net/html/atom" @@ -77,6 +78,16 @@ func newFilePreview(ctx *RenderContext, node *html.Node, locale translation.Loca commitSha := node.Data[m[4]:m[5]] filePath := node.Data[m[6]:m[7]] + urlFullSource := urlFull + if strings.HasSuffix(filePath, "?display=source") { + filePath = strings.TrimSuffix(filePath, "?display=source") + } else if Type(filePath) != "" { + urlFullSource = node.Data[m[0]:m[6]] + filePath + "?display=source#" + node.Data[m[8]:m[1]] + } + filePath, err := url.QueryUnescape(filePath) + if err != nil { + return nil + } hash := node.Data[m[8]:m[9]] preview.start = m[0] @@ -113,7 +124,7 @@ func newFilePreview(ctx *RenderContext, node *html.Node, locale translation.Loca titleBuffer.WriteString(" – ") } - err = html.Render(titleBuffer, createLink(urlFull, filePath, "muted")) + err = html.Render(titleBuffer, createLink(urlFullSource, filePath, "muted")) if err != nil { log.Error("failed to render filepathLink: %v", err) } diff --git a/modules/markup/html.go b/modules/markup/html.go index 2e65827bf7..e7be453ea3 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -1,4 +1,5 @@ // Copyright 2017 The Gitea Authors. All rights reserved. +// Copyright 2025 The Forgejo Authors. // SPDX-License-Identifier: MIT package markup @@ -13,17 +14,17 @@ import ( "strings" "sync" - "code.gitea.io/gitea/modules/base" - "code.gitea.io/gitea/modules/emoji" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/markup/common" - "code.gitea.io/gitea/modules/references" - "code.gitea.io/gitea/modules/regexplru" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/templates/vars" - "code.gitea.io/gitea/modules/translation" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/base" + "forgejo.org/modules/emoji" + "forgejo.org/modules/git" + "forgejo.org/modules/log" + "forgejo.org/modules/markup/common" + "forgejo.org/modules/references" + "forgejo.org/modules/regexplru" + "forgejo.org/modules/setting" + "forgejo.org/modules/templates/vars" + "forgejo.org/modules/translation" + "forgejo.org/modules/util" "golang.org/x/net/html" "golang.org/x/net/html/atom" @@ -48,13 +49,13 @@ var ( // hashCurrentPattern matches string that represents a commit SHA, e.g. d8a994ef243349f321568f9e36d5c3f444b99cae // Although SHA1 hashes are 40 chars long, SHA256 are 64, the regex matches the hash from 7 to 64 chars in length // so that abbreviated hash links can be used as well. This matches git and GitHub usability. - hashCurrentPattern = regexp.MustCompile(`(?:\s|^|\(|\[)([0-9a-f]{7,64})(?:\s|$|\)|\]|[.,:](\s|$))`) + hashCurrentPattern = regexp.MustCompile(`(?:^|\s)[^\w\d]{0,2}([0-9a-f]{7,64})[^\w\d]{0,2}(?:\s|$)`) // shortLinkPattern matches short but difficult to parse [[name|link|arg=test]] syntax shortLinkPattern = regexp.MustCompile(`\[\[(.*?)\]\](\w*)`) - // anySHA1Pattern splits url containing SHA into parts - anyHashPattern = regexp.MustCompile(`https?://(?:\S+/){4,5}([0-9a-f]{40,64})(/[-+~_%.a-zA-Z0-9/]+)?(\?[-+~_%\.a-zA-Z0-9=&]+)?(#[-+~_%.a-zA-Z0-9]+)?`) + // anyHashPattern splits url containing SHA into parts + anyHashPattern = regexp.MustCompile(`https?://(?:(?:\S+/){3,4}(?:commit|tree|blob)/)([0-9a-f]{7,64})(/[-+~_%.a-zA-Z0-9/]+)?(\?[-+~_%\.a-zA-Z0-9=&]+)?(#[-+~_%.a-zA-Z0-9]+)?`) // comparePattern matches "http://domain/org/repo/compare/COMMIT1...COMMIT2#hash" comparePattern = regexp.MustCompile(`https?://(?:\S+/){4,5}([0-9a-f]{7,64})(\.\.\.?)([0-9a-f]{7,64})?(#[-+~_%.a-zA-Z0-9]+)?`) @@ -472,7 +473,7 @@ func createInlineCode(content string) *html.Node { return code } -func createEmoji(content, class, name string) *html.Node { +func createEmoji(content, class, name, alias string) *html.Node { span := &html.Node{ Type: html.ElementNode, Data: atom.Span.String(), @@ -484,6 +485,9 @@ func createEmoji(content, class, name string) *html.Node { if name != "" { span.Attr = append(span.Attr, html.Attribute{Key: "aria-label", Val: name}) } + if alias != "" { + span.Attr = append(span.Attr, html.Attribute{Key: "data-alias", Val: alias}) + } text := &html.Node{ Type: html.TextNode, @@ -502,6 +506,7 @@ func createCustomEmoji(alias string) *html.Node { } span.Attr = append(span.Attr, html.Attribute{Key: "class", Val: "emoji"}) span.Attr = append(span.Attr, html.Attribute{Key: "aria-label", Val: alias}) + span.Attr = append(span.Attr, html.Attribute{Key: "data-alias", Val: alias}) img := &html.Node{ Type: html.ElementNode, @@ -755,9 +760,6 @@ func shortLinkProcessor(ctx *RenderContext, node *html.Node) { title = path.Base(name) } alt := props["alt"] - if alt == "" { - alt = name - } // make the childNode an image - if we can, we also place the alt childNode.Type = html.ElementNode @@ -768,9 +770,6 @@ func shortLinkProcessor(ctx *RenderContext, node *html.Node) { {Key: "title", Val: title}, {Key: "alt", Val: alt}, } - if alt == "" { - childNode.Attr = childNode.Attr[:2] - } } else { if !absoluteLink { if ctx.IsWiki { @@ -1147,7 +1146,7 @@ func emojiShortCodeProcessor(ctx *RenderContext, node *html.Node) { continue } - replaceContent(node, m[0], m[1], createEmoji(converted.Emoji, "emoji", converted.Description)) + replaceContent(node, m[0], m[1], createEmoji(converted.Emoji, "emoji", converted.Description, alias)) node = node.NextSibling.NextSibling start = 0 } @@ -1169,14 +1168,14 @@ func emojiProcessor(ctx *RenderContext, node *html.Node) { start = m[1] val := emoji.FromCode(codepoint) if val != nil { - replaceContent(node, m[0], m[1], createEmoji(codepoint, "emoji", val.Description)) + replaceContent(node, m[0], m[1], createEmoji(codepoint, "emoji", val.Description, val.Aliases[0])) node = node.NextSibling.NextSibling start = 0 } } } -// hashCurrentPatternProcessor renders SHA1 strings to corresponding links that +// hashCurrentPatternProcessor renders SHA1/SHA256 strings to corresponding links that // are assumed to be in the same repository. func hashCurrentPatternProcessor(ctx *RenderContext, node *html.Node) { if ctx.Metas == nil || ctx.Metas["user"] == "" || ctx.Metas["repo"] == "" || ctx.Metas["repoPath"] == "" { diff --git a/modules/markup/html_internal_test.go b/modules/markup/html_internal_test.go index a72be9f8cf..08b1fed505 100644 --- a/modules/markup/html_internal_test.go +++ b/modules/markup/html_internal_test.go @@ -1,4 +1,5 @@ // Copyright 2018 The Gitea Authors. All rights reserved. +// Copyright 2025 The Forgejo Authors. // SPDX-License-Identifier: MIT package markup @@ -9,9 +10,9 @@ import ( "strings" "testing" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/git" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -391,7 +392,7 @@ func TestRender_FullIssueURLs(t *testing.T) { `testOrg/testOrgRepo#2/commits`) } -func TestRegExp_sha1CurrentPattern(t *testing.T) { +func TestRegExp_hashCurrentPattern(t *testing.T) { trueTestCases := []string{ "d8a994ef243349f321568f9e36d5c3f444b99cae", "abcdefabcdefabcdefabcdefabcdefabcdefabcd", @@ -399,6 +400,13 @@ func TestRegExp_sha1CurrentPattern(t *testing.T) { "[abcdefabcdefabcdefabcdefabcdefabcdefabcd]", "abcdefabcdefabcdefabcdefabcdefabcdefabcd.", "abcdefabcdefabcdefabcdefabcdefabcdefabcd:", + "d8a994ef243349f321568f9e36d5c3f444b99cae12424fa123391042fbae2319", + "abcdefd?", + "abcdefd!", + "!abcd3ef", + ":abcd3ef", + ".abcd3ef", + " (abcd3ef). ", } falseTestCases := []string{ "test", @@ -406,6 +414,8 @@ func TestRegExp_sha1CurrentPattern(t *testing.T) { "e59ff077-2d03-4e6b-964d-63fbaea81f", "abcdefghijklmnopqrstuvwxyzabcdefghijklmn", "abcdefghijklmnopqrstuvwxyzabcdefghijklmO", + "commit/abcdefd", + "abcd3ef...defabcd", } for _, testCase := range trueTestCases { @@ -459,6 +469,10 @@ func TestRegExp_anySHA1Pattern(t *testing.T) { for k, v := range testCases { assert.Equal(t, anyHashPattern.FindStringSubmatch(k)[1:], v) } + + for _, v := range []string{"https://codeberg.org/forgejo/forgejo/attachments/774421a1-b0ae-4501-8fba-983874b76811"} { + assert.False(t, anyHashPattern.MatchString(v)) + } } func TestRegExp_shortLinkPattern(t *testing.T) { diff --git a/modules/markup/html_test.go b/modules/markup/html_test.go index 68d1ada5b3..d503796eb6 100644 --- a/modules/markup/html_test.go +++ b/modules/markup/html_test.go @@ -1,4 +1,5 @@ // Copyright 2017 The Gitea Authors. All rights reserved. +// Copyright 2025 The Forgejo Authors. // SPDX-License-Identifier: MIT package markup_test @@ -10,16 +11,16 @@ import ( "strings" "testing" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/emoji" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/markup" - "code.gitea.io/gitea/modules/markup/markdown" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/test" - "code.gitea.io/gitea/modules/translation" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/unittest" + "forgejo.org/modules/emoji" + "forgejo.org/modules/git" + "forgejo.org/modules/log" + "forgejo.org/modules/markup" + "forgejo.org/modules/markup/markdown" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" + "forgejo.org/modules/translation" + "forgejo.org/modules/util" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -329,42 +330,42 @@ func TestRender_emoji(t *testing.T) { for i := range emoji.GemojiData { test( emoji.GemojiData[i].Emoji, - `

    `+emoji.GemojiData[i].Emoji+`

    `) + `

    `+emoji.GemojiData[i].Emoji+`

    `) } for i := range emoji.GemojiData { test( ":"+emoji.GemojiData[i].Aliases[0]+":", - `

    `+emoji.GemojiData[i].Emoji+`

    `) + `

    `+emoji.GemojiData[i].Emoji+`

    `) } // Text that should be turned into or recognized as emoji test( ":gitea:", - `

    :gitea:

    `) + `

    :gitea:

    `) test( ":custom-emoji:", `

    :custom-emoji:

    `) setting.UI.CustomEmojisMap["custom-emoji"] = ":custom-emoji:" test( ":custom-emoji:", - `

    :custom-emoji:

    `) + `

    :custom-emoji:

    `) test( "这是字符:1::+1: some🊠\U0001f44d:custom-emoji: :gitea:", - `

    这是字符:1:👠some🊠`+ - `ðŸ‘:custom-emoji: `+ - `:gitea:

    `) + `

    这是字符:1:👠some🊠`+ + `ðŸ‘:custom-emoji: `+ + `:gitea:

    `) test( "Some text with 😄 in the middle", - `

    Some text with 😄 in the middle

    `) + `

    Some text with 😄 in the middle

    `) test( "Some text with :smile: in the middle", - `

    Some text with 😄 in the middle

    `) + `

    Some text with 😄 in the middle

    `) test( "Some text with 😄😄 2 emoji next to each other", - `

    Some text with 😄😄 2 emoji next to each other

    `) + `

    Some text with 😄😄 2 emoji next to each other

    `) test( "😎🤪ðŸ”🤑â“", - `

    😎🤪ðŸ”🤑â“

    `) + `

    😎🤪ðŸ”🤑â“

    `) // should match nothing test( @@ -416,7 +417,7 @@ func TestRender_ShortLinks(t *testing.T) { otherImgurlWiki := util.URLJoin(markup.TestRepoURL, "wiki", "raw", "Link+Other.jpg") encodedImgurlWiki := util.URLJoin(markup.TestRepoURL, "wiki", "raw", "Link+%23.jpg") notencodedImgurlWiki := util.URLJoin(markup.TestRepoURL, "wiki", "raw", "some", "path", "Link+#.jpg") - favicon := "http://google.com/favicon.ico" + favicon := "https://forgejo.org/favicon.ico" test( "[[Link]]", @@ -424,28 +425,28 @@ func TestRender_ShortLinks(t *testing.T) { `

    Link

    `) test( "[[Link.jpg]]", - `

    Link.jpg

    `, - `

    Link.jpg

    `) + `

    `, + `

    `) test( "[["+favicon+"]]", - `

    `+favicon+`

    `, - `

    `+favicon+`

    `) + `

    `, + `

    `) test( "[[Name|Link]]", `

    Name

    `, `

    Name

    `) test( "[[Name|Link.jpg]]", - `

    Name

    `, - `

    Name

    `) + `

    `, + `

    `) test( "[[Name|Link.jpg|alt=AltName]]", `

    AltName

    `, `

    AltName

    `) test( "[[Name|Link.jpg|title=Title]]", - `

    Title

    `, - `

    Title

    `) + `

    `, + `

    `) test( "[[Name|Link.jpg|alt=AltName|title=Title]]", `

    AltName

    `, @@ -472,16 +473,16 @@ func TestRender_ShortLinks(t *testing.T) { `

    Link Other Link Link?

    `) test( "[[Link #.jpg]]", - `

    Link #.jpg

    `, - `

    Link #.jpg

    `) + `

    `, + `

    `) test( "[[Name|Link #.jpg|alt=\"AltName\"|title='Title']]", `

    AltName

    `, `

    AltName

    `) test( "[[some/path/Link #.jpg]]", - `

    some/path/Link #.jpg

    `, - `

    some/path/Link #.jpg

    `) + `

    `, + `

    `) test( "

    [[foobar]]

    ", `

    [[foobar]]

    `, @@ -601,10 +602,10 @@ func TestPostProcess_RenderDocument(t *testing.T) { // Test that other post processing still works. test( ":gitea:", - `:gitea:`) + `:gitea:`) test( "Some text with 😄 in the middle", - `Some text with 😄 in the middle`) + `Some text with 😄 in the middle`) test("http://localhost:3000/person/repo/issues/4#issuecomment-1234", `person/repo#4 (comment)`) } @@ -679,7 +680,7 @@ func TestRender_FilePreview(t *testing.T) { defer test.MockVariableValue(&setting.StaticRootPath, "../../")() defer test.MockVariableValue(&setting.Names, []string{"english"})() defer test.MockVariableValue(&setting.Langs, []string{"en-US"})() - translation.InitLocales(context.Background()) + translation.InitLocales(t.Context()) setting.AppURL = markup.TestAppURL markup.Init(&markup.ProcessorHelper{ @@ -1026,4 +1027,138 @@ func TestRender_FilePreview(t *testing.T) { localMetas, ) }) + + commitFileURL := util.URLJoin(markup.TestRepoURL, "src", "commit", "c9913120ed2c1e27c1d7752ecdb7a504dc7cf6be", "path", "to", "file.md") + + t.Run("rendered file with ?display=source", func(t *testing.T) { + testRender( + commitFileURL+"?display=source"+"#L1-L2", + `

    `+ + `
    `+ + `
    `+ + `
    `+ + `path/to/file.md`+ + `
    `+ + ``+ + `Lines 1 to 2 in c991312`+ + ``+ + `
    `+ + `
    `+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + `
    # A`+"\n"+`
    B`+"\n"+`
    `+ + `
    `+ + `
    `+ + `

    `, + localMetas, + ) + }) + + t.Run("rendered file without ?display=source", func(t *testing.T) { + testRender( + commitFileURL+"#L1-L2", + `

    `+ + `
    `+ + `
    `+ + `
    `+ + `path/to/file.md`+ + `
    `+ + ``+ + `Lines 1 to 2 in c991312`+ + ``+ + `
    `+ + `
    `+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + `
    # A`+"\n"+`
    B`+"\n"+`
    `+ + `
    `+ + `
    `+ + `

    `, + localMetas, + ) + }) + + commitFileURL = util.URLJoin(markup.TestRepoURL, "src", "commit", "190d9492934af498c3f669d6a2431dc5459e5b20", "path", "to", "file.go") + + t.Run("normal file with ?display=source", func(t *testing.T) { + testRender( + commitFileURL+"?display=source"+"#L2-L3", + `

    `+ + `
    `+ + `
    `+ + `
    `+ + `path/to/file.go`+ + `
    `+ + ``+ + `Lines 2 to 3 in 190d949`+ + ``+ + `
    `+ + `
    `+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + `
    B`+"\n"+`
    C`+"\n"+`
    `+ + `
    `+ + `
    `+ + `

    `, + localMetas, + ) + }) + + commitFileURL = util.URLJoin(markup.TestRepoURL, "src", "commit", "eeb243c3395e1921c5d90e73bd739827251fc99d", "path", "to", "file%20%23.txt") + + t.Run("file with strange characters in name", func(t *testing.T) { + testRender( + commitFileURL+"#L1", + `

    `+ + `
    `+ + `
    `+ + `
    `+ + `path/to/file #.txt`+ + `
    `+ + ``+ + `Line 1 in eeb243c`+ + ``+ + `
    `+ + `
    `+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + `
    A`+"\n"+`
    `+ + `
    `+ + `
    `+ + `

    `, + localMetas, + ) + }) } diff --git a/modules/markup/markdown/ast.go b/modules/markup/markdown/ast.go index 7f0ac6a92c..c2fbbe6692 100644 --- a/modules/markup/markdown/ast.go +++ b/modules/markup/markdown/ast.go @@ -34,13 +34,6 @@ func NewDetails() *Details { } } -// IsDetails returns true if the given node implements the Details interface, -// otherwise false. -func IsDetails(node ast.Node) bool { - _, ok := node.(*Details) - return ok -} - // Summary is a block that contains the summary of details block type Summary struct { ast.BaseBlock @@ -66,13 +59,6 @@ func NewSummary() *Summary { } } -// IsSummary returns true if the given node implements the Summary interface, -// otherwise false. -func IsSummary(node ast.Node) bool { - _, ok := node.(*Summary) - return ok -} - // TaskCheckBoxListItem is a block that represents a list item of a markdown block with a checkbox type TaskCheckBoxListItem struct { *ast.ListItem @@ -103,13 +89,6 @@ func NewTaskCheckBoxListItem(listItem *ast.ListItem) *TaskCheckBoxListItem { } } -// IsTaskCheckBoxListItem returns true if the given node implements the TaskCheckBoxListItem interface, -// otherwise false. -func IsTaskCheckBoxListItem(node ast.Node) bool { - _, ok := node.(*TaskCheckBoxListItem) - return ok -} - // Icon is an inline for a fomantic icon type Icon struct { ast.BaseInline @@ -139,13 +118,6 @@ func NewIcon(name string) *Icon { } } -// IsIcon returns true if the given node implements the Icon interface, -// otherwise false. -func IsIcon(node ast.Node) bool { - _, ok := node.(*Icon) - return ok -} - // ColorPreview is an inline for a color preview type ColorPreview struct { ast.BaseInline diff --git a/modules/markup/markdown/callout/github.go b/modules/markup/markdown/callout/github.go index 9b8b611d18..49ad249696 100644 --- a/modules/markup/markdown/callout/github.go +++ b/modules/markup/markdown/callout/github.go @@ -7,7 +7,7 @@ package callout import ( "strings" - "code.gitea.io/gitea/modules/svg" + "forgejo.org/modules/svg" "github.com/yuin/goldmark/ast" "github.com/yuin/goldmark/parser" @@ -50,7 +50,7 @@ func (g *GitHubCalloutTransformer) Transform(node *ast.Document, reader text.Rea return ast.WalkContinue, nil } firstTextNode, ok := firstParagraph.FirstChild().(*ast.Text) - if !ok || string(firstTextNode.Text(reader.Source())) != "[" { + if !ok || string(firstTextNode.Value(reader.Source())) != "[" { return ast.WalkContinue, nil } secondTextNode, ok := firstTextNode.NextSibling().(*ast.Text) @@ -59,14 +59,14 @@ func (g *GitHubCalloutTransformer) Transform(node *ast.Document, reader text.Rea } // If the second node's text isn't one of the supported attention // types, continue walking. - secondTextNodeText := secondTextNode.Text(reader.Source()) + secondTextNodeText := secondTextNode.Value(reader.Source()) attentionType := strings.ToLower(strings.TrimPrefix(string(secondTextNodeText), "!")) if _, has := supportedAttentionTypes[attentionType]; !has { return ast.WalkContinue, nil } thirdTextNode, ok := secondTextNode.NextSibling().(*ast.Text) - if !ok || string(thirdTextNode.Text(reader.Source())) != "]" { + if !ok || string(thirdTextNode.Value(reader.Source())) != "]" { return ast.WalkContinue, nil } diff --git a/modules/markup/markdown/callout/github_legacy.go b/modules/markup/markdown/callout/github_legacy.go index 32a278bc8d..e77da73dd9 100644 --- a/modules/markup/markdown/callout/github_legacy.go +++ b/modules/markup/markdown/callout/github_legacy.go @@ -7,6 +7,8 @@ package callout import ( "strings" + "forgejo.org/modules/markup/markdown/util" + "github.com/yuin/goldmark/ast" "github.com/yuin/goldmark/parser" "github.com/yuin/goldmark/text" @@ -40,7 +42,7 @@ func (g *GitHubLegacyCalloutTransformer) Transform(node *ast.Document, reader te if !ok { return ast.WalkContinue, nil } - calloutText := string(calloutNode.Text(reader.Source())) + calloutText := string(util.Text(calloutNode, reader.Source())) calloutType := strings.ToLower(calloutText) // We only support "Note" and "Warning" callouts in legacy mode, // match only those. @@ -63,6 +65,14 @@ func (g *GitHubLegacyCalloutTransformer) Transform(node *ast.Document, reader te attentionParagraph.AppendChild(attentionParagraph, calloutNode) firstParagraph.Parent().InsertBefore(firstParagraph.Parent(), firstParagraph, attentionParagraph) firstParagraph.RemoveChild(firstParagraph, calloutNode) + + // Remove softbreak line if there's one. + if firstParagraph.ChildCount() >= 1 { + softBreakNode, ok := firstParagraph.FirstChild().(*ast.Text) + if ok && softBreakNode.SoftLineBreak() { + firstParagraph.RemoveChild(firstParagraph, softBreakNode) + } + } } return ast.WalkContinue, nil diff --git a/modules/markup/markdown/color_util.go b/modules/markup/markdown/color_util.go index 355fef3fc0..efbde6b730 100644 --- a/modules/markup/markdown/color_util.go +++ b/modules/markup/markdown/color_util.go @@ -6,7 +6,7 @@ package markdown import "regexp" var ( - hexRGB = regexp.MustCompile(`^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$`) + hexRGB = regexp.MustCompile(`^#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$`) hsl = regexp.MustCompile(`^hsl\([ ]*([012]?[0-9]{1,2}|3[0-5][0-9]|360),[ ]*([0-9]{0,2}|100)\%,[ ]*([0-9]{0,2}|100)\%\)$`) hsla = regexp.MustCompile(`^hsla\(([ ]*[012]?[0-9]{1,2}|3[0-5][0-9]|360),[ ]*([0-9]{0,2}|100)\%,[ ]*([0-9]{0,2}|100)\%,[ ]*(1|1\.0|0|(0\.[0-9]+))\)$`) rgb = regexp.MustCompile(`^rgb\(([ ]*((([0-9]{1,2}|100)\%)|(([01]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))),){2}([ ]*((([0-9]{1,2}|100)\%)|(([01]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))))\)$`) diff --git a/modules/markup/markdown/color_util_test.go b/modules/markup/markdown/color_util_test.go index c6e0555a35..9f6448cf8c 100644 --- a/modules/markup/markdown/color_util_test.go +++ b/modules/markup/markdown/color_util_test.go @@ -17,6 +17,7 @@ func TestMatchColor(t *testing.T) { {"#ddeeffa0", true}, {"#ddeefe", true}, {"#abcdef", true}, + {"#fffa", true}, {"#abcdeg", false}, {"#abcdefg0", false}, {"black", false}, diff --git a/modules/markup/markdown/goldmark.go b/modules/markup/markdown/goldmark.go index 0290e1312d..9a901a2287 100644 --- a/modules/markup/markdown/goldmark.go +++ b/modules/markup/markdown/goldmark.go @@ -8,8 +8,8 @@ import ( "regexp" "strings" - "code.gitea.io/gitea/modules/markup" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/markup" + "forgejo.org/modules/setting" "github.com/yuin/goldmark/ast" east "github.com/yuin/goldmark/extension/ast" @@ -203,8 +203,7 @@ func (r *HTMLRenderer) renderIcon(w util.BufWriter, source []byte, node ast.Node return ast.WalkContinue, nil } - var err error - _, err = w.WriteString(fmt.Sprintf(``, name)) + _, err := w.WriteString(fmt.Sprintf(``, name)) if err != nil { return ast.WalkStop, err } diff --git a/modules/markup/markdown/markdown.go b/modules/markup/markdown/markdown.go index d249d25014..db92631acc 100644 --- a/modules/markup/markdown/markdown.go +++ b/modules/markup/markdown/markdown.go @@ -11,13 +11,13 @@ import ( "strings" "sync" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/markup" - "code.gitea.io/gitea/modules/markup/common" - "code.gitea.io/gitea/modules/markup/markdown/callout" - "code.gitea.io/gitea/modules/markup/markdown/math" - "code.gitea.io/gitea/modules/setting" - giteautil "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/markup" + "forgejo.org/modules/markup/common" + "forgejo.org/modules/markup/markdown/callout" + "forgejo.org/modules/markup/markdown/math" + "forgejo.org/modules/setting" + giteautil "forgejo.org/modules/util" chromahtml "github.com/alecthomas/chroma/v2/formatters/html" "github.com/yuin/goldmark" diff --git a/modules/markup/markdown/markdown_test.go b/modules/markup/markdown/markdown_test.go index e3dc6c9655..e229ee4c65 100644 --- a/modules/markup/markdown/markdown_test.go +++ b/modules/markup/markdown/markdown_test.go @@ -10,14 +10,14 @@ import ( "strings" "testing" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/markup" - "code.gitea.io/gitea/modules/markup/markdown" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/test" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/unittest" + "forgejo.org/modules/git" + "forgejo.org/modules/log" + "forgejo.org/modules/markup" + "forgejo.org/modules/markup/markdown" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" + "forgejo.org/modules/util" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -108,7 +108,7 @@ func TestRender_Images(t *testing.T) { test( "[["+title+"|"+url+"]]", - `

    `+title+`

    `) + `

    `) test( "[!["+title+"]("+url+")]("+href+")", `

    `+title+`

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

    `+title+`

    `) + `

    `) test( "[!["+title+"]("+url+")]("+href+")", `

    `+title+`

    `) @@ -135,8 +135,8 @@ func testAnswers(baseURLContent, baseURLImages string) []string {

    See commit 65f1bf27bc

    Ideas and codes

      -
    • Bezier widget (by @r-lyeh) ocornut/imgui#786
    • -
    • Bezier widget (by @r-lyeh) #786
    • +
    • Bezier widget (by @r-lyeh) ocornut/imgui#786
    • +
    • Bezier widget (by @r-lyeh) #786
    • Node graph editors https://github.com/ocornut/imgui/issues/306
    • Memory Editor
    • Plot var helper
    • @@ -149,13 +149,13 @@ func testAnswers(baseURLContent, baseURLImages string) []string { - + - + @@ -164,9 +164,9 @@ func testAnswers(baseURLContent, baseURLImages string) []string { `

      Excelsior JET allows you to create native executables for Windows, Linux and Mac OS X.

      1. Package your libGDX application
        -images/1.png
      2. +
      3. Perform a test run by hitting the Run! button.
        -images/2.png
      4. +

      More tests

      (from https://www.markdownguide.org/extended-syntax/)

      @@ -422,7 +422,7 @@ func TestRenderSiblingImages_Issue12925(t *testing.T) { func TestRenderEmojiInLinks_Issue12331(t *testing.T) { testcase := `[Link with emoji :moon: in text](https://gitea.io)` - expected := `

      Link with emoji 🌔 in text

      + expected := `

      Link with emoji 🌔 in text

      ` res, err := markdown.RenderString(&markup.RenderContext{Ctx: git.DefaultContext}, testcase) require.NoError(t, err) @@ -471,7 +471,7 @@ func TestColorPreview(t *testing.T) { // no backticks "rgb(166, 32, 64)", // typo - "`hsI(0, 100%, 50%)`", // codespell-ignore + "`hsI(0, 100%, 50%)`", // codespell:ignore // looks like a color but not really "`hsl(40, 60, 80)`", } @@ -849,13 +849,13 @@ mail@domain.com local image
      local image
      remote image
      -local image
      -remote link
      +
      +
      https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
      https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
      -ðŸ‘
      +ðŸ‘
      mail@domain.com
      @mention-user test
      #123
      @@ -876,13 +876,13 @@ space

      local image
      local image
      remote image
      -local image
      -remote link
      +
      +
      https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
      https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
      -ðŸ‘
      +ðŸ‘
      mail@domain.com
      @mention-user test
      #123
      @@ -905,13 +905,13 @@ space

      local image
      local image
      remote image
      -local image
      -remote link
      +
      +
      https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
      https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
      -ðŸ‘
      +ðŸ‘
      mail@domain.com
      @mention-user test
      #123
      @@ -934,13 +934,13 @@ space

      local image
      local image
      remote image
      -local image
      -remote link
      +
      +
      https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
      https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
      -ðŸ‘
      +ðŸ‘
      mail@domain.com
      @mention-user test
      #123
      @@ -963,13 +963,13 @@ space

      local image
      local image
      remote image
      -local image
      -remote link
      +
      +
      https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
      https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
      -ðŸ‘
      +ðŸ‘
      mail@domain.com
      @mention-user test
      #123
      @@ -992,13 +992,13 @@ space

      local image
      local image
      remote image
      -local image
      -remote link
      +
      +
      https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
      https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
      -ðŸ‘
      +ðŸ‘
      mail@domain.com
      @mention-user test
      #123
      @@ -1022,13 +1022,13 @@ space

      local image
      local image
      remote image
      -local image
      -remote link
      +
      +
      https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
      https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
      -ðŸ‘
      +ðŸ‘
      mail@domain.com
      @mention-user test
      #123
      @@ -1052,13 +1052,13 @@ space

      local image
      local image
      remote image
      -local image
      -remote link
      +
      +
      https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
      https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
      -ðŸ‘
      +ðŸ‘
      mail@domain.com
      @mention-user test
      #123
      @@ -1082,13 +1082,13 @@ space

      local image
      local image
      remote image
      -local image
      -remote link
      +
      +
      https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
      https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
      -ðŸ‘
      +ðŸ‘
      mail@domain.com
      @mention-user test
      #123
      @@ -1112,13 +1112,13 @@ space

      local image
      local image
      remote image
      -local image
      -remote link
      +
      +
      https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
      https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
      -ðŸ‘
      +ðŸ‘
      mail@domain.com
      @mention-user test
      #123
      @@ -1143,13 +1143,13 @@ space

      local image
      local image
      remote image
      -local image
      -remote link
      +
      +
      https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
      https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
      -ðŸ‘
      +ðŸ‘
      mail@domain.com
      @mention-user test
      #123
      @@ -1174,13 +1174,13 @@ space

      local image
      local image
      remote image
      -local image
      -remote link
      +
      +
      https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
      https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
      com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
      -ðŸ‘
      +ðŸ‘
      mail@domain.com
      @mention-user test
      #123
      @@ -1190,7 +1190,7 @@ space

      } for i, c := range cases { - result, err := markdown.RenderString(&markup.RenderContext{Ctx: context.Background(), Links: c.Links, IsWiki: c.IsWiki}, input) + result, err := markdown.RenderString(&markup.RenderContext{Ctx: t.Context(), Links: c.Links, IsWiki: c.IsWiki}, input) require.NoError(t, err, "Unexpected error in testcase: %v", i) assert.Equal(t, template.HTML(c.Expected), result, "Unexpected result in testcase %v", i) } @@ -1356,4 +1356,10 @@ func TestCallout(t *testing.T) { } test(">\n0", "
      \n
      \n

      0

      ") + test("> **Warning**\n> Bad stuff is brewing here", `

      Warning

      +

      Bad stuff is brewing here

      +
      `) + test("> [!WARNING]\n> Bad stuff is brewing here", `

      Warning

      +

      Bad stuff is brewing here

      +
      `) } diff --git a/modules/markup/markdown/math/math.go b/modules/markup/markdown/math/math.go index 3d9f376bc6..4126dc9ad6 100644 --- a/modules/markup/markdown/math/math.go +++ b/modules/markup/markdown/math/math.go @@ -39,28 +39,6 @@ func Enabled(enable ...bool) Option { }) } -// WithInlineDollarParser enables or disables the parsing of $...$ -func WithInlineDollarParser(enable ...bool) Option { - value := true - if len(enable) > 0 { - value = enable[0] - } - return extensionFunc(func(e *Extension) { - e.parseDollarInline = value - }) -} - -// WithBlockDollarParser enables or disables the parsing of $$...$$ -func WithBlockDollarParser(enable ...bool) Option { - value := true - if len(enable) > 0 { - value = enable[0] - } - return extensionFunc(func(e *Extension) { - e.parseDollarBlock = value - }) -} - // Math represents a math extension with default rendered delimiters var Math = &Extension{ enabled: true, diff --git a/modules/markup/markdown/prefixed_id.go b/modules/markup/markdown/prefixed_id.go index 63d7fadc0a..036481dc05 100644 --- a/modules/markup/markdown/prefixed_id.go +++ b/modules/markup/markdown/prefixed_id.go @@ -7,9 +7,9 @@ import ( "bytes" "fmt" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/markup/common" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/container" + "forgejo.org/modules/markup/common" + "forgejo.org/modules/util" "github.com/yuin/goldmark/ast" ) diff --git a/modules/markup/markdown/renderconfig.go b/modules/markup/markdown/renderconfig.go index f4c48d1b3d..5c3eb1beec 100644 --- a/modules/markup/markdown/renderconfig.go +++ b/modules/markup/markdown/renderconfig.go @@ -7,7 +7,7 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/modules/markup" + "forgejo.org/modules/markup" "github.com/yuin/goldmark/ast" "gopkg.in/yaml.v3" diff --git a/modules/markup/markdown/toc.go b/modules/markup/markdown/toc.go index 38f744a25f..dbfab3e9dc 100644 --- a/modules/markup/markdown/toc.go +++ b/modules/markup/markdown/toc.go @@ -7,8 +7,8 @@ import ( "fmt" "net/url" - "code.gitea.io/gitea/modules/markup" - "code.gitea.io/gitea/modules/translation" + "forgejo.org/modules/markup" + "forgejo.org/modules/translation" "github.com/yuin/goldmark/ast" ) diff --git a/modules/markup/markdown/transform_codespan.go b/modules/markup/markdown/transform_codespan.go index a2cd4fb5ba..15c3a44f0a 100644 --- a/modules/markup/markdown/transform_codespan.go +++ b/modules/markup/markdown/transform_codespan.go @@ -8,7 +8,8 @@ import ( "fmt" "strings" - "code.gitea.io/gitea/modules/markup" + "forgejo.org/modules/markup" + mdutil "forgejo.org/modules/markup/markdown/util" "github.com/yuin/goldmark/ast" "github.com/yuin/goldmark/renderer/html" @@ -49,7 +50,7 @@ func (r *HTMLRenderer) renderCodeSpan(w util.BufWriter, source []byte, n ast.Nod } func (g *ASTTransformer) transformCodeSpan(_ *markup.RenderContext, v *ast.CodeSpan, reader text.Reader) { - colorContent := v.Text(reader.Source()) + colorContent := mdutil.Text(v, reader.Source()) if matchColor(strings.ToLower(string(colorContent))) { v.AppendChild(v, NewColorPreview(colorContent)) } diff --git a/modules/markup/markdown/transform_heading.go b/modules/markup/markdown/transform_heading.go index 6d48f34d93..eedaf58556 100644 --- a/modules/markup/markdown/transform_heading.go +++ b/modules/markup/markdown/transform_heading.go @@ -6,8 +6,9 @@ package markdown import ( "fmt" - "code.gitea.io/gitea/modules/markup" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/markup" + mdutil "forgejo.org/modules/markup/markdown/util" + "forgejo.org/modules/util" "github.com/yuin/goldmark/ast" "github.com/yuin/goldmark/text" @@ -19,7 +20,7 @@ func (g *ASTTransformer) transformHeading(_ *markup.RenderContext, v *ast.Headin v.SetAttribute(attr.Name, []byte(fmt.Sprintf("%v", attr.Value))) } } - txt := v.Text(reader.Source()) + txt := mdutil.Text(v, reader.Source()) header := markup.Header{ Text: util.UnsafeBytesToString(txt), Level: v.Level, diff --git a/modules/markup/markdown/transform_image.go b/modules/markup/markdown/transform_image.go index b34a710fed..0f9c69cae6 100644 --- a/modules/markup/markdown/transform_image.go +++ b/modules/markup/markdown/transform_image.go @@ -6,8 +6,8 @@ package markdown import ( "strings" - "code.gitea.io/gitea/modules/markup" - giteautil "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/markup" + giteautil "forgejo.org/modules/util" "github.com/yuin/goldmark/ast" ) diff --git a/modules/markup/markdown/transform_link.go b/modules/markup/markdown/transform_link.go index e6f3836412..48e3479563 100644 --- a/modules/markup/markdown/transform_link.go +++ b/modules/markup/markdown/transform_link.go @@ -7,9 +7,9 @@ import ( "bytes" "slices" - "code.gitea.io/gitea/modules/markup" - "code.gitea.io/gitea/modules/setting" - giteautil "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/markup" + "forgejo.org/modules/setting" + giteautil "forgejo.org/modules/util" "github.com/yuin/goldmark/ast" ) diff --git a/modules/markup/markdown/transform_list.go b/modules/markup/markdown/transform_list.go index b982fd4a83..03b3c4e89c 100644 --- a/modules/markup/markdown/transform_list.go +++ b/modules/markup/markdown/transform_list.go @@ -6,7 +6,7 @@ package markdown import ( "fmt" - "code.gitea.io/gitea/modules/markup" + "forgejo.org/modules/markup" "github.com/yuin/goldmark/ast" east "github.com/yuin/goldmark/extension/ast" diff --git a/modules/markup/markdown/util/text.go b/modules/markup/markdown/util/text.go new file mode 100644 index 0000000000..8a42e5835b --- /dev/null +++ b/modules/markup/markdown/util/text.go @@ -0,0 +1,26 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package util + +import ( + "bytes" + + "github.com/yuin/goldmark/ast" +) + +func textOfChildren(n ast.Node, src []byte, b *bytes.Buffer) { + for c := n.FirstChild(); c != nil; c = c.NextSibling() { + if t, ok := c.(*ast.Text); ok { + b.Write(t.Value(src)) + } else { + textOfChildren(c, src, b) + } + } +} + +func Text(n ast.Node, src []byte) []byte { + var b bytes.Buffer + textOfChildren(n, src, &b) + return b.Bytes() +} diff --git a/modules/markup/mdstripper/mdstripper.go b/modules/markup/mdstripper/mdstripper.go index 2a69d95224..6a34ac81c4 100644 --- a/modules/markup/mdstripper/mdstripper.go +++ b/modules/markup/mdstripper/mdstripper.go @@ -10,9 +10,9 @@ import ( "strings" "sync" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/markup/common" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/log" + "forgejo.org/modules/markup/common" + "forgejo.org/modules/setting" "github.com/yuin/goldmark" "github.com/yuin/goldmark/ast" @@ -46,7 +46,7 @@ func (r *stripRenderer) Render(w io.Writer, source []byte, doc ast.Node) error { coalesce := prevSibIsText r.processString( w, - v.Text(source), + v.Value(source), coalesce) if v.SoftLineBreak() { r.doubleSpace(w) diff --git a/modules/markup/orgmode/orgmode.go b/modules/markup/orgmode/orgmode.go index 391ee6c12b..b9d7b21db0 100644 --- a/modules/markup/orgmode/orgmode.go +++ b/modules/markup/orgmode/orgmode.go @@ -9,11 +9,11 @@ import ( "io" "strings" - "code.gitea.io/gitea/modules/highlight" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/markup" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/highlight" + "forgejo.org/modules/log" + "forgejo.org/modules/markup" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" "github.com/alecthomas/chroma/v2" "github.com/alecthomas/chroma/v2/lexers" diff --git a/modules/markup/orgmode/orgmode_test.go b/modules/markup/orgmode/orgmode_test.go index f41d86a8a8..cdaa9f18ce 100644 --- a/modules/markup/orgmode/orgmode_test.go +++ b/modules/markup/orgmode/orgmode_test.go @@ -7,10 +7,10 @@ import ( "strings" "testing" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/markup" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/git" + "forgejo.org/modules/markup" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -152,8 +152,8 @@ func HelloWorld() { } #+end_src `, `
      -
      // HelloWorld prints "Hello World"
      -func HelloWorld() {
      +
      // HelloWorld prints "Hello World"
      +func HelloWorld() {
       	fmt.Println("Hello World")
       }
      `) diff --git a/modules/markup/renderer.go b/modules/markup/renderer.go index 2137302f43..8eec764bbe 100644 --- a/modules/markup/renderer.go +++ b/modules/markup/renderer.go @@ -14,9 +14,9 @@ import ( "strings" "sync" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/git" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" "github.com/yuin/goldmark/ast" ) @@ -67,14 +67,18 @@ type Header struct { // RenderContext represents a render context type RenderContext struct { - Ctx context.Context - RelativePath string // relative path from tree root of the branch - Type string - IsWiki bool - Links Links - Metas map[string]string - DefaultLink string - GitRepo *git.Repository + Ctx context.Context + RelativePath string // relative path from tree root of the branch + Type string + IsWiki bool + Links Links + Metas map[string]string + DefaultLink string + GitRepo *git.Repository + // reporting the target blob that is to-be-rendered enables + // deeper inspection in the handler for external renderer + // (i.e., more targeted handling of annexed files) + Blob *git.Blob ShaExistCache map[string]bool cancelFn func() SidebarTocNode ast.Node diff --git a/modules/markup/sanitizer.go b/modules/markup/sanitizer.go index ddc218c1b8..7ff11f0844 100644 --- a/modules/markup/sanitizer.go +++ b/modules/markup/sanitizer.go @@ -10,7 +10,7 @@ import ( "regexp" "sync" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "github.com/microcosm-cc/bluemonday" ) @@ -94,10 +94,10 @@ func createDefaultPolicy() *bluemonday.Policy { } // Allow classes for anchors - policy.AllowAttrs("class").Matching(regexp.MustCompile(`ref-issue( ref-external-issue)?`)).OnElements("a") + policy.AllowAttrs("class").Matching(regexp.MustCompile(`^(ref-issue( ref-external-issue)?|mention)$`)).OnElements("a") // Allow classes for task lists - policy.AllowAttrs("class").Matching(regexp.MustCompile(`task-list-item`)).OnElements("li") + policy.AllowAttrs("class").Matching(regexp.MustCompile(`^task-list-item$`)).OnElements("li") // Allow classes for org mode list item status. policy.AllowAttrs("class").Matching(regexp.MustCompile(`^(unchecked|checked|indeterminate)$`)).OnElements("li") @@ -106,10 +106,11 @@ func createDefaultPolicy() *bluemonday.Policy { policy.AllowAttrs("class").Matching(regexp.MustCompile(`^icon(\s+[\p{L}\p{N}_-]+)+$`)).OnElements("i") // Allow classes for emojis - policy.AllowAttrs("class").Matching(regexp.MustCompile(`emoji`)).OnElements("img") + policy.AllowAttrs("class").Matching(regexp.MustCompile(`^emoji$`)).OnElements("img") // Allow icons, emojis, chroma syntax and keyword markup on span policy.AllowAttrs("class").Matching(regexp.MustCompile(`^((icon(\s+[\p{L}\p{N}_-]+)+)|(emoji)|(language-math display)|(language-math inline))$|^([a-z][a-z0-9]{0,2})$|^` + keywordClass + `$`)).OnElements("span") + policy.AllowAttrs("data-alias").Matching(regexp.MustCompile(`^[a-zA-Z0-9-_+]+$`)).OnElements("span") // Allow 'color' and 'background-color' properties for the style attribute on text elements and table cells. policy.AllowStyles("color", "background-color").OnElements("span", "p", "th", "td") @@ -122,13 +123,13 @@ func createDefaultPolicy() *bluemonday.Policy { policy.AllowAttrs("class").Matching(regexp.MustCompile("^header$")).OnElements("div") policy.AllowAttrs("data-line-number").Matching(regexp.MustCompile("^[0-9]+$")).OnElements("span") policy.AllowAttrs("class").Matching(regexp.MustCompile("^text small grey$")).OnElements("span") - policy.AllowAttrs("class").Matching(regexp.MustCompile("^file-preview*")).OnElements("table") + policy.AllowAttrs("class").Matching(regexp.MustCompile("^file-preview$")).OnElements("table") policy.AllowAttrs("class").Matching(regexp.MustCompile("^lines-escape$")).OnElements("td") policy.AllowAttrs("class").Matching(regexp.MustCompile("^toggle-escape-button btn interact-bg$")).OnElements("button") policy.AllowAttrs("title").OnElements("button") policy.AllowAttrs("class").Matching(regexp.MustCompile("^ambiguous-code-point$")).OnElements("span") policy.AllowAttrs("data-tooltip-content").OnElements("span") - policy.AllowAttrs("class").Matching(regexp.MustCompile("muted|(text black)")).OnElements("a") + policy.AllowAttrs("class").Matching(regexp.MustCompile("^muted|(text black)$")).OnElements("a") policy.AllowAttrs("class").Matching(regexp.MustCompile("^ui warning message tw-text-left$")).OnElements("div") // Allow generally safe attributes diff --git a/modules/markup/sanitizer_test.go b/modules/markup/sanitizer_test.go index 4441a41544..9805a34910 100644 --- a/modules/markup/sanitizer_test.go +++ b/modules/markup/sanitizer_test.go @@ -68,6 +68,13 @@ func Test_Sanitizer(t *testing.T) { `bad`, `bad`, `bad`, `bad`, `bad`, `bad`, + + // Mention + `@forgejo/UI`, `@forgejo/UI`, + + // Emoji + `THUMBS UP`, `THUMBS UP`, + `THUMBS UP`, `THUMBS UP`, } for i := 0; i < len(testCases); i += 2 { diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/0b/b53b56d70d253ce75c257d3cd6334a41ef2b6c b/modules/markup/tests/repo/repo1_filepreview/objects/0b/b53b56d70d253ce75c257d3cd6334a41ef2b6c new file mode 100644 index 0000000000..1ab268b76c Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/0b/b53b56d70d253ce75c257d3cd6334a41ef2b6c differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/18/9739e1c2a6cdb8ee094ba1ef8a2e40cf65b2ec b/modules/markup/tests/repo/repo1_filepreview/objects/18/9739e1c2a6cdb8ee094ba1ef8a2e40cf65b2ec new file mode 100644 index 0000000000..c8b99f906b Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/18/9739e1c2a6cdb8ee094ba1ef8a2e40cf65b2ec differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/2a/4032b49cff56d6d4921133e087d9dc0341a2c5 b/modules/markup/tests/repo/repo1_filepreview/objects/2a/4032b49cff56d6d4921133e087d9dc0341a2c5 new file mode 100644 index 0000000000..f799e8a988 Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/2a/4032b49cff56d6d4921133e087d9dc0341a2c5 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/2d/2f8eaa17b17359ee1c73222065575d50d9a157 b/modules/markup/tests/repo/repo1_filepreview/objects/2d/2f8eaa17b17359ee1c73222065575d50d9a157 new file mode 100644 index 0000000000..7f4c451d00 Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/2d/2f8eaa17b17359ee1c73222065575d50d9a157 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/2f/b9577a8e940a0a84a789cdd4a45d0f172e3fdd b/modules/markup/tests/repo/repo1_filepreview/objects/2f/b9577a8e940a0a84a789cdd4a45d0f172e3fdd new file mode 100644 index 0000000000..fc97712911 Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/2f/b9577a8e940a0a84a789cdd4a45d0f172e3fdd differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/2f/f8eb63aad050c3f20e9cb27090ab7378267ab2 b/modules/markup/tests/repo/repo1_filepreview/objects/2f/f8eb63aad050c3f20e9cb27090ab7378267ab2 new file mode 100644 index 0000000000..e230df1343 Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/2f/f8eb63aad050c3f20e9cb27090ab7378267ab2 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/35/75ed7948fe86ab56b0a76f796f7995222bec65 b/modules/markup/tests/repo/repo1_filepreview/objects/35/75ed7948fe86ab56b0a76f796f7995222bec65 new file mode 100644 index 0000000000..1493caa3df Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/35/75ed7948fe86ab56b0a76f796f7995222bec65 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/3c/95f14e5a0ab2c5ba9ee9a47ddc261af4968043 b/modules/markup/tests/repo/repo1_filepreview/objects/3c/95f14e5a0ab2c5ba9ee9a47ddc261af4968043 new file mode 100644 index 0000000000..3e9c0c0d8b Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/3c/95f14e5a0ab2c5ba9ee9a47ddc261af4968043 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/3e/2a4f1b9a15ffa15ea7ffdc06acd302442b3eca b/modules/markup/tests/repo/repo1_filepreview/objects/3e/2a4f1b9a15ffa15ea7ffdc06acd302442b3eca new file mode 100644 index 0000000000..78189a52f6 --- /dev/null +++ b/modules/markup/tests/repo/repo1_filepreview/objects/3e/2a4f1b9a15ffa15ea7ffdc06acd302442b3eca @@ -0,0 +1 @@ +x•ŽANÃ0EYû³GB;a U=D9€=þ&–ÚÙÓr} 7èê­ÞÓÓëåÒŒBœ^¬´¤˜yY8Ï:AІ X}R×XkÎs­"î;uìFº®9x” Œ ÊEdÐ’%Í~**Zß3\ºÙvíô9Й>nÿ8Žfxkû=[9K”%L>®ôêÙ{§7Ãs–;aÕvý4ÛhXOûH·Ô“þÕ†ûð`KÑ \ No newline at end of file diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/72/1f0ce13d83f93d431b849a554a62948b85f573 b/modules/markup/tests/repo/repo1_filepreview/objects/72/1f0ce13d83f93d431b849a554a62948b85f573 new file mode 100644 index 0000000000..d781d4d248 --- /dev/null +++ b/modules/markup/tests/repo/repo1_filepreview/objects/72/1f0ce13d83f93d431b849a554a62948b85f573 @@ -0,0 +1 @@ +x•ŽKŠ1@]çµ$¿J¥aæz€JRÁ@w+éØsýõ®ÞâñàåÛ²´ÖÛÃè"@VL&J3%f-ÑGDÒq2>FçjBOEݹË:ÀgÃ\1¤œ¦ê¦’kÀêªEM6DÔ,Ÿ\‚âǸÞ:\6é¾OülmÈ©­;Ï­|ƒ!GäŒE‚£6Z«üzòY¥Î² ¨m¸wÙ›üÂÿi‘.x-o³ò"›úŒLÌ \ No newline at end of file diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/72/e0a44ea5761c9055995db18019e459576b3b27 b/modules/markup/tests/repo/repo1_filepreview/objects/72/e0a44ea5761c9055995db18019e459576b3b27 new file mode 100644 index 0000000000..7b926dc0d8 Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/72/e0a44ea5761c9055995db18019e459576b3b27 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/72/e1c77b65c7baa0e848557089148833fb54705e b/modules/markup/tests/repo/repo1_filepreview/objects/72/e1c77b65c7baa0e848557089148833fb54705e new file mode 100644 index 0000000000..0bbca73af2 Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/72/e1c77b65c7baa0e848557089148833fb54705e differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/8a/3b1881b5c4e7dc2be7ee1c0f37f93ffbb5ff77 b/modules/markup/tests/repo/repo1_filepreview/objects/8a/3b1881b5c4e7dc2be7ee1c0f37f93ffbb5ff77 new file mode 100644 index 0000000000..0ea93376dc Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/8a/3b1881b5c4e7dc2be7ee1c0f37f93ffbb5ff77 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/8b/ccd5176c25898b57da2551e076f769054e0d8e b/modules/markup/tests/repo/repo1_filepreview/objects/8b/ccd5176c25898b57da2551e076f769054e0d8e new file mode 100644 index 0000000000..394a7bb50d Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/8b/ccd5176c25898b57da2551e076f769054e0d8e differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/95/31b649823095acf5d79ab9e4f8b8d86046352f b/modules/markup/tests/repo/repo1_filepreview/objects/95/31b649823095acf5d79ab9e4f8b8d86046352f new file mode 100644 index 0000000000..ab36311f6f Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/95/31b649823095acf5d79ab9e4f8b8d86046352f differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/ac/769ab4baa91060a4c2f828f53e6c3cc2f708f8 b/modules/markup/tests/repo/repo1_filepreview/objects/ac/769ab4baa91060a4c2f828f53e6c3cc2f708f8 new file mode 100644 index 0000000000..59afaebf4a Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/ac/769ab4baa91060a4c2f828f53e6c3cc2f708f8 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/c5/3110b1957cefc56c4b2d879476ddbe905980bf b/modules/markup/tests/repo/repo1_filepreview/objects/c5/3110b1957cefc56c4b2d879476ddbe905980bf new file mode 100644 index 0000000000..3de089bf6a Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/c5/3110b1957cefc56c4b2d879476ddbe905980bf differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/c9/8762531dd068cd818300a5f5c7dca5da79b510 b/modules/markup/tests/repo/repo1_filepreview/objects/c9/8762531dd068cd818300a5f5c7dca5da79b510 new file mode 100644 index 0000000000..af5b784773 Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/c9/8762531dd068cd818300a5f5c7dca5da79b510 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/c9/913120ed2c1e27c1d7752ecdb7a504dc7cf6be b/modules/markup/tests/repo/repo1_filepreview/objects/c9/913120ed2c1e27c1d7752ecdb7a504dc7cf6be new file mode 100644 index 0000000000..9fc2b7c312 Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/c9/913120ed2c1e27c1d7752ecdb7a504dc7cf6be differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/e7/99b34ea867a0364d0df33f382562db9ff39084 b/modules/markup/tests/repo/repo1_filepreview/objects/e7/99b34ea867a0364d0df33f382562db9ff39084 new file mode 100644 index 0000000000..ef73ed1791 Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/e7/99b34ea867a0364d0df33f382562db9ff39084 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/ee/b243c3395e1921c5d90e73bd739827251fc99d b/modules/markup/tests/repo/repo1_filepreview/objects/ee/b243c3395e1921c5d90e73bd739827251fc99d new file mode 100644 index 0000000000..5515b07d4a Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/ee/b243c3395e1921c5d90e73bd739827251fc99d differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/f7/0f10e4db19068f79bc43844b49f3eece45c4e8 b/modules/markup/tests/repo/repo1_filepreview/objects/f7/0f10e4db19068f79bc43844b49f3eece45c4e8 new file mode 100644 index 0000000000..2e15b4fb0a Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/f7/0f10e4db19068f79bc43844b49f3eece45c4e8 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/refs/heads/master b/modules/markup/tests/repo/repo1_filepreview/refs/heads/master index df25bf45f0..709cffca17 100644 --- a/modules/markup/tests/repo/repo1_filepreview/refs/heads/master +++ b/modules/markup/tests/repo/repo1_filepreview/refs/heads/master @@ -1 +1 @@ -4c1aaf56bcb9f39dcf65f3f250726850aed13cd6 +eeb243c3395e1921c5d90e73bd739827251fc99d diff --git a/modules/mcaptcha/mcaptcha.go b/modules/mcaptcha/mcaptcha.go index 74142aa863..dbcafce29f 100644 --- a/modules/mcaptcha/mcaptcha.go +++ b/modules/mcaptcha/mcaptcha.go @@ -7,7 +7,7 @@ import ( "context" "fmt" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "codeberg.org/gusted/mcaptcha" ) diff --git a/modules/metrics/collector.go b/modules/metrics/collector.go index 230260ff94..5b6787d2f7 100755 --- a/modules/metrics/collector.go +++ b/modules/metrics/collector.go @@ -6,9 +6,9 @@ package metrics import ( "runtime" - activities_model "code.gitea.io/gitea/models/activities" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/setting" + activities_model "forgejo.org/models/activities" + "forgejo.org/models/db" + "forgejo.org/modules/setting" "github.com/prometheus/client_golang/prometheus" ) diff --git a/modules/migration/downloader.go b/modules/migration/downloader.go index 08dbbc29a9..48bdf0456d 100644 --- a/modules/migration/downloader.go +++ b/modules/migration/downloader.go @@ -7,7 +7,7 @@ package migration import ( "context" - "code.gitea.io/gitea/modules/structs" + "forgejo.org/modules/structs" ) // Downloader downloads the site repo information diff --git a/modules/migration/file_format.go b/modules/migration/file_format.go index d29d24dd0b..8851ad6de7 100644 --- a/modules/migration/file_format.go +++ b/modules/migration/file_format.go @@ -9,8 +9,8 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/json" + "forgejo.org/modules/log" "github.com/santhosh-tekuri/jsonschema/v6" "gopkg.in/yaml.v3" diff --git a/modules/migration/options.go b/modules/migration/options.go index 234e72c295..63bbe60758 100644 --- a/modules/migration/options.go +++ b/modules/migration/options.go @@ -4,7 +4,7 @@ package migration -import "code.gitea.io/gitea/modules/structs" +import "forgejo.org/modules/structs" // MigrateOptions defines the way a repository gets migrated // this is for internal usage by migrations module and func who interact with it diff --git a/modules/migration/pullrequest.go b/modules/migration/pullrequest.go index 1435991bd2..0861ab24f1 100644 --- a/modules/migration/pullrequest.go +++ b/modules/migration/pullrequest.go @@ -8,7 +8,7 @@ import ( "fmt" "time" - "code.gitea.io/gitea/modules/git" + "forgejo.org/modules/git" ) // PullRequest defines a standard pull request information @@ -34,9 +34,11 @@ type PullRequest struct { Assignees []string IsLocked bool `yaml:"is_locked"` Reactions []*Reaction + Flow int64 ForeignIndex int64 Context DownloaderContext `yaml:"-"` EnsuredSafe bool `yaml:"ensured_safe"` + IsDraft bool `yaml:"is_draft"` } func (p *PullRequest) GetLocalIndex() int64 { return p.Number } diff --git a/modules/migration/repo.go b/modules/migration/repo.go index 22c2cf6fb3..a85d38084d 100644 --- a/modules/migration/repo.go +++ b/modules/migration/repo.go @@ -14,4 +14,5 @@ type Repository struct { CloneURL string `yaml:"clone_url"` // SECURITY: This must be checked to ensure that is safe to be used OriginalURL string `yaml:"original_url"` DefaultBranch string + Website string } diff --git a/modules/nosql/manager.go b/modules/nosql/manager.go index 0ba21585fa..7eea069e09 100644 --- a/modules/nosql/manager.go +++ b/modules/nosql/manager.go @@ -9,7 +9,7 @@ import ( "sync" "time" - "code.gitea.io/gitea/modules/process" + "forgejo.org/modules/process" "github.com/redis/go-redis/v9" "github.com/syndtr/goleveldb/leveldb" diff --git a/modules/nosql/manager_leveldb.go b/modules/nosql/manager_leveldb.go index 4d2c90debc..087aac3e9a 100644 --- a/modules/nosql/manager_leveldb.go +++ b/modules/nosql/manager_leveldb.go @@ -10,7 +10,7 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" "github.com/syndtr/goleveldb/leveldb" "github.com/syndtr/goleveldb/leveldb/errors" diff --git a/modules/nosql/manager_redis.go b/modules/nosql/manager_redis.go index 79a533bd6b..bdaade1b47 100644 --- a/modules/nosql/manager_redis.go +++ b/modules/nosql/manager_redis.go @@ -11,7 +11,7 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" "github.com/redis/go-redis/v9" ) diff --git a/modules/optional/option_test.go b/modules/optional/option_test.go index 203e9221e3..f6d22d2431 100644 --- a/modules/optional/option_test.go +++ b/modules/optional/option_test.go @@ -6,7 +6,7 @@ package optional_test import ( "testing" - "code.gitea.io/gitea/modules/optional" + "forgejo.org/modules/optional" "github.com/stretchr/testify/assert" ) diff --git a/modules/optional/serialization.go b/modules/optional/serialization.go index b120a0edf6..86c1c97341 100644 --- a/modules/optional/serialization.go +++ b/modules/optional/serialization.go @@ -4,7 +4,7 @@ package optional import ( - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" "gopkg.in/yaml.v3" ) diff --git a/modules/optional/serialization_test.go b/modules/optional/serialization_test.go index c852b8a70f..80fe1c9805 100644 --- a/modules/optional/serialization_test.go +++ b/modules/optional/serialization_test.go @@ -7,8 +7,8 @@ import ( std_json "encoding/json" //nolint:depguard "testing" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/optional" + "forgejo.org/modules/json" + "forgejo.org/modules/optional" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/options/base.go b/modules/options/base.go index 6c6e3839f4..3ae8c56b79 100644 --- a/modules/options/base.go +++ b/modules/options/base.go @@ -4,8 +4,8 @@ package options import ( - "code.gitea.io/gitea/modules/assetfs" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/assetfs" + "forgejo.org/modules/setting" ) func CustomAssets() *assetfs.Layer { diff --git a/modules/options/dynamic.go b/modules/options/dynamic.go index 085492d11c..8eed8516ab 100644 --- a/modules/options/dynamic.go +++ b/modules/options/dynamic.go @@ -6,8 +6,8 @@ package options import ( - "code.gitea.io/gitea/modules/assetfs" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/assetfs" + "forgejo.org/modules/setting" ) func BuiltinAssets() *assetfs.Layer { diff --git a/modules/options/static.go b/modules/options/static.go index 72b28e990e..02091a2b1c 100644 --- a/modules/options/static.go +++ b/modules/options/static.go @@ -6,7 +6,7 @@ package options import ( - "code.gitea.io/gitea/modules/assetfs" + "forgejo.org/modules/assetfs" ) func BuiltinAssets() *assetfs.Layer { diff --git a/modules/packages/alpine/metadata.go b/modules/packages/alpine/metadata.go index 582c42610d..8562612206 100644 --- a/modules/packages/alpine/metadata.go +++ b/modules/packages/alpine/metadata.go @@ -13,8 +13,8 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/modules/util" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/util" + "forgejo.org/modules/validation" ) var ( diff --git a/modules/packages/arch/metadata.go b/modules/packages/arch/metadata.go index 0e08670311..f967bd25a0 100644 --- a/modules/packages/arch/metadata.go +++ b/modules/packages/arch/metadata.go @@ -4,6 +4,7 @@ package arch import ( + "archive/tar" "bufio" "bytes" "encoding/hex" @@ -14,9 +15,9 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/modules/packages" - "code.gitea.io/gitea/modules/util" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/packages" + "forgejo.org/modules/util" + "forgejo.org/modules/validation" "github.com/mholt/archiver/v3" ) @@ -25,7 +26,9 @@ import ( // https://man.archlinux.org/man/PKGBUILD.5 const ( - PropertyDescription = "arch.description" + PropertyDescription = "arch.description" + PropertyFiles = "arch.files" + PropertyArch = "arch.architecture" PropertyDistribution = "arch.distribution" @@ -39,8 +42,8 @@ const ( var ( reName = regexp.MustCompile(`^[a-zA-Z0-9@._+-]+$`) reVer = regexp.MustCompile(`^[a-zA-Z0-9:_.+]+-+[0-9]+$`) - reOptDep = regexp.MustCompile(`^[a-zA-Z0-9@._+-]+([<>]?=?[a-zA-Z0-9@._+-]+)?(:.*)?$`) - rePkgVer = regexp.MustCompile(`^[a-zA-Z0-9@._+-]+([<>]?=?[a-zA-Z0-9@._+-]+)?$`) + reOptDep = regexp.MustCompile(`^[a-zA-Z0-9@._+-]+([<>]?=?([0-9]+:)?[a-zA-Z0-9@._+-]+)?(:.*)?$`) + rePkgVer = regexp.MustCompile(`^[a-zA-Z0-9@._+-]+([<>]?=?([0-9]+:)?[a-zA-Z0-9@._+-]+)?$`) magicZSTD = []byte{0x28, 0xB5, 0x2F, 0xFD} magicXZ = []byte{0xFD, 0x37, 0x7A, 0x58, 0x5A} @@ -71,7 +74,7 @@ type VersionMetadata struct { Conflicts []string `json:"conflicts,omitempty"` Replaces []string `json:"replaces,omitempty"` Backup []string `json:"backup,omitempty"` - Xdata []string `json:"xdata,omitempty"` + XData []string `json:"xdata,omitempty"` } // FileMetadata Metadata related to specific package file. @@ -85,11 +88,13 @@ type FileMetadata struct { Packager string `json:"packager"` Arch string `json:"arch"` PgpSigned string `json:"pgp"` + + Files []string `json:"files,omitempty"` } // ParsePackage Function that receives arch package archive data and returns it's metadata. func ParsePackage(r *packages.HashedBuffer) (*Package, error) { - md5, _, sha256, _ := r.Sums() + md5, _, sha256, _, _ := r.Sums() _, err := r.Seek(0, io.SeekStart) if err != nil { return nil, err @@ -125,7 +130,9 @@ func ParsePackage(r *packages.HashedBuffer) (*Package, error) { defer tarball.Close() var pkg *Package - var mtree bool + var mTree bool + + files := make([]string, 0) for { f, err := tarball.Read() @@ -135,27 +142,32 @@ func ParsePackage(r *packages.HashedBuffer) (*Package, error) { if err != nil { return nil, err } - defer f.Close() + // ref:https://gitlab.archlinux.org/pacman/pacman/-/blob/91546004903eea5d5267d59898a6029ba1d64031/lib/libalpm/add.c#L529-L533 + if !strings.HasPrefix(f.Name(), ".") { + files = append(files, (f.Header.(*tar.Header)).Name) + } switch f.Name() { case ".PKGINFO": pkg, err = ParsePackageInfo(tarballType, f) if err != nil { + _ = f.Close() return nil, err } case ".MTREE": - mtree = true + mTree = true } + _ = f.Close() } if pkg == nil { return nil, util.NewInvalidArgumentErrorf(".PKGINFO file not found") } - if !mtree { + if !mTree { return nil, util.NewInvalidArgumentErrorf(".MTREE file not found") } - + pkg.FileMetadata.Files = files pkg.FileMetadata.CompressedSize = r.Size() pkg.FileMetadata.MD5 = hex.EncodeToString(md5) pkg.FileMetadata.SHA256 = hex.EncodeToString(sha256) @@ -220,7 +232,7 @@ func ParsePackageInfo(compressType string, r io.Reader) (*Package, error) { case "replaces": p.VersionMetadata.Replaces = append(p.VersionMetadata.Replaces, value) case "xdata": - p.VersionMetadata.Xdata = append(p.VersionMetadata.Xdata, value) + p.VersionMetadata.XData = append(p.VersionMetadata.XData, value) case "builddate": bd, err := strconv.ParseInt(value, 10, 64) if err != nil { @@ -260,48 +272,43 @@ func ValidatePackageSpec(p *Package) error { return util.NewInvalidArgumentErrorf("invalid project URL") } } - for _, cd := range p.VersionMetadata.CheckDepends { - if !rePkgVer.MatchString(cd) { - return util.NewInvalidArgumentErrorf("invalid check dependency: %s", cd) + for _, checkDepend := range p.VersionMetadata.CheckDepends { + if !rePkgVer.MatchString(checkDepend) { + return util.NewInvalidArgumentErrorf("invalid check dependency: %s", checkDepend) } } - for _, d := range p.VersionMetadata.Depends { - if !rePkgVer.MatchString(d) { - return util.NewInvalidArgumentErrorf("invalid dependency: %s", d) + for _, depend := range p.VersionMetadata.Depends { + if !rePkgVer.MatchString(depend) { + return util.NewInvalidArgumentErrorf("invalid dependency: %s", depend) } } - for _, md := range p.VersionMetadata.MakeDepends { - if !rePkgVer.MatchString(md) { - return util.NewInvalidArgumentErrorf("invalid make dependency: %s", md) + for _, makeDepend := range p.VersionMetadata.MakeDepends { + if !rePkgVer.MatchString(makeDepend) { + return util.NewInvalidArgumentErrorf("invalid make dependency: %s", makeDepend) } } - for _, p := range p.VersionMetadata.Provides { - if !rePkgVer.MatchString(p) { - return util.NewInvalidArgumentErrorf("invalid provides: %s", p) + for _, provide := range p.VersionMetadata.Provides { + if !rePkgVer.MatchString(provide) { + return util.NewInvalidArgumentErrorf("invalid provides: %s", provide) } } - for _, p := range p.VersionMetadata.Conflicts { - if !rePkgVer.MatchString(p) { - return util.NewInvalidArgumentErrorf("invalid conflicts: %s", p) + for _, conflict := range p.VersionMetadata.Conflicts { + if !rePkgVer.MatchString(conflict) { + return util.NewInvalidArgumentErrorf("invalid conflicts: %s", conflict) } } - for _, p := range p.VersionMetadata.Replaces { - if !rePkgVer.MatchString(p) { - return util.NewInvalidArgumentErrorf("invalid replaces: %s", p) + for _, replace := range p.VersionMetadata.Replaces { + if !rePkgVer.MatchString(replace) { + return util.NewInvalidArgumentErrorf("invalid replaces: %s", replace) } } - for _, p := range p.VersionMetadata.Replaces { - if !rePkgVer.MatchString(p) { - return util.NewInvalidArgumentErrorf("invalid xdata: %s", p) + for _, optDepend := range p.VersionMetadata.OptDepends { + if !reOptDep.MatchString(optDepend) { + return util.NewInvalidArgumentErrorf("invalid optional dependency: %s", optDepend) } } - for _, od := range p.VersionMetadata.OptDepends { - if !reOptDep.MatchString(od) { - return util.NewInvalidArgumentErrorf("invalid optional dependency: %s", od) - } - } - for _, bf := range p.VersionMetadata.Backup { - if strings.HasPrefix(bf, "/") { + for _, b := range p.VersionMetadata.Backup { + if strings.HasPrefix(b, "/") { return util.NewInvalidArgumentErrorf("backup file contains leading forward slash") } } @@ -344,3 +351,12 @@ func (p *Package) Desc() string { } return buf.String() } + +func (p *Package) Files() string { + var buf bytes.Buffer + buf.WriteString("%FILES%\n") + for _, item := range p.FileMetadata.Files { + _, _ = fmt.Fprintf(&buf, "%s\n", item) + } + return buf.String() +} diff --git a/modules/packages/arch/metadata_test.go b/modules/packages/arch/metadata_test.go index ddb35ca837..16c1c1637d 100644 --- a/modules/packages/arch/metadata_test.go +++ b/modules/packages/arch/metadata_test.go @@ -12,7 +12,7 @@ import ( "testing/fstest" "time" - "code.gitea.io/gitea/modules/packages" + "forgejo.org/modules/packages" "github.com/mholt/archiver/v3" "github.com/stretchr/testify/require" @@ -344,8 +344,8 @@ func TestValidatePackageSpec(t *testing.T) { }) } -func TestDescString(t *testing.T) { - const pkgdesc = `%FILENAME% +func TestDescAndFileString(t *testing.T) { + const pkgDesc = `%FILENAME% zstd-1.5.5-1-x86_64.pkg.tar.zst %NAME% @@ -415,6 +415,12 @@ ninja dummy5 dummy6 +` + + const pkgFiles = `%FILES% +usr/ +usr/bin/ +usr/bin/zstd ` md := &Package{ @@ -441,7 +447,9 @@ dummy6 BuildDate: 1681646714, Packager: "Jelle van der Waa ", Arch: "x86_64", + Files: []string{"usr/", "usr/bin/", "usr/bin/zstd"}, }, } - require.Equal(t, pkgdesc, md.Desc()) + require.Equal(t, pkgDesc, md.Desc()) + require.Equal(t, pkgFiles, md.Files()) } diff --git a/modules/packages/cargo/parser.go b/modules/packages/cargo/parser.go index 36cd44df84..f2c75538b5 100644 --- a/modules/packages/cargo/parser.go +++ b/modules/packages/cargo/parser.go @@ -9,8 +9,8 @@ import ( "io" "regexp" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/json" + "forgejo.org/modules/validation" "github.com/hashicorp/go-version" ) @@ -96,7 +96,7 @@ func parsePackage(r io.Reader) (*Package, error) { Target *string `json:"target"` Kind string `json:"kind"` Registry *string `json:"registry"` - ExplicitNameInToml string `json:"explicit_name_in_toml"` + ExplicitNameInToml *string `json:"explicit_name_in_toml"` } `json:"deps"` Features map[string][]string `json:"features"` Authors []string `json:"authors"` @@ -136,8 +136,16 @@ func parsePackage(r io.Reader) (*Package, error) { dependencies := make([]*Dependency, 0, len(meta.Deps)) for _, dep := range meta.Deps { + name := dep.Name + packageName := dep.ExplicitNameInToml + // If the explicit_name_in_toml field is set, the package is renamed and + // should be set accordingly. + if dep.ExplicitNameInToml != nil { + name = *dep.ExplicitNameInToml + packageName = &dep.Name + } dependencies = append(dependencies, &Dependency{ - Name: dep.Name, + Name: name, Req: dep.VersionReq, Features: dep.Features, Optional: dep.Optional, @@ -145,6 +153,7 @@ func parsePackage(r io.Reader) (*Package, error) { Target: dep.Target, Kind: dep.Kind, Registry: dep.Registry, + Package: packageName, }) } diff --git a/modules/packages/cargo/parser_test.go b/modules/packages/cargo/parser_test.go index 4b357cb869..8792a7a977 100644 --- a/modules/packages/cargo/parser_test.go +++ b/modules/packages/cargo/parser_test.go @@ -22,7 +22,7 @@ const ( ) func TestParsePackage(t *testing.T) { - createPackage := func(name, version string) io.Reader { + createPackage := func(name, version, dependency string) io.Reader { metadata := `{ "name":"` + name + `", "vers":"` + version + `", @@ -32,7 +32,7 @@ func TestParsePackage(t *testing.T) { { "name":"dep", "version_req":"1.0" - } + }` + dependency + ` ], "homepage":"` + homepage + `", "license":"` + license + `" @@ -48,7 +48,7 @@ func TestParsePackage(t *testing.T) { t.Run("InvalidName", func(t *testing.T) { for _, name := range []string{"", "0test", "-test", "_test", strings.Repeat("a", 65)} { - data := createPackage(name, "1.0.0") + data := createPackage(name, "1.0.0", "") cp, err := ParsePackage(data) assert.Nil(t, cp) @@ -58,7 +58,7 @@ func TestParsePackage(t *testing.T) { t.Run("InvalidVersion", func(t *testing.T) { for _, version := range []string{"", "1.", "-1.0", "1.0.0/1"} { - data := createPackage("test", version) + data := createPackage("test", version, "") cp, err := ParsePackage(data) assert.Nil(t, cp) @@ -67,7 +67,7 @@ func TestParsePackage(t *testing.T) { }) t.Run("Valid", func(t *testing.T) { - data := createPackage("test", "1.0.0") + data := createPackage("test", "1.0.0", "") cp, err := ParsePackage(data) assert.NotNil(t, cp) @@ -84,4 +84,25 @@ func TestParsePackage(t *testing.T) { content, _ := io.ReadAll(cp.Content) assert.Equal(t, "test", string(content)) }) + + t.Run("Renamed dependency", func(t *testing.T) { + data := createPackage("test", "1.0.0", `, {"name":"v4l2-sys", "version":"0.3.0", "explicit_name_in_toml":"v4l2-sys-mit"}`) + + cp, err := ParsePackage(data) + assert.NotNil(t, cp) + require.NoError(t, err) + + assert.Equal(t, "test", cp.Name) + assert.Equal(t, "1.0.0", cp.Version) + assert.Equal(t, description, cp.Metadata.Description) + assert.Equal(t, []string{author}, cp.Metadata.Authors) + assert.Len(t, cp.Metadata.Dependencies, 2) + assert.Equal(t, "dep", cp.Metadata.Dependencies[0].Name) + assert.EqualValues(t, "v4l2-sys-mit", cp.Metadata.Dependencies[1].Name) + assert.EqualValues(t, "v4l2-sys", *cp.Metadata.Dependencies[1].Package) + assert.Equal(t, homepage, cp.Metadata.ProjectURL) + assert.Equal(t, license, cp.Metadata.License) + content, _ := io.ReadAll(cp.Content) + assert.Equal(t, "test", string(content)) + }) } diff --git a/modules/packages/chef/metadata.go b/modules/packages/chef/metadata.go index a1c91870c2..951606bbc5 100644 --- a/modules/packages/chef/metadata.go +++ b/modules/packages/chef/metadata.go @@ -10,9 +10,9 @@ import ( "regexp" "strings" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/util" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/json" + "forgejo.org/modules/util" + "forgejo.org/modules/validation" ) const ( diff --git a/modules/packages/composer/metadata.go b/modules/packages/composer/metadata.go index 2c2e9ebf27..940309b769 100644 --- a/modules/packages/composer/metadata.go +++ b/modules/packages/composer/metadata.go @@ -10,9 +10,9 @@ import ( "regexp" "strings" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/util" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/json" + "forgejo.org/modules/util" + "forgejo.org/modules/validation" "github.com/hashicorp/go-version" ) @@ -48,6 +48,7 @@ type Metadata struct { Homepage string `json:"homepage,omitempty"` License Licenses `json:"license,omitempty"` Authors []Author `json:"authors,omitempty"` + Bin []string `json:"bin,omitempty"` Autoload map[string]any `json:"autoload,omitempty"` AutoloadDev map[string]any `json:"autoload-dev,omitempty"` Extra map[string]any `json:"extra,omitempty"` diff --git a/modules/packages/composer/metadata_test.go b/modules/packages/composer/metadata_test.go index 2bdb23965b..e2bbff4e58 100644 --- a/modules/packages/composer/metadata_test.go +++ b/modules/packages/composer/metadata_test.go @@ -9,7 +9,7 @@ import ( "strings" "testing" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/packages/conan/conaninfo_parser.go b/modules/packages/conan/conaninfo_parser.go index de11dbee45..6027e51401 100644 --- a/modules/packages/conan/conaninfo_parser.go +++ b/modules/packages/conan/conaninfo_parser.go @@ -8,7 +8,7 @@ import ( "io" "strings" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/util" ) // Conaninfo represents infos of a Conan package diff --git a/modules/packages/conan/reference.go b/modules/packages/conan/reference.go index 58f268bd48..0b863240cb 100644 --- a/modules/packages/conan/reference.go +++ b/modules/packages/conan/reference.go @@ -8,8 +8,8 @@ import ( "regexp" "strings" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/util" ) const ( diff --git a/modules/packages/conda/metadata.go b/modules/packages/conda/metadata.go index 76ba95eace..f61cc61c2a 100644 --- a/modules/packages/conda/metadata.go +++ b/modules/packages/conda/metadata.go @@ -10,10 +10,10 @@ import ( "io" "strings" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/util" - "code.gitea.io/gitea/modules/validation" - "code.gitea.io/gitea/modules/zstd" + "forgejo.org/modules/json" + "forgejo.org/modules/util" + "forgejo.org/modules/validation" + "forgejo.org/modules/zstd" ) var ( diff --git a/modules/packages/conda/metadata_test.go b/modules/packages/conda/metadata_test.go index 25b0295157..959f9c4727 100644 --- a/modules/packages/conda/metadata_test.go +++ b/modules/packages/conda/metadata_test.go @@ -10,7 +10,7 @@ import ( "io" "testing" - "code.gitea.io/gitea/modules/zstd" + "forgejo.org/modules/zstd" "github.com/dsnet/compress/bzip2" "github.com/stretchr/testify/assert" diff --git a/modules/packages/container/metadata.go b/modules/packages/container/metadata.go index 2a41fb9105..ec9d834357 100644 --- a/modules/packages/container/metadata.go +++ b/modules/packages/container/metadata.go @@ -8,9 +8,9 @@ import ( "io" "strings" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/packages/container/helm" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/json" + "forgejo.org/modules/packages/container/helm" + "forgejo.org/modules/validation" oci "github.com/opencontainers/image-spec/specs-go/v1" ) diff --git a/modules/packages/container/metadata_test.go b/modules/packages/container/metadata_test.go index 930cf48f68..6c8c6ea5b9 100644 --- a/modules/packages/container/metadata_test.go +++ b/modules/packages/container/metadata_test.go @@ -7,7 +7,7 @@ import ( "strings" "testing" - "code.gitea.io/gitea/modules/packages/container/helm" + "forgejo.org/modules/packages/container/helm" oci "github.com/opencontainers/image-spec/specs-go/v1" "github.com/stretchr/testify/assert" diff --git a/modules/packages/content_store.go b/modules/packages/content_store.go index da93e6cf6b..f4578d91e0 100644 --- a/modules/packages/content_store.go +++ b/modules/packages/content_store.go @@ -9,9 +9,9 @@ import ( "path" "strings" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/storage" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/setting" + "forgejo.org/modules/storage" + "forgejo.org/modules/util" ) // BlobHash256Key is the key to address a blob content @@ -37,8 +37,8 @@ func (s *ContentStore) ShouldServeDirect() bool { return setting.Packages.Storage.MinioConfig.ServeDirect } -func (s *ContentStore) GetServeDirectURL(key BlobHash256Key, filename string) (*url.URL, error) { - return s.store.URL(KeyToRelativePath(key), filename) +func (s *ContentStore) GetServeDirectURL(key BlobHash256Key, filename string, reqParams url.Values) (*url.URL, error) { + return s.store.URL(KeyToRelativePath(key), filename, reqParams) } // FIXME: Workaround to be removed in v1.20 diff --git a/modules/packages/cran/metadata.go b/modules/packages/cran/metadata.go index 0b0bfb07c6..547fe87ccb 100644 --- a/modules/packages/cran/metadata.go +++ b/modules/packages/cran/metadata.go @@ -13,7 +13,7 @@ import ( "regexp" "strings" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/util" ) const ( diff --git a/modules/packages/debian/metadata.go b/modules/packages/debian/metadata.go index e76db63975..e44801654b 100644 --- a/modules/packages/debian/metadata.go +++ b/modules/packages/debian/metadata.go @@ -12,9 +12,9 @@ import ( "regexp" "strings" - "code.gitea.io/gitea/modules/util" - "code.gitea.io/gitea/modules/validation" - "code.gitea.io/gitea/modules/zstd" + "forgejo.org/modules/util" + "forgejo.org/modules/validation" + "forgejo.org/modules/zstd" "github.com/blakesmith/ar" "github.com/ulikunitz/xz" diff --git a/modules/packages/debian/metadata_test.go b/modules/packages/debian/metadata_test.go index 6f6c469989..cfcbc57ee0 100644 --- a/modules/packages/debian/metadata_test.go +++ b/modules/packages/debian/metadata_test.go @@ -10,7 +10,7 @@ import ( "io" "testing" - "code.gitea.io/gitea/modules/zstd" + "forgejo.org/modules/zstd" "github.com/blakesmith/ar" "github.com/stretchr/testify/assert" diff --git a/modules/packages/goproxy/metadata.go b/modules/packages/goproxy/metadata.go index 40f7d20508..2dae4100e7 100644 --- a/modules/packages/goproxy/metadata.go +++ b/modules/packages/goproxy/metadata.go @@ -10,7 +10,7 @@ import ( "path" "strings" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/util" ) const ( diff --git a/modules/packages/hashed_buffer.go b/modules/packages/hashed_buffer.go index 4ab45edcec..93c693efc9 100644 --- a/modules/packages/hashed_buffer.go +++ b/modules/packages/hashed_buffer.go @@ -6,7 +6,7 @@ package packages import ( "io" - "code.gitea.io/gitea/modules/util/filebuffer" + "forgejo.org/modules/util/filebuffer" ) // HashedSizeReader provide methods to read, sum hashes and a Size method @@ -75,7 +75,7 @@ func (b *HashedBuffer) Write(p []byte) (int, error) { return b.combinedWriter.Write(p) } -// Sums gets the MD5, SHA1, SHA256 and SHA512 checksums of the data -func (b *HashedBuffer) Sums() (hashMD5, hashSHA1, hashSHA256, hashSHA512 []byte) { +// Sums gets the MD5, SHA1, SHA256, SHA512 and BLAKE2B checksums of the data +func (b *HashedBuffer) Sums() (hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b []byte) { return b.hash.Sums() } diff --git a/modules/packages/hashed_buffer_test.go b/modules/packages/hashed_buffer_test.go index ed5267cd6f..879038988f 100644 --- a/modules/packages/hashed_buffer_test.go +++ b/modules/packages/hashed_buffer_test.go @@ -21,9 +21,10 @@ func TestHashedBuffer(t *testing.T) { HashSHA1 string HashSHA256 string HashSHA512 string + hashBlake2b string }{ - {5, "test", "098f6bcd4621d373cade4e832627b4f6", "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08", "ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff"}, - {5, "testtest", "05a671c66aefea124cc08b76ea6d30bb", "51abb9636078defbf888d8457a7c76f85c8f114c", "37268335dd6931045bdcdf92623ff819a64244b53d0e746d438797349d4da578", "125d6d03b32c84d492747f79cf0bf6e179d287f341384eb5d6d3197525ad6be8e6df0116032935698f99a09e265073d1d6c32c274591bf1d0a20ad67cba921bc"}, + {5, "test", "098f6bcd4621d373cade4e832627b4f6", "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08", "ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff", "a71079d42853dea26e453004338670a53814b78137ffbed07603a41d76a483aa9bc33b582f77d30a65e6f29a896c0411f38312e1d66e0bf16386c86a89bea572"}, + {5, "testtest", "05a671c66aefea124cc08b76ea6d30bb", "51abb9636078defbf888d8457a7c76f85c8f114c", "37268335dd6931045bdcdf92623ff819a64244b53d0e746d438797349d4da578", "125d6d03b32c84d492747f79cf0bf6e179d287f341384eb5d6d3197525ad6be8e6df0116032935698f99a09e265073d1d6c32c274591bf1d0a20ad67cba921bc", "372a53b95f46e775b973031e40b844f24389657019f7b7540a9f0496f4ead4a2e4b050909664611fb0f4b7c7e92c3c04c84787be7f6b8edf7bf6bc31856b6c76"}, } for _, c := range cases { @@ -36,11 +37,12 @@ func TestHashedBuffer(t *testing.T) { require.NoError(t, err) assert.Equal(t, c.Data, string(data)) - hashMD5, hashSHA1, hashSHA256, hashSHA512 := buf.Sums() + hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b := buf.Sums() assert.Equal(t, c.HashMD5, hex.EncodeToString(hashMD5)) assert.Equal(t, c.HashSHA1, hex.EncodeToString(hashSHA1)) assert.Equal(t, c.HashSHA256, hex.EncodeToString(hashSHA256)) assert.Equal(t, c.HashSHA512, hex.EncodeToString(hashSHA512)) + assert.Equal(t, c.hashBlake2b, hex.EncodeToString(hashBlake2b)) require.NoError(t, buf.Close()) } diff --git a/modules/packages/helm/metadata.go b/modules/packages/helm/metadata.go index 421fc5e725..19a30c5ffa 100644 --- a/modules/packages/helm/metadata.go +++ b/modules/packages/helm/metadata.go @@ -9,8 +9,8 @@ import ( "io" "strings" - "code.gitea.io/gitea/modules/util" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/util" + "forgejo.org/modules/validation" "github.com/hashicorp/go-version" "gopkg.in/yaml.v3" diff --git a/modules/packages/maven/metadata.go b/modules/packages/maven/metadata.go index 42aa250718..bc0dc0155e 100644 --- a/modules/packages/maven/metadata.go +++ b/modules/packages/maven/metadata.go @@ -7,7 +7,8 @@ import ( "encoding/xml" "io" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/util" + "forgejo.org/modules/validation" "golang.org/x/net/html/charset" ) @@ -49,8 +50,16 @@ type pomStruct struct { Version string `xml:"version"` Scope string `xml:"scope"` } `xml:"dependencies>dependency"` + Parent struct { + GroupID string `xml:"groupId"` + ArtifactID string `xml:"artifactId"` + Version string `xml:"version"` + RelativePath string `xml:"relativePath"` + } `xml:"parent"` } +var ErrNoGroupID = util.NewInvalidArgumentErrorf("group ID is missing") + // ParsePackageMetaData parses the metadata of a pom file func ParsePackageMetaData(r io.Reader) (*Metadata, error) { var pom pomStruct @@ -65,6 +74,17 @@ func ParsePackageMetaData(r io.Reader) (*Metadata, error) { pom.URL = "" } + groupID := pom.GroupID + + if groupID == "" { + // If a project inherits from a parent project, the groupId element is optional. + // Refer to: https://maven.apache.org/pom.html#Inheritance + if pom.Parent.GroupID == "" { + return nil, ErrNoGroupID + } + groupID = pom.Parent.GroupID + } + licenses := make([]string, 0, len(pom.Licenses)) for _, l := range pom.Licenses { if l.Name != "" { @@ -82,7 +102,7 @@ func ParsePackageMetaData(r io.Reader) (*Metadata, error) { } return &Metadata{ - GroupID: pom.GroupID, + GroupID: groupID, ArtifactID: pom.ArtifactID, Name: pom.Name, Description: pom.Description, diff --git a/modules/packages/maven/metadata_test.go b/modules/packages/maven/metadata_test.go index d0093013f9..3b087989e6 100644 --- a/modules/packages/maven/metadata_test.go +++ b/modules/packages/maven/metadata_test.go @@ -14,6 +14,7 @@ import ( const ( groupID = "org.gitea" + parentGroupID = "org.gitea.parent" artifactID = "my-project" version = "1.0.1" name = "My Gitea Project" @@ -27,6 +28,11 @@ const ( const pomContent = ` + + ` + parentGroupID + ` + parent-project + 1.0.0 + ` + groupID + ` ` + artifactID + ` ` + version + ` @@ -47,6 +53,24 @@ const pomContent = ` ` +const pomWithParentGroupID = ` + + + ` + parentGroupID + ` + parent-project + 1.0.0 + + + ` + artifactID + ` + ` + version + ` +` + +const pomWithMissingGroupID = ` + + ` + artifactID + ` + ` + version + ` +` + func TestParsePackageMetaData(t *testing.T) { t.Run("InvalidFile", func(t *testing.T) { m, err := ParsePackageMetaData(strings.NewReader("")) @@ -87,4 +111,19 @@ func TestParsePackageMetaData(t *testing.T) { require.NoError(t, err) assert.NotNil(t, m) }) + + t.Run("UseParentGroupID", func(t *testing.T) { + m, err := ParsePackageMetaData(strings.NewReader(pomWithParentGroupID)) + require.NoError(t, err) + assert.NotNil(t, m) + + assert.Equal(t, parentGroupID, m.GroupID) + }) + + t.Run("MissingGroupIDThrowsError", func(t *testing.T) { + m, err := ParsePackageMetaData(strings.NewReader(pomWithMissingGroupID)) + assert.Nil(t, m) + require.Error(t, err) + assert.Equal(t, ErrNoGroupID, err) + }) } diff --git a/modules/packages/multi_hasher.go b/modules/packages/multi_hasher.go index 83a4b5b7af..d2d9a759a8 100644 --- a/modules/packages/multi_hasher.go +++ b/modules/packages/multi_hasher.go @@ -12,28 +12,32 @@ import ( "errors" "hash" "io" + + "golang.org/x/crypto/blake2b" ) const ( - marshaledSizeMD5 = 92 - marshaledSizeSHA1 = 96 - marshaledSizeSHA256 = 108 - marshaledSizeSHA512 = 204 + marshaledSizeMD5 = 92 + marshaledSizeSHA1 = 96 + marshaledSizeSHA256 = 108 + marshaledSizeSHA512 = 204 + marshaledSizeBlake2b = 213 - marshaledSize = marshaledSizeMD5 + marshaledSizeSHA1 + marshaledSizeSHA256 + marshaledSizeSHA512 + marshaledSize = marshaledSizeMD5 + marshaledSizeSHA1 + marshaledSizeSHA256 + marshaledSizeSHA512 + marshaledSizeBlake2b ) // HashSummer provide a Sums method type HashSummer interface { - Sums() (hashMD5, hashSHA1, hashSHA256, hashSHA512 []byte) + Sums() (hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b []byte) } // MultiHasher calculates multiple checksums type MultiHasher struct { - md5 hash.Hash - sha1 hash.Hash - sha256 hash.Hash - sha512 hash.Hash + md5 hash.Hash + sha1 hash.Hash + sha256 hash.Hash + sha512 hash.Hash + blake2b hash.Hash combinedWriter io.Writer } @@ -44,14 +48,16 @@ func NewMultiHasher() *MultiHasher { sha1 := sha1.New() sha256 := sha256.New() sha512 := sha512.New() + blake2b, _ := blake2b.New512(nil) - combinedWriter := io.MultiWriter(md5, sha1, sha256, sha512) + combinedWriter := io.MultiWriter(md5, sha1, sha256, sha512, blake2b) return &MultiHasher{ md5, sha1, sha256, sha512, + blake2b, combinedWriter, } } @@ -74,12 +80,17 @@ func (h *MultiHasher) MarshalBinary() ([]byte, error) { if err != nil { return nil, err } + blake2bBytes, err := h.blake2b.(encoding.BinaryMarshaler).MarshalBinary() + if err != nil { + return nil, err + } b := make([]byte, 0, marshaledSize) b = append(b, md5Bytes...) b = append(b, sha1Bytes...) b = append(b, sha256Bytes...) b = append(b, sha512Bytes...) + b = append(b, blake2bBytes...) return b, nil } @@ -104,7 +115,12 @@ func (h *MultiHasher) UnmarshalBinary(b []byte) error { } b = b[marshaledSizeSHA256:] - return h.sha512.(encoding.BinaryUnmarshaler).UnmarshalBinary(b[:marshaledSizeSHA512]) + if err := h.sha512.(encoding.BinaryUnmarshaler).UnmarshalBinary(b[:marshaledSizeSHA512]); err != nil { + return err + } + + b = b[marshaledSizeSHA512:] + return h.blake2b.(encoding.BinaryUnmarshaler).UnmarshalBinary(b[:marshaledSizeBlake2b]) } // Write implements io.Writer @@ -113,10 +129,11 @@ func (h *MultiHasher) Write(p []byte) (int, error) { } // Sums gets the MD5, SHA1, SHA256 and SHA512 checksums of the data -func (h *MultiHasher) Sums() (hashMD5, hashSHA1, hashSHA256, hashSHA512 []byte) { +func (h *MultiHasher) Sums() (hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b []byte) { hashMD5 = h.md5.Sum(nil) hashSHA1 = h.sha1.Sum(nil) hashSHA256 = h.sha256.Sum(nil) hashSHA512 = h.sha512.Sum(nil) - return hashMD5, hashSHA1, hashSHA256, hashSHA512 + hashBlake2b = h.blake2b.Sum(nil) + return hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b } diff --git a/modules/packages/multi_hasher_test.go b/modules/packages/multi_hasher_test.go index ca333cb0a4..e5a32fc02c 100644 --- a/modules/packages/multi_hasher_test.go +++ b/modules/packages/multi_hasher_test.go @@ -12,10 +12,11 @@ import ( ) const ( - expectedMD5 = "e3bef03c5f3b7f6b3ab3e3053ed71e9c" - expectedSHA1 = "060b3b99f88e96085b4a68e095bc9e3d1d91e1bc" - expectedSHA256 = "6ccce4863b70f258d691f59609d31b4502e1ba5199942d3bc5d35d17a4ce771d" - expectedSHA512 = "7f70e439ba8c52025c1f06cdf6ae443c4b8ed2e90059cdb9bbbf8adf80846f185a24acca9245b128b226d61753b0d7ed46580a69c8999eeff3bc13a4d0bd816c" + expectedMD5 = "e3bef03c5f3b7f6b3ab3e3053ed71e9c" + expectedSHA1 = "060b3b99f88e96085b4a68e095bc9e3d1d91e1bc" + expectedSHA256 = "6ccce4863b70f258d691f59609d31b4502e1ba5199942d3bc5d35d17a4ce771d" + expectedSHA512 = "7f70e439ba8c52025c1f06cdf6ae443c4b8ed2e90059cdb9bbbf8adf80846f185a24acca9245b128b226d61753b0d7ed46580a69c8999eeff3bc13a4d0bd816c" + expectedBlake2b = "b3c3ad15c7e6cca543d651add9427727ffb525120eb23264ee35f16f408a369b599d4404a52d29f642fc0d869f9b55581b60e4e8b9b74997182705d3dcb01edb" ) func TestMultiHasherSums(t *testing.T) { @@ -23,12 +24,13 @@ func TestMultiHasherSums(t *testing.T) { h := NewMultiHasher() h.Write([]byte("gitea")) - hashMD5, hashSHA1, hashSHA256, hashSHA512 := h.Sums() + hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b := h.Sums() assert.Equal(t, expectedMD5, hex.EncodeToString(hashMD5)) assert.Equal(t, expectedSHA1, hex.EncodeToString(hashSHA1)) assert.Equal(t, expectedSHA256, hex.EncodeToString(hashSHA256)) assert.Equal(t, expectedSHA512, hex.EncodeToString(hashSHA512)) + assert.Equal(t, expectedBlake2b, hex.EncodeToString(hashBlake2b)) }) t.Run("State", func(t *testing.T) { @@ -44,11 +46,12 @@ func TestMultiHasherSums(t *testing.T) { h2.Write([]byte("ea")) - hashMD5, hashSHA1, hashSHA256, hashSHA512 := h2.Sums() + hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b := h2.Sums() assert.Equal(t, expectedMD5, hex.EncodeToString(hashMD5)) assert.Equal(t, expectedSHA1, hex.EncodeToString(hashSHA1)) assert.Equal(t, expectedSHA256, hex.EncodeToString(hashSHA256)) assert.Equal(t, expectedSHA512, hex.EncodeToString(hashSHA512)) + assert.Equal(t, expectedBlake2b, hex.EncodeToString(hashBlake2b)) }) } diff --git a/modules/packages/npm/creator.go b/modules/packages/npm/creator.go index 7d3d7cd6b5..ed163d30ac 100644 --- a/modules/packages/npm/creator.go +++ b/modules/packages/npm/creator.go @@ -14,9 +14,9 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/util" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/json" + "forgejo.org/modules/util" + "forgejo.org/modules/validation" "github.com/hashicorp/go-version" ) diff --git a/modules/packages/npm/creator_test.go b/modules/packages/npm/creator_test.go index b2cf1aae0e..5cbaf0d865 100644 --- a/modules/packages/npm/creator_test.go +++ b/modules/packages/npm/creator_test.go @@ -10,7 +10,7 @@ import ( "strings" "testing" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/packages/nuget/metadata.go b/modules/packages/nuget/metadata.go index 1e98ddffde..126a0ad494 100644 --- a/modules/packages/nuget/metadata.go +++ b/modules/packages/nuget/metadata.go @@ -13,8 +13,8 @@ import ( "regexp" "strings" - "code.gitea.io/gitea/modules/util" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/util" + "forgejo.org/modules/validation" "github.com/hashicorp/go-version" ) @@ -57,12 +57,21 @@ type Package struct { // Metadata represents the metadata of a Nuget package type Metadata struct { + Title string `json:"title,omitempty"` + Language string `json:"language,omitempty"` Description string `json:"description,omitempty"` ReleaseNotes string `json:"release_notes,omitempty"` Readme string `json:"readme,omitempty"` Authors string `json:"authors,omitempty"` + Owners string `json:"owners,omitempty"` + Copyright string `json:"copyright,omitempty"` ProjectURL string `json:"project_url,omitempty"` RepositoryURL string `json:"repository_url,omitempty"` + LicenseURL string `json:"license_url,omitempty"` + IconURL string `json:"icon_url,omitempty"` + MinClientVersion string `json:"min_client_version,omitempty"` + Tags string `json:"tags,omitempty"` + DevelopmentDependency bool `json:"development_dependency,omitempty"` RequireLicenseAcceptance bool `json:"require_license_acceptance"` Dependencies map[string][]Dependency `json:"dependencies,omitempty"` } @@ -77,13 +86,22 @@ type Dependency struct { type nuspecPackage struct { Metadata struct { ID string `xml:"id"` + Title string `xml:"title"` + Language string `xml:"language"` Version string `xml:"version"` Authors string `xml:"authors"` + Owners string `xml:"owners"` + Copyright string `xml:"copyright"` + DevelopmentDependency bool `xml:"developmentDependency"` RequireLicenseAcceptance bool `xml:"requireLicenseAcceptance"` ProjectURL string `xml:"projectUrl"` + LicenseURL string `xml:"licenseUrl"` + IconURL string `xml:"iconUrl"` Description string `xml:"description"` ReleaseNotes string `xml:"releaseNotes"` Readme string `xml:"readme"` + Tags string `xml:"tags"` + MinClientVersion string `xml:"minClientVersion,attr"` PackageTypes struct { PackageType []struct { Name string `xml:"name,attr"` @@ -167,11 +185,20 @@ func ParseNuspecMetaData(archive *zip.Reader, r io.Reader) (*Package, error) { } m := &Metadata{ + Title: p.Metadata.Title, + Language: p.Metadata.Language, Description: p.Metadata.Description, ReleaseNotes: p.Metadata.ReleaseNotes, Authors: p.Metadata.Authors, + Owners: p.Metadata.Owners, + Copyright: p.Metadata.Copyright, ProjectURL: p.Metadata.ProjectURL, RepositoryURL: p.Metadata.Repository.URL, + LicenseURL: p.Metadata.LicenseURL, + IconURL: p.Metadata.IconURL, + MinClientVersion: p.Metadata.MinClientVersion, + Tags: p.Metadata.Tags, + DevelopmentDependency: p.Metadata.DevelopmentDependency, RequireLicenseAcceptance: p.Metadata.RequireLicenseAcceptance, Dependencies: make(map[string][]Dependency), } diff --git a/modules/packages/nuget/metadata_test.go b/modules/packages/nuget/metadata_test.go index ecce052be4..8a34f1a5ae 100644 --- a/modules/packages/nuget/metadata_test.go +++ b/modules/packages/nuget/metadata_test.go @@ -13,14 +13,22 @@ import ( ) const ( - id = "System.Gitea" + id = "System.Forgejo" + title = "Package Title" + language = "Package Language" semver = "1.0.1" - authors = "Gitea Authors" - projectURL = "https://gitea.io" + authors = "Forgejo Authors" + owners = "Package Owners" + copyright = "Package Copyright" + projectURL = "https://forgejo.org" + licenseURL = "https://forgejo.org/docs/latest/license/" + iconURL = "https://codeberg.org/forgejo/governance/raw/branch/main/branding/logo/forgejo.png" description = "Package Description" releaseNotes = "Package Release Notes" readme = "Readme" - repositoryURL = "https://gitea.io/gitea/gitea" + tags = "tag_1 tag_2 tag_3" + minClientVersion = "1.0.0.0" + repositoryURL = "https://codeberg.org/forgejo" targetFramework = ".NETStandard2.1" dependencyID = "System.Text.Json" dependencyVersion = "5.0.0" @@ -28,16 +36,24 @@ const ( const nuspecContent = ` - + ` + id + ` + ` + title + ` + ` + language + ` ` + semver + ` ` + authors + ` + ` + owners + ` + ` + copyright + ` + true true ` + projectURL + ` + ` + licenseURL + ` + ` + iconURL + ` ` + description + ` ` + releaseNotes + ` README.md + ` + tags + ` @@ -142,12 +158,22 @@ func TestParsePackageMetaData(t *testing.T) { assert.Equal(t, DependencyPackage, np.PackageType) assert.Equal(t, id, np.ID) + assert.Equal(t, title, np.Metadata.Title) + assert.Equal(t, language, np.Metadata.Language) assert.Equal(t, semver, np.Version) assert.Equal(t, authors, np.Metadata.Authors) + assert.Equal(t, owners, np.Metadata.Owners) + assert.Equal(t, copyright, np.Metadata.Copyright) + assert.True(t, np.Metadata.DevelopmentDependency) + assert.True(t, np.Metadata.RequireLicenseAcceptance) assert.Equal(t, projectURL, np.Metadata.ProjectURL) + assert.Equal(t, licenseURL, np.Metadata.LicenseURL) + assert.Equal(t, iconURL, np.Metadata.IconURL) assert.Equal(t, description, np.Metadata.Description) assert.Equal(t, releaseNotes, np.Metadata.ReleaseNotes) assert.Equal(t, readme, np.Metadata.Readme) + assert.Equal(t, tags, np.Metadata.Tags) + assert.Equal(t, minClientVersion, np.Metadata.MinClientVersion) assert.Equal(t, repositoryURL, np.Metadata.RepositoryURL) assert.Len(t, np.Metadata.Dependencies, 1) assert.Contains(t, np.Metadata.Dependencies, targetFramework) diff --git a/modules/packages/nuget/symbol_extractor.go b/modules/packages/nuget/symbol_extractor.go index 81bf0371a0..992ade7e8f 100644 --- a/modules/packages/nuget/symbol_extractor.go +++ b/modules/packages/nuget/symbol_extractor.go @@ -13,8 +13,8 @@ import ( "path/filepath" "strings" - "code.gitea.io/gitea/modules/packages" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/packages" + "forgejo.org/modules/util" ) var ( diff --git a/modules/packages/pub/metadata.go b/modules/packages/pub/metadata.go index afb464e462..f8afdf7218 100644 --- a/modules/packages/pub/metadata.go +++ b/modules/packages/pub/metadata.go @@ -10,8 +10,8 @@ import ( "regexp" "strings" - "code.gitea.io/gitea/modules/util" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/util" + "forgejo.org/modules/validation" "github.com/hashicorp/go-version" "gopkg.in/yaml.v3" diff --git a/modules/packages/rpm/metadata.go b/modules/packages/rpm/metadata.go index f4f78c2cab..30c91115e7 100644 --- a/modules/packages/rpm/metadata.go +++ b/modules/packages/rpm/metadata.go @@ -8,8 +8,8 @@ import ( "io" "strings" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/validation" "github.com/sassoftware/go-rpmutils" ) @@ -78,11 +78,12 @@ type FileMetadata struct { } type Entry struct { - Name string `json:"name" xml:"name,attr"` - Flags string `json:"flags,omitempty" xml:"flags,attr,omitempty"` - Version string `json:"version,omitempty" xml:"ver,attr,omitempty"` - Epoch string `json:"epoch,omitempty" xml:"epoch,attr,omitempty"` - Release string `json:"release,omitempty" xml:"rel,attr,omitempty"` + Name string `json:"name" xml:"name,attr"` + Flags string `json:"flags,omitempty" xml:"flags,attr,omitempty"` + AltFlags uint32 `json:"alt_flags,omitempty" xml:"alt_flags,attr,omitempty"` + Version string `json:"version,omitempty" xml:"ver,attr,omitempty"` + Epoch string `json:"epoch,omitempty" xml:"epoch,attr,omitempty"` + Release string `json:"release,omitempty" xml:"rel,attr,omitempty"` } type File struct { @@ -98,7 +99,7 @@ type Changelog struct { } // ParsePackage parses the RPM package file -func ParsePackage(r io.Reader) (*Package, error) { +func ParsePackage(r io.Reader, repoType string) (*Package, error) { rpm, err := rpmutils.ReadRpm(r) if err != nil { return nil, err @@ -138,10 +139,10 @@ func ParsePackage(r io.Reader) (*Package, error) { InstalledSize: getUInt64(rpm.Header, rpmutils.SIZE), ArchiveSize: getUInt64(rpm.Header, rpmutils.SIG_PAYLOADSIZE), - Provides: getEntries(rpm.Header, rpmutils.PROVIDENAME, rpmutils.PROVIDEVERSION, rpmutils.PROVIDEFLAGS), - Requires: getEntries(rpm.Header, rpmutils.REQUIRENAME, rpmutils.REQUIREVERSION, rpmutils.REQUIREFLAGS), - Conflicts: getEntries(rpm.Header, rpmutils.CONFLICTNAME, rpmutils.CONFLICTVERSION, rpmutils.CONFLICTFLAGS), - Obsoletes: getEntries(rpm.Header, rpmutils.OBSOLETENAME, rpmutils.OBSOLETEVERSION, rpmutils.OBSOLETEFLAGS), + Provides: getEntries(rpm.Header, rpmutils.PROVIDENAME, rpmutils.PROVIDEVERSION, rpmutils.PROVIDEFLAGS, repoType), + Requires: getEntries(rpm.Header, rpmutils.REQUIRENAME, rpmutils.REQUIREVERSION, rpmutils.REQUIREFLAGS, repoType), + Conflicts: getEntries(rpm.Header, rpmutils.CONFLICTNAME, rpmutils.CONFLICTVERSION, rpmutils.CONFLICTFLAGS, repoType), + Obsoletes: getEntries(rpm.Header, rpmutils.OBSOLETENAME, rpmutils.OBSOLETEVERSION, rpmutils.OBSOLETEFLAGS, repoType), Files: getFiles(rpm.Header), Changelogs: getChangelogs(rpm.Header), }, @@ -170,7 +171,7 @@ func getUInt64(h *rpmutils.RpmHeader, tag int) uint64 { return values[0] } -func getEntries(h *rpmutils.RpmHeader, namesTag, versionsTag, flagsTag int) []*Entry { +func getEntries(h *rpmutils.RpmHeader, namesTag, versionsTag, flagsTag int, repoType string) []*Entry { names, err := h.GetStrings(namesTag) if err != nil || len(names) == 0 { return nil @@ -188,43 +189,54 @@ func getEntries(h *rpmutils.RpmHeader, namesTag, versionsTag, flagsTag int) []*E } entries := make([]*Entry, 0, len(names)) - for i := range names { - e := &Entry{ - Name: names[i], - } - flags := flags[i] - if (flags&rpmutils.RPMSENSE_GREATER) != 0 && (flags&rpmutils.RPMSENSE_EQUAL) != 0 { - e.Flags = "GE" - } else if (flags&rpmutils.RPMSENSE_LESS) != 0 && (flags&rpmutils.RPMSENSE_EQUAL) != 0 { - e.Flags = "LE" - } else if (flags & rpmutils.RPMSENSE_GREATER) != 0 { - e.Flags = "GT" - } else if (flags & rpmutils.RPMSENSE_LESS) != 0 { - e.Flags = "LT" - } else if (flags & rpmutils.RPMSENSE_EQUAL) != 0 { - e.Flags = "EQ" - } - - version := versions[i] - if version != "" { - parts := strings.Split(version, "-") - - versionParts := strings.Split(parts[0], ":") - if len(versionParts) == 2 { - e.Version = versionParts[1] - e.Epoch = versionParts[0] - } else { - e.Version = versionParts[0] - e.Epoch = "0" + switch repoType { + case "rpm": + for i := range names { + e := &Entry{ + Name: names[i], } - if len(parts) > 1 { - e.Release = parts[1] + flags := flags[i] + if (flags&rpmutils.RPMSENSE_GREATER) != 0 && (flags&rpmutils.RPMSENSE_EQUAL) != 0 { + e.Flags = "GE" + } else if (flags&rpmutils.RPMSENSE_LESS) != 0 && (flags&rpmutils.RPMSENSE_EQUAL) != 0 { + e.Flags = "LE" + } else if (flags & rpmutils.RPMSENSE_GREATER) != 0 { + e.Flags = "GT" + } else if (flags & rpmutils.RPMSENSE_LESS) != 0 { + e.Flags = "LT" + } else if (flags & rpmutils.RPMSENSE_EQUAL) != 0 { + e.Flags = "EQ" } - } - entries = append(entries, e) + version := versions[i] + if version != "" { + parts := strings.Split(version, "-") + + versionParts := strings.Split(parts[0], ":") + if len(versionParts) == 2 { + e.Version = versionParts[1] + e.Epoch = versionParts[0] + } else { + e.Version = versionParts[0] + e.Epoch = "0" + } + + if len(parts) > 1 { + e.Release = parts[1] + } + } + entries = append(entries, e) + } + case "alt": + for i := range names { + e := &Entry{ + AltFlags: uint32(flags[i]), + } + e.Version = versions[i] + entries = append(entries, e) + } } return entries } diff --git a/modules/packages/rpm/metadata_test.go b/modules/packages/rpm/metadata_test.go index dc9b480723..05f53ea446 100644 --- a/modules/packages/rpm/metadata_test.go +++ b/modules/packages/rpm/metadata_test.go @@ -48,7 +48,7 @@ Mu0UFYgZ/bYnuvn/vz4wtCz8qMwsHUvP0PX3tbYFUctAPdrY6tiiDtcCddDECahx7SuVNP5dpmb5 zr, err := gzip.NewReader(bytes.NewReader(rpmPackageContent)) require.NoError(t, err) - p, err := ParsePackage(zr) + p, err := ParsePackage(zr, "rpm") assert.NotNil(t, p) require.NoError(t, err) diff --git a/modules/packages/rubygems/marshal.go b/modules/packages/rubygems/marshal.go index 4e6a5fc5f8..191efc7c0e 100644 --- a/modules/packages/rubygems/marshal.go +++ b/modules/packages/rubygems/marshal.go @@ -9,7 +9,7 @@ import ( "io" "reflect" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/util" ) const ( diff --git a/modules/packages/rubygems/metadata.go b/modules/packages/rubygems/metadata.go index 8a9794860e..6d021a17ab 100644 --- a/modules/packages/rubygems/metadata.go +++ b/modules/packages/rubygems/metadata.go @@ -10,8 +10,8 @@ import ( "regexp" "strings" - "code.gitea.io/gitea/modules/util" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/util" + "forgejo.org/modules/validation" "gopkg.in/yaml.v3" ) diff --git a/modules/packages/swift/metadata.go b/modules/packages/swift/metadata.go index 24c4262ab7..34fc4f1784 100644 --- a/modules/packages/swift/metadata.go +++ b/modules/packages/swift/metadata.go @@ -11,9 +11,9 @@ import ( "regexp" "strings" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/util" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/json" + "forgejo.org/modules/util" + "forgejo.org/modules/validation" "github.com/hashicorp/go-version" ) diff --git a/modules/packages/vagrant/metadata.go b/modules/packages/vagrant/metadata.go index 6789533339..24684249b7 100644 --- a/modules/packages/vagrant/metadata.go +++ b/modules/packages/vagrant/metadata.go @@ -9,8 +9,8 @@ import ( "io" "strings" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/json" + "forgejo.org/modules/validation" ) const ( diff --git a/modules/packages/vagrant/metadata_test.go b/modules/packages/vagrant/metadata_test.go index f467781a08..f1950685be 100644 --- a/modules/packages/vagrant/metadata_test.go +++ b/modules/packages/vagrant/metadata_test.go @@ -10,7 +10,7 @@ import ( "io" "testing" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/pprof/pprof.go b/modules/pprof/pprof.go index c611c14270..d46790458e 100644 --- a/modules/pprof/pprof.go +++ b/modules/pprof/pprof.go @@ -9,7 +9,7 @@ import ( "runtime" "runtime/pprof" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // DumpMemProfileForUsername dumps a memory profile at pprofDataPath as memprofile__ diff --git a/modules/private/actions.go b/modules/private/actions.go index 311a283650..8e4b44c226 100644 --- a/modules/private/actions.go +++ b/modules/private/actions.go @@ -6,7 +6,7 @@ package private import ( "context" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" ) type GenerateTokenRequest struct { diff --git a/modules/private/forgejo_actions.go b/modules/private/forgejo_actions.go deleted file mode 100644 index 133d5e253f..0000000000 --- a/modules/private/forgejo_actions.go +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-License-Identifier: MIT - -package private - -import ( - "context" - - "code.gitea.io/gitea/modules/setting" -) - -type ActionsRunnerRegisterRequest struct { - Token string - Scope string - Labels []string - Name string - Version string -} - -func ActionsRunnerRegister(ctx context.Context, token, scope string, labels []string, name, version string) (string, ResponseExtra) { - reqURL := setting.LocalURL + "api/internal/actions/register" - - req := newInternalRequest(ctx, reqURL, "POST", ActionsRunnerRegisterRequest{ - Token: token, - Scope: scope, - Labels: labels, - Name: name, - Version: version, - }) - - resp, extra := requestJSONResp(req, &ResponseText{}) - return resp.Text, extra -} diff --git a/modules/private/hook.go b/modules/private/hook.go index 93cbcd469d..2d64c1dec9 100644 --- a/modules/private/hook.go +++ b/modules/private/hook.go @@ -9,10 +9,10 @@ import ( "net/url" "time" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/git/pushoptions" - "code.gitea.io/gitea/modules/repository" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/git" + "forgejo.org/modules/git/pushoptions" + "forgejo.org/modules/repository" + "forgejo.org/modules/setting" ) // Git environment variables diff --git a/modules/private/internal.go b/modules/private/internal.go index 9c330a24a8..65fddbbe6b 100644 --- a/modules/private/internal.go +++ b/modules/private/internal.go @@ -13,11 +13,11 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/httplib" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/proxyprotocol" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/httplib" + "forgejo.org/modules/json" + "forgejo.org/modules/log" + "forgejo.org/modules/proxyprotocol" + "forgejo.org/modules/setting" ) // Response is used for internal request response (for user message and error message) diff --git a/modules/private/key.go b/modules/private/key.go index dcd1714856..422ff16d9a 100644 --- a/modules/private/key.go +++ b/modules/private/key.go @@ -7,7 +7,7 @@ import ( "context" "fmt" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" ) // UpdatePublicKeyInRepo update public key and if necessary deploy key updates diff --git a/modules/private/mail.go b/modules/private/mail.go index 08de5b7e28..f6054f9c74 100644 --- a/modules/private/mail.go +++ b/modules/private/mail.go @@ -6,7 +6,7 @@ package private import ( "context" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" ) // Email structure holds a data for sending general emails diff --git a/modules/private/manager.go b/modules/private/manager.go index 6055e553bd..fa2e0b0d40 100644 --- a/modules/private/manager.go +++ b/modules/private/manager.go @@ -12,7 +12,7 @@ import ( "strconv" "time" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" ) // Shutdown calls the internal shutdown function diff --git a/modules/private/request.go b/modules/private/request.go index 58cd261239..b80167adb6 100644 --- a/modules/private/request.go +++ b/modules/private/request.go @@ -8,8 +8,8 @@ import ( "io" "net/http" - "code.gitea.io/gitea/modules/httplib" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/httplib" + "forgejo.org/modules/json" ) // ResponseText is used to get the response as text, instead of parsing it as JSON. diff --git a/modules/private/restore_repo.go b/modules/private/restore_repo.go index 496209d3cb..2192d3048d 100644 --- a/modules/private/restore_repo.go +++ b/modules/private/restore_repo.go @@ -8,7 +8,7 @@ import ( "fmt" "time" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" ) // RestoreParams structure holds a data for restore repository diff --git a/modules/private/serv.go b/modules/private/serv.go index 480a446954..af4a016cb8 100644 --- a/modules/private/serv.go +++ b/modules/private/serv.go @@ -8,10 +8,10 @@ import ( "fmt" "net/url" - asymkey_model "code.gitea.io/gitea/models/asymkey" - "code.gitea.io/gitea/models/perm" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/setting" + asymkey_model "forgejo.org/models/asymkey" + "forgejo.org/models/perm" + user_model "forgejo.org/models/user" + "forgejo.org/modules/setting" ) // KeyAndOwner is the response from ServNoCommand @@ -40,6 +40,7 @@ type ServCommandResults struct { UserName string UserEmail string UserID int64 + UserMode perm.AccessMode OwnerName string RepoName string RepoID int64 diff --git a/modules/process/manager.go b/modules/process/manager.go index 37098ad92f..062ee1482f 100644 --- a/modules/process/manager.go +++ b/modules/process/manager.go @@ -7,6 +7,7 @@ package process import ( "context" "runtime/pprof" + "runtime/trace" "strconv" "sync" "sync/atomic" @@ -126,6 +127,27 @@ func (pm *Manager) AddTypedContext(parent context.Context, description, processT return ctx, cancel, finished } +// AddTypedContextTimeout creates a new context and adds it as a process. Once the process is finished, finished must be called +// to remove the process from the process table. It should not be called until the process is finished but must always be called. +// +// cancel should be used to cancel the returned context, however it will not remove the process from the process table. +// finished will cancel the returned context and remove it from the process table. +// +// Most processes will not need to use the cancel function but there will be cases whereby you want to cancel the process but not immediately remove it from the +// process table. +func (pm *Manager) AddTypedContextTimeout(parent context.Context, timeout time.Duration, description, processType string, currentlyRunning bool) (ctx context.Context, cancel context.CancelFunc, finished FinishedFunc) { + if timeout <= 0 { + // it's meaningless to use timeout <= 0, and it must be a bug! so we must panic here to tell developers to make the timeout correct + panic("the timeout must be greater than zero, otherwise the context will be cancelled immediately") + } + + ctx, cancel = context.WithTimeout(parent, timeout) + + ctx, _, finished = pm.Add(ctx, description, cancel, processType, currentlyRunning) + + return ctx, cancel, finished +} + // AddContextTimeout creates a new context and add it as a process. Once the process is finished, finished must be called // to remove the process from the process table. It should not be called until the process is finished but must always be called. // @@ -135,16 +157,7 @@ func (pm *Manager) AddTypedContext(parent context.Context, description, processT // Most processes will not need to use the cancel function but there will be cases whereby you want to cancel the process but not immediately remove it from the // process table. func (pm *Manager) AddContextTimeout(parent context.Context, timeout time.Duration, description string) (ctx context.Context, cancel context.CancelFunc, finished FinishedFunc) { - if timeout <= 0 { - // it's meaningless to use timeout <= 0, and it must be a bug! so we must panic here to tell developers to make the timeout correct - panic("the timeout must be greater than zero, otherwise the context will be cancelled immediately") - } - - ctx, cancel = context.WithTimeout(parent, timeout) - - ctx, _, finished = pm.Add(ctx, description, cancel, NormalProcessType, true) - - return ctx, cancel, finished + return pm.AddTypedContextTimeout(parent, timeout, description, NormalProcessType, true) } // Add create a new process @@ -159,6 +172,8 @@ func (pm *Manager) Add(ctx context.Context, description string, cancel context.C parentPID = "" } + ctx, traceTask := trace.NewTask(ctx, processType) + process := &process{ PID: pid, ParentPID: parentPID, @@ -166,6 +181,7 @@ func (pm *Manager) Add(ctx context.Context, description string, cancel context.C Start: start, Cancel: cancel, Type: processType, + TraceTrask: traceTask, } var finished FinishedFunc @@ -218,6 +234,7 @@ func (pm *Manager) nextPID() (start time.Time, pid IDType) { } func (pm *Manager) remove(process *process) { + process.TraceTrask.End() deleted := false pm.mutex.Lock() diff --git a/modules/process/manager_stacktraces.go b/modules/process/manager_stacktraces.go index e260893113..a603e6a9f2 100644 --- a/modules/process/manager_stacktraces.go +++ b/modules/process/manager_stacktraces.go @@ -4,8 +4,8 @@ package process import ( + "bytes" "fmt" - "io" "runtime/pprof" "sort" "time" @@ -175,13 +175,12 @@ func (pm *Manager) ProcessStacktraces(flat, noSystem bool) ([]*Process, int, int // Now from within the lock we need to get the goroutines. // Why? If we release the lock then between between filling the above map and getting // the stacktraces another process could be created which would then look like a dead process below - reader, writer := io.Pipe() - defer reader.Close() - go func() { - err := pprof.Lookup("goroutine").WriteTo(writer, 0) - _ = writer.CloseWithError(err) - }() - stacks, err = profile.Parse(reader) + var buf bytes.Buffer + if err := pprof.Lookup("goroutine").WriteTo(&buf, 0); err != nil { + return nil, 0, 0, err + } + + stacks, err = profile.ParseData(buf.Bytes()) if err != nil { return nil, 0, 0, err } diff --git a/modules/process/manager_stacktraces_test.go b/modules/process/manager_stacktraces_test.go new file mode 100644 index 0000000000..509b424d8b --- /dev/null +++ b/modules/process/manager_stacktraces_test.go @@ -0,0 +1,92 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package process + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestProcessStacktraces(t *testing.T) { + _, _, finish := GetManager().AddContext(t.Context(), "Normal process") + defer finish() + parentCtx, _, finish := GetManager().AddContext(t.Context(), "Children normal process") + defer finish() + _, _, finish = GetManager().AddContext(parentCtx, "Children process") + defer finish() + _, _, finish = GetManager().AddTypedContext(t.Context(), "System process", SystemProcessType, true) + defer finish() + + t.Run("No flat with no system process", func(t *testing.T) { + processes, processCount, _, err := GetManager().ProcessStacktraces(false, true) + require.NoError(t, err) + assert.EqualValues(t, 4, processCount) + assert.Len(t, processes, 2) + + assert.EqualValues(t, "Children normal process", processes[0].Description) + assert.EqualValues(t, NormalProcessType, processes[0].Type) + assert.Empty(t, processes[0].ParentPID) + assert.Len(t, processes[0].Children, 1) + + assert.EqualValues(t, "Children process", processes[0].Children[0].Description) + assert.EqualValues(t, processes[0].PID, processes[0].Children[0].ParentPID) + + assert.EqualValues(t, "Normal process", processes[1].Description) + assert.EqualValues(t, NormalProcessType, processes[1].Type) + assert.Empty(t, processes[1].ParentPID) + assert.Empty(t, processes[1].Children) + }) + + t.Run("Flat with no system process", func(t *testing.T) { + processes, processCount, _, err := GetManager().ProcessStacktraces(true, true) + require.NoError(t, err) + assert.EqualValues(t, 4, processCount) + assert.Len(t, processes, 3) + + assert.EqualValues(t, "Children process", processes[0].Description) + assert.EqualValues(t, NormalProcessType, processes[0].Type) + assert.EqualValues(t, processes[1].PID, processes[0].ParentPID) + assert.Empty(t, processes[0].Children) + + assert.EqualValues(t, "Children normal process", processes[1].Description) + assert.EqualValues(t, NormalProcessType, processes[1].Type) + assert.Empty(t, processes[1].ParentPID) + assert.Empty(t, processes[1].Children) + + assert.EqualValues(t, "Normal process", processes[2].Description) + assert.EqualValues(t, NormalProcessType, processes[2].Type) + assert.Empty(t, processes[2].ParentPID) + assert.Empty(t, processes[2].Children) + }) + + t.Run("System process", func(t *testing.T) { + processes, processCount, _, err := GetManager().ProcessStacktraces(false, false) + require.NoError(t, err) + assert.EqualValues(t, 4, processCount) + assert.Len(t, processes, 4) + + assert.EqualValues(t, "System process", processes[0].Description) + assert.EqualValues(t, SystemProcessType, processes[0].Type) + assert.Empty(t, processes[0].ParentPID) + assert.Empty(t, processes[0].Children) + + assert.EqualValues(t, "Children normal process", processes[1].Description) + assert.EqualValues(t, NormalProcessType, processes[1].Type) + assert.Empty(t, processes[1].ParentPID) + assert.Len(t, processes[1].Children, 1) + + assert.EqualValues(t, "Normal process", processes[2].Description) + assert.EqualValues(t, NormalProcessType, processes[2].Type) + assert.Empty(t, processes[2].ParentPID) + assert.Empty(t, processes[2].Children) + + // This is the "main" pid, testing code always runs in a goroutine. + assert.EqualValues(t, "(unassociated)", processes[3].Description) + assert.EqualValues(t, NoneProcessType, processes[3].Type) + assert.Empty(t, processes[3].ParentPID) + assert.Empty(t, processes[3].Children) + }) +} diff --git a/modules/process/manager_test.go b/modules/process/manager_test.go index 36b2a912ea..0d637c8acc 100644 --- a/modules/process/manager_test.go +++ b/modules/process/manager_test.go @@ -23,7 +23,7 @@ func TestGetManager(t *testing.T) { func TestManager_AddContext(t *testing.T) { pm := Manager{processMap: make(map[IDType]*process), next: 1} - ctx, cancel := context.WithCancel(context.Background()) + ctx, cancel := context.WithCancel(t.Context()) defer cancel() p1Ctx, _, finished := pm.AddContext(ctx, "foo") @@ -42,7 +42,7 @@ func TestManager_AddContext(t *testing.T) { func TestManager_Cancel(t *testing.T) { pm := Manager{processMap: make(map[IDType]*process), next: 1} - ctx, _, finished := pm.AddContext(context.Background(), "foo") + ctx, _, finished := pm.AddContext(t.Context(), "foo") defer finished() pm.Cancel(GetPID(ctx)) @@ -54,7 +54,7 @@ func TestManager_Cancel(t *testing.T) { } finished() - ctx, cancel, finished := pm.AddContext(context.Background(), "foo") + ctx, cancel, finished := pm.AddContext(t.Context(), "foo") defer finished() cancel() @@ -70,7 +70,7 @@ func TestManager_Cancel(t *testing.T) { func TestManager_Remove(t *testing.T) { pm := Manager{processMap: make(map[IDType]*process), next: 1} - ctx, cancel := context.WithCancel(context.Background()) + ctx, cancel := context.WithCancel(t.Context()) defer cancel() p1Ctx, _, finished := pm.AddContext(ctx, "foo") diff --git a/modules/process/manager_unix.go b/modules/process/manager_unix.go index c5be906b35..54dd6dc485 100644 --- a/modules/process/manager_unix.go +++ b/modules/process/manager_unix.go @@ -1,8 +1,6 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -//go:build !windows - package process import ( diff --git a/modules/process/manager_windows.go b/modules/process/manager_windows.go deleted file mode 100644 index 44a84f2203..0000000000 --- a/modules/process/manager_windows.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2022 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -//go:build windows - -package process - -import ( - "os/exec" -) - -// SetSysProcAttribute sets the common SysProcAttrs for commands -func SetSysProcAttribute(cmd *exec.Cmd) { - // Do nothing -} diff --git a/modules/process/process.go b/modules/process/process.go index 06a28c4a60..8947eb252f 100644 --- a/modules/process/process.go +++ b/modules/process/process.go @@ -5,12 +5,14 @@ package process import ( "context" + "runtime/trace" "time" ) var ( SystemProcessType = "system" RequestProcessType = "request" + GitProcessType = "git" NormalProcessType = "normal" NoneProcessType = "none" ) @@ -23,6 +25,7 @@ type process struct { Start time.Time Cancel context.CancelFunc Type string + TraceTrask *trace.Task } // ToProcess converts a process to a externally usable Process diff --git a/modules/proxy/proxy.go b/modules/proxy/proxy.go index 1a6bdad7fb..8c460dba30 100644 --- a/modules/proxy/proxy.go +++ b/modules/proxy/proxy.go @@ -10,8 +10,8 @@ import ( "strings" "sync" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" "github.com/gobwas/glob" ) diff --git a/modules/proxyprotocol/conn.go b/modules/proxyprotocol/conn.go index f437f13683..beac5de120 100644 --- a/modules/proxyprotocol/conn.go +++ b/modules/proxyprotocol/conn.go @@ -14,7 +14,7 @@ import ( "sync" "time" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) var ( diff --git a/modules/public/public.go b/modules/public/public.go index abc6b46158..174936fd4a 100644 --- a/modules/public/public.go +++ b/modules/public/public.go @@ -12,12 +12,12 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/assetfs" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/httpcache" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/assetfs" + "forgejo.org/modules/container" + "forgejo.org/modules/httpcache" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" ) func CustomAssets() *assetfs.Layer { diff --git a/modules/public/public_test.go b/modules/public/public_test.go index 5e4bf5d671..4bfbb7ef31 100644 --- a/modules/public/public_test.go +++ b/modules/public/public_test.go @@ -6,7 +6,7 @@ package public import ( "testing" - "code.gitea.io/gitea/modules/container" + "forgejo.org/modules/container" "github.com/stretchr/testify/assert" ) diff --git a/modules/public/serve_dynamic.go b/modules/public/serve_dynamic.go index a668b17c34..e5bd89b1cd 100644 --- a/modules/public/serve_dynamic.go +++ b/modules/public/serve_dynamic.go @@ -6,8 +6,8 @@ package public import ( - "code.gitea.io/gitea/modules/assetfs" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/assetfs" + "forgejo.org/modules/setting" ) func BuiltinAssets() *assetfs.Layer { diff --git a/modules/public/serve_static.go b/modules/public/serve_static.go index e79085021e..e19bd976eb 100644 --- a/modules/public/serve_static.go +++ b/modules/public/serve_static.go @@ -8,8 +8,8 @@ package public import ( "time" - "code.gitea.io/gitea/modules/assetfs" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/assetfs" + "forgejo.org/modules/timeutil" ) var _ GzipBytesProvider = (*vfsgenÛ°CompressedFileInfo)(nil) diff --git a/modules/queue/base_channel.go b/modules/queue/base_channel.go index dd8ccb15f4..1be4edf144 100644 --- a/modules/queue/base_channel.go +++ b/modules/queue/base_channel.go @@ -9,7 +9,7 @@ import ( "sync" "time" - "code.gitea.io/gitea/modules/container" + "forgejo.org/modules/container" ) var errChannelClosed = errors.New("channel is closed") diff --git a/modules/queue/base_levelqueue.go b/modules/queue/base_levelqueue.go index efc57c9c9c..12c805c0be 100644 --- a/modules/queue/base_levelqueue.go +++ b/modules/queue/base_levelqueue.go @@ -7,10 +7,10 @@ import ( "context" "sync/atomic" - "code.gitea.io/gitea/modules/nosql" - "code.gitea.io/gitea/modules/queue/lqinternal" + "forgejo.org/modules/nosql" + "forgejo.org/modules/queue/lqinternal" - "gitea.com/lunny/levelqueue" + "code.forgejo.org/forgejo/levelqueue" "github.com/syndtr/goleveldb/leveldb" ) diff --git a/modules/queue/base_levelqueue_common.go b/modules/queue/base_levelqueue_common.go index 78d3b85a8a..8b4f35c47d 100644 --- a/modules/queue/base_levelqueue_common.go +++ b/modules/queue/base_levelqueue_common.go @@ -11,9 +11,9 @@ import ( "sync" "time" - "code.gitea.io/gitea/modules/nosql" + "forgejo.org/modules/nosql" - "gitea.com/lunny/levelqueue" + "code.forgejo.org/forgejo/levelqueue" "github.com/syndtr/goleveldb/leveldb" ) diff --git a/modules/queue/base_levelqueue_test.go b/modules/queue/base_levelqueue_test.go index b65b570c4b..0f02b9f3ee 100644 --- a/modules/queue/base_levelqueue_test.go +++ b/modules/queue/base_levelqueue_test.go @@ -6,10 +6,10 @@ package queue import ( "testing" - "code.gitea.io/gitea/modules/queue/lqinternal" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/queue/lqinternal" + "forgejo.org/modules/setting" - "gitea.com/lunny/levelqueue" + "code.forgejo.org/forgejo/levelqueue" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/syndtr/goleveldb/leveldb" diff --git a/modules/queue/base_levelqueue_unique.go b/modules/queue/base_levelqueue_unique.go index 968a4e98d4..91d2e68500 100644 --- a/modules/queue/base_levelqueue_unique.go +++ b/modules/queue/base_levelqueue_unique.go @@ -8,10 +8,10 @@ import ( "sync" "sync/atomic" - "code.gitea.io/gitea/modules/nosql" - "code.gitea.io/gitea/modules/queue/lqinternal" + "forgejo.org/modules/nosql" + "forgejo.org/modules/queue/lqinternal" - "gitea.com/lunny/levelqueue" + "code.forgejo.org/forgejo/levelqueue" "github.com/syndtr/goleveldb/leveldb" ) diff --git a/modules/queue/base_redis.go b/modules/queue/base_redis.go index 62df30f68f..ec3c6dc16d 100644 --- a/modules/queue/base_redis.go +++ b/modules/queue/base_redis.go @@ -8,9 +8,9 @@ import ( "sync" "time" - "code.gitea.io/gitea/modules/graceful" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/nosql" + "forgejo.org/modules/graceful" + "forgejo.org/modules/log" + "forgejo.org/modules/nosql" "github.com/redis/go-redis/v9" ) diff --git a/modules/queue/base_redis_test.go b/modules/queue/base_redis_test.go index fa1700dc2e..bf3ad5b97b 100644 --- a/modules/queue/base_redis_test.go +++ b/modules/queue/base_redis_test.go @@ -7,8 +7,8 @@ import ( "context" "testing" - "code.gitea.io/gitea/modules/queue/mock" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/queue/mock" + "forgejo.org/modules/setting" "github.com/redis/go-redis/v9" "github.com/stretchr/testify/suite" diff --git a/modules/queue/base_redis_with_server_test.go b/modules/queue/base_redis_with_server_test.go index b73404f4e5..e1f552bfb2 100644 --- a/modules/queue/base_redis_with_server_test.go +++ b/modules/queue/base_redis_with_server_test.go @@ -7,8 +7,8 @@ import ( "testing" "time" - "code.gitea.io/gitea/modules/nosql" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/nosql" + "forgejo.org/modules/setting" "github.com/stretchr/testify/suite" ) diff --git a/modules/queue/base_test.go b/modules/queue/base_test.go index a5600fea63..d852a80b16 100644 --- a/modules/queue/base_test.go +++ b/modules/queue/base_test.go @@ -18,7 +18,7 @@ func testQueueBasic(t *testing.T, newFn func(cfg *BaseConfig) (baseQueue, error) q, err := newFn(cfg) require.NoError(t, err) - ctx := context.Background() + ctx := t.Context() _ = q.RemoveAll(ctx) cnt, err := q.Len(ctx) require.NoError(t, err) @@ -122,7 +122,7 @@ func TestBaseDummy(t *testing.T) { q, err := newBaseDummy(&BaseConfig{}, true) require.NoError(t, err) - ctx := context.Background() + ctx := t.Context() require.NoError(t, q.PushItem(ctx, []byte("foo"))) cnt, err := q.Len(ctx) diff --git a/modules/queue/config.go b/modules/queue/config.go index c5bc16b6f0..f736a5aa12 100644 --- a/modules/queue/config.go +++ b/modules/queue/config.go @@ -4,7 +4,7 @@ package queue import ( - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" ) type BaseConfig struct { diff --git a/modules/queue/manager.go b/modules/queue/manager.go index 8b964c0c28..8f1a93f273 100644 --- a/modules/queue/manager.go +++ b/modules/queue/manager.go @@ -8,8 +8,8 @@ import ( "sync" "time" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" ) // Manager is a manager for the queues created by "CreateXxxQueue" functions, these queues are called "managed queues". diff --git a/modules/queue/manager_test.go b/modules/queue/manager_test.go index a76c238752..bd6e314493 100644 --- a/modules/queue/manager_test.go +++ b/modules/queue/manager_test.go @@ -4,11 +4,10 @@ package queue import ( - "context" "path/filepath" "testing" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -81,7 +80,7 @@ MAX_WORKERS = 123 require.NoError(t, err) - q1 := createWorkerPoolQueue[string](context.Background(), "no-such", cfgProvider, nil, false) + q1 := createWorkerPoolQueue[string](t.Context(), "no-such", cfgProvider, nil, false) assert.Equal(t, "no-such", q1.GetName()) assert.Equal(t, "dummy", q1.GetType()) // no handler, so it becomes dummy assert.Equal(t, filepath.Join(setting.AppDataPath, "queues/dir1"), q1.baseConfig.DataFullDir) @@ -97,7 +96,7 @@ MAX_WORKERS = 123 assert.Equal(t, "string", q1.GetItemTypeName()) qid1 := GetManager().qidCounter - q2 := createWorkerPoolQueue(context.Background(), "sub", cfgProvider, func(s ...int) (unhandled []int) { return nil }, false) + q2 := createWorkerPoolQueue(t.Context(), "sub", cfgProvider, func(s ...int) (unhandled []int) { return nil }, false) assert.Equal(t, "sub", q2.GetName()) assert.Equal(t, "level", q2.GetType()) assert.Equal(t, filepath.Join(setting.AppDataPath, "queues/dir2"), q2.baseConfig.DataFullDir) @@ -119,7 +118,7 @@ MAX_WORKERS = 123 assert.Equal(t, 120, q1.workerMaxNum) stop := runWorkerPoolQueue(q2) - require.NoError(t, GetManager().GetManagedQueue(qid2).FlushWithContext(context.Background(), 0)) - require.NoError(t, GetManager().FlushAll(context.Background(), 0)) + require.NoError(t, GetManager().GetManagedQueue(qid2).FlushWithContext(t.Context(), 0)) + require.NoError(t, GetManager().FlushAll(t.Context(), 0)) stop() } diff --git a/modules/queue/mock/redisuniversalclient.go b/modules/queue/mock/redisuniversalclient.go index 36e4b7cd5d..65bac755d1 100644 --- a/modules/queue/mock/redisuniversalclient.go +++ b/modules/queue/mock/redisuniversalclient.go @@ -1,9 +1,9 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: code.gitea.io/gitea/modules/nosql (interfaces: RedisClient) +// Source: forgejo.org/modules/nosql (interfaces: RedisClient) // // Generated by this command: // -// mockgen -package mock -destination ./modules/queue/mock/redisuniversalclient.go code.gitea.io/gitea/modules/nosql RedisClient +// mockgen -package mock -destination ./modules/queue/mock/redisuniversalclient.go forgejo.org/modules/nosql RedisClient // // Package mock is a generated GoMock package. diff --git a/modules/queue/queue.go b/modules/queue/queue.go index 56835014a5..f16b3c1f34 100644 --- a/modules/queue/queue.go +++ b/modules/queue/queue.go @@ -61,7 +61,7 @@ // func handler(items ...*mypkg.QueueItem) []*mypkg.QueueItem { ... } package queue -import "code.gitea.io/gitea/modules/util" +import "forgejo.org/modules/util" type HandlerFuncT[T any] func(...T) (unhandled []T) diff --git a/modules/queue/workergroup.go b/modules/queue/workergroup.go index ea4c0020c5..3fb821ce69 100644 --- a/modules/queue/workergroup.go +++ b/modules/queue/workergroup.go @@ -10,7 +10,7 @@ import ( "sync/atomic" "time" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) var ( diff --git a/modules/queue/workerqueue.go b/modules/queue/workerqueue.go index 041ce9a3f2..6a71fc4fb4 100644 --- a/modules/queue/workerqueue.go +++ b/modules/queue/workerqueue.go @@ -10,10 +10,10 @@ import ( "sync/atomic" "time" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/process" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/json" + "forgejo.org/modules/log" + "forgejo.org/modules/process" + "forgejo.org/modules/setting" ) // WorkerPoolQueue is a queue that uses a pool of workers to process items diff --git a/modules/queue/workerqueue_test.go b/modules/queue/workerqueue_test.go index 4cfe8ede97..5ae1a701b2 100644 --- a/modules/queue/workerqueue_test.go +++ b/modules/queue/workerqueue_test.go @@ -5,15 +5,14 @@ package queue import ( "bytes" - "context" "runtime" "strconv" "sync" "testing" "time" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/test" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -59,7 +58,7 @@ func TestWorkerPoolQueueUnhandled(t *testing.T) { testRecorder.Record("push:%v", i) require.NoError(t, q.Push(i)) } - require.NoError(t, q.FlushWithContext(context.Background(), 0)) + require.NoError(t, q.FlushWithContext(t.Context(), 0)) stop() ok := true @@ -167,7 +166,7 @@ func testWorkerPoolQueuePersistence(t *testing.T, queueSetting setting.QueueSett q, _ := newWorkerPoolQueueForTest("pr_patch_checker_test", queueSetting, testHandler, true) stop := runWorkerPoolQueue(q) - require.NoError(t, q.FlushWithContext(context.Background(), 0)) + require.NoError(t, q.FlushWithContext(t.Context(), 0)) stop() } diff --git a/modules/recaptcha/recaptcha.go b/modules/recaptcha/recaptcha.go index 1777d169c1..95b0a77a43 100644 --- a/modules/recaptcha/recaptcha.go +++ b/modules/recaptcha/recaptcha.go @@ -11,9 +11,9 @@ import ( "net/url" "strings" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/json" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" ) // Response is the structure of JSON returned from API diff --git a/modules/references/references.go b/modules/references/references.go index c61d06d5dc..f008826e04 100644 --- a/modules/references/references.go +++ b/modules/references/references.go @@ -11,10 +11,10 @@ import ( "strings" "sync" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/markup/mdstripper" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/markup/mdstripper" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" ) var ( @@ -32,7 +32,7 @@ var ( // issueNumericPattern matches string that references to a numeric issue, e.g. #1287 issueNumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[|\'|\")([#!][0-9]+)(?:\s|$|\)|\]|\'|\"|[:;,.?!]\s|[:;,.?!]$)`) // issueAlphanumericPattern matches string that references to an alphanumeric issue, e.g. ABC-1234 - issueAlphanumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[|\"|\')([A-Z]{1,10}-[1-9][0-9]*)(?:\s|$|\)|\]|:|\.(\s|$)|\"|\')`) + issueAlphanumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[|\"|\')([A-Z]{1,10}-[1-9][0-9]*)(?:\s|$|\)|\]|:|\.(\s|$)|\"|\'|,)`) // crossReferenceIssueNumericPattern matches string that references a numeric issue in a different repository // e.g. org/repo#12345 crossReferenceIssueNumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[)([0-9a-zA-Z-_\.]+/[0-9a-zA-Z-_\.]+[#!][0-9]+)(?:\s|$|\)|\]|[:;,.?!]\s|[:;,.?!]$)`) @@ -460,7 +460,8 @@ func findAllIssueReferencesBytes(content []byte, links []string) []*rawReference } parts := strings.Split(u.EscapedPath(), "/") // /user/repo/issues/3 - if len(parts) != 5 || parts[0] != "" { + // /user/repo/pulls/7/files/... + if len(parts) < 5 || parts[0] != "" { continue } var sep string diff --git a/modules/references/references_test.go b/modules/references/references_test.go index ffa7f993e3..5dc6cd94fe 100644 --- a/modules/references/references_test.go +++ b/modules/references/references_test.go @@ -7,7 +7,7 @@ import ( "regexp" "testing" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" ) @@ -132,6 +132,30 @@ func TestFindAllIssueReferences(t *testing.T) { {203, "user4", "repo5", "203", true, XRefActionNone, nil, nil, ""}, }, }, + { + "This http://gitea.com:3000/user4/repo5/pulls/202#x yes.", + []testResult{ + {202, "user4", "repo5", "202", true, XRefActionNone, nil, nil, ""}, + }, + }, + { + "This http://gitea.com:3000/user4/repo5/pulls/202/commits yes.", + []testResult{ + {202, "user4", "repo5", "202", true, XRefActionNone, nil, nil, ""}, + }, + }, + { + "This http://gitea.com:3000/user4/repo5/pulls/202/files yes.", + []testResult{ + {202, "user4", "repo5", "202", true, XRefActionNone, nil, nil, ""}, + }, + }, + { + "This http://gitea.com:3000/user4/repo5/pulls/202/files#diff- yes.", + []testResult{ + {202, "user4", "repo5", "202", true, XRefActionNone, nil, nil, ""}, + }, + }, { "This http://GiTeA.COM:3000/user4/repo6/pulls/205 yes.", []testResult{ @@ -466,6 +490,7 @@ func TestRegExp_issueAlphanumericPattern(t *testing.T) { "ABC-123:", "\"ABC-123\"", "'ABC-123'", + "ABC-123, unknown PR", } falseTestCases := []string{ "RC-08", diff --git a/modules/regexplru/regexplru.go b/modules/regexplru/regexplru.go index 8f66dcf3f7..b452094c16 100644 --- a/modules/regexplru/regexplru.go +++ b/modules/regexplru/regexplru.go @@ -6,7 +6,7 @@ package regexplru import ( "regexp" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" lru "github.com/hashicorp/golang-lru/v2" ) diff --git a/modules/repository/branch.go b/modules/repository/branch.go index 2bf9930f19..59b5f9e7d5 100644 --- a/modules/repository/branch.go +++ b/modules/repository/branch.go @@ -7,14 +7,14 @@ import ( "context" "fmt" - "code.gitea.io/gitea/models/db" - git_model "code.gitea.io/gitea/models/git" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/gitrepo" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + git_model "forgejo.org/models/git" + repo_model "forgejo.org/models/repo" + "forgejo.org/modules/container" + "forgejo.org/modules/git" + "forgejo.org/modules/gitrepo" + "forgejo.org/modules/log" + "forgejo.org/modules/timeutil" ) // SyncRepoBranches synchronizes branch table with repository branches diff --git a/modules/repository/branch_test.go b/modules/repository/branch_test.go index b98618a16b..deb6cd5d19 100644 --- a/modules/repository/branch_test.go +++ b/modules/repository/branch_test.go @@ -6,10 +6,10 @@ package repository import ( "testing" - "code.gitea.io/gitea/models/db" - git_model "code.gitea.io/gitea/models/git" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + git_model "forgejo.org/models/git" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/repository/collaborator.go b/modules/repository/collaborator.go index 17915d34b7..5a0c4451b7 100644 --- a/modules/repository/collaborator.go +++ b/modules/repository/collaborator.go @@ -6,11 +6,11 @@ package repository import ( "context" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/perm" - access_model "code.gitea.io/gitea/models/perm/access" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + "forgejo.org/models/perm" + access_model "forgejo.org/models/perm/access" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" "xorm.io/builder" ) diff --git a/modules/repository/collaborator_test.go b/modules/repository/collaborator_test.go index 3844197bf1..dae173506b 100644 --- a/modules/repository/collaborator_test.go +++ b/modules/repository/collaborator_test.go @@ -6,14 +6,14 @@ package repository import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/organization" - perm_model "code.gitea.io/gitea/models/perm" - access_model "code.gitea.io/gitea/models/perm/access" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unit" - "code.gitea.io/gitea/models/unittest" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/db" + "forgejo.org/models/organization" + perm_model "forgejo.org/models/perm" + access_model "forgejo.org/models/perm/access" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unit" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -272,8 +272,7 @@ func TestRepoPermissionPrivateOrgRepo(t *testing.T) { // update team information and then check permission team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 5}) - err = organization.UpdateTeamUnits(db.DefaultContext, team, nil) - require.NoError(t, err) + unittest.AssertSuccessfulDelete(t, &organization.TeamUnit{TeamID: team.ID}) perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, owner) require.NoError(t, err) for _, unit := range repo.Units { diff --git a/modules/repository/commits.go b/modules/repository/commits.go index ede60429a1..8f63f03db5 100644 --- a/modules/repository/commits.go +++ b/modules/repository/commits.go @@ -9,13 +9,13 @@ import ( "net/url" "time" - "code.gitea.io/gitea/models/avatars" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/cache" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - api "code.gitea.io/gitea/modules/structs" + "forgejo.org/models/avatars" + user_model "forgejo.org/models/user" + "forgejo.org/modules/cache" + "forgejo.org/modules/git" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + api "forgejo.org/modules/structs" ) // PushCommit represents a commit in a push operation. diff --git a/modules/repository/commits_test.go b/modules/repository/commits_test.go index 82841b3268..f49b0d37c5 100644 --- a/modules/repository/commits_test.go +++ b/modules/repository/commits_test.go @@ -4,17 +4,15 @@ package repository import ( - "crypto/md5" - "fmt" "strconv" "testing" "time" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" + "forgejo.org/modules/git" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -126,15 +124,12 @@ func TestPushCommits_AvatarLink(t *testing.T) { }, } - setting.GravatarSource = "https://secure.gravatar.com/avatar" - setting.OfflineMode = true - assert.Equal(t, - "/avatars/avatar2?size="+strconv.Itoa(28*setting.Avatar.RenderedSizeFactor), + "/avatars/ab53a2911ddf9b4817ac01ddcd3d975f?size="+strconv.Itoa(28*setting.Avatar.RenderedSizeFactor), pushCommits.AvatarLink(db.DefaultContext, "user2@example.com")) assert.Equal(t, - fmt.Sprintf("https://secure.gravatar.com/avatar/%x?d=identicon&s=%d", md5.Sum([]byte("nonexistent@example.com")), 28*setting.Avatar.RenderedSizeFactor), + "/assets/img/avatar_default.png", pushCommits.AvatarLink(db.DefaultContext, "nonexistent@example.com")) } diff --git a/modules/repository/create.go b/modules/repository/create.go index ca2150b972..d76a5571c7 100644 --- a/modules/repository/create.go +++ b/modules/repository/create.go @@ -11,22 +11,22 @@ import ( "path/filepath" "strings" - "code.gitea.io/gitea/models" - activities_model "code.gitea.io/gitea/models/activities" - "code.gitea.io/gitea/models/db" - git_model "code.gitea.io/gitea/models/git" - "code.gitea.io/gitea/models/organization" - "code.gitea.io/gitea/models/perm" - access_model "code.gitea.io/gitea/models/perm/access" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unit" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/models/webhook" - issue_indexer "code.gitea.io/gitea/modules/indexer/issues" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - api "code.gitea.io/gitea/modules/structs" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models" + activities_model "forgejo.org/models/activities" + "forgejo.org/models/db" + git_model "forgejo.org/models/git" + "forgejo.org/models/organization" + "forgejo.org/models/perm" + access_model "forgejo.org/models/perm/access" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unit" + user_model "forgejo.org/models/user" + "forgejo.org/models/webhook" + issue_indexer "forgejo.org/modules/indexer/issues" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + api "forgejo.org/modules/structs" + "forgejo.org/modules/util" ) // CreateRepositoryByExample creates a repository for the user/organization. @@ -89,8 +89,9 @@ func CreateRepositoryByExample(ctx context.Context, doer, u *user_model.User, re Type: tp, Config: &repo_model.PullRequestsConfig{ AllowMerge: true, AllowRebase: true, AllowRebaseMerge: true, AllowSquash: true, AllowFastForwardOnly: true, - DefaultMergeStyle: repo_model.MergeStyle(setting.Repository.PullRequest.DefaultMergeStyle), - AllowRebaseUpdate: true, + DefaultMergeStyle: repo_model.MergeStyle(setting.Repository.PullRequest.DefaultMergeStyle), + DefaultUpdateStyle: repo_model.UpdateStyle(setting.Repository.PullRequest.DefaultUpdateStyle), + AllowRebaseUpdate: true, }, }) } else { diff --git a/modules/repository/create_test.go b/modules/repository/create_test.go index c743271c26..cb34143cef 100644 --- a/modules/repository/create_test.go +++ b/modules/repository/create_test.go @@ -6,10 +6,10 @@ package repository import ( "testing" - activities_model "code.gitea.io/gitea/models/activities" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/models/unittest" + activities_model "forgejo.org/models/activities" + "forgejo.org/models/db" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/repository/delete.go b/modules/repository/delete.go index 04af98beef..6fff16b406 100644 --- a/modules/repository/delete.go +++ b/modules/repository/delete.go @@ -6,9 +6,9 @@ package repository import ( "context" - "code.gitea.io/gitea/models/organization" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/organization" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" ) // CanUserDelete returns true if user could delete the repository diff --git a/modules/repository/env.go b/modules/repository/env.go index e4f32092fc..110f6ca674 100644 --- a/modules/repository/env.go +++ b/modules/repository/env.go @@ -8,9 +8,9 @@ import ( "os" "strings" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/setting" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/setting" ) // env keys for git hooks need diff --git a/modules/repository/fork.go b/modules/repository/fork.go index fbf0008716..42801fa80d 100644 --- a/modules/repository/fork.go +++ b/modules/repository/fork.go @@ -6,9 +6,9 @@ package repository import ( "context" - "code.gitea.io/gitea/models/organization" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" + "forgejo.org/models/organization" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" ) // CanUserForkRepo returns true if specified user can fork repository. diff --git a/modules/repository/hooks.go b/modules/repository/hooks.go index 95849789ab..0f5e3afc34 100644 --- a/modules/repository/hooks.go +++ b/modules/repository/hooks.go @@ -7,10 +7,9 @@ import ( "fmt" "os" "path/filepath" - "runtime" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" ) func getHookTemplates() (hookNames, hookTpls, giteaHookTpls []string) { @@ -146,10 +145,6 @@ func CreateDelegateHooks(repoPath string) (err error) { } func checkExecutable(filename string) bool { - // windows has no concept of a executable bit - if runtime.GOOS == "windows" { - return true - } fileInfo, err := os.Stat(filename) if err != nil { return false diff --git a/modules/repository/init.go b/modules/repository/init.go index 5f500c5233..7b1442be93 100644 --- a/modules/repository/init.go +++ b/modules/repository/init.go @@ -10,14 +10,14 @@ import ( "sort" "strings" - issues_model "code.gitea.io/gitea/models/issues" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/label" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/options" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + issues_model "forgejo.org/models/issues" + repo_model "forgejo.org/models/repo" + "forgejo.org/modules/git" + "forgejo.org/modules/label" + "forgejo.org/modules/log" + "forgejo.org/modules/options" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" ) type OptionFile struct { diff --git a/modules/repository/license.go b/modules/repository/license.go index 07ae92ca70..af75d463d2 100644 --- a/modules/repository/license.go +++ b/modules/repository/license.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 repository @@ -10,7 +11,7 @@ import ( "regexp" "strings" - "code.gitea.io/gitea/modules/options" + "forgejo.org/modules/options" ) type LicenseValues struct { @@ -107,6 +108,9 @@ func getLicensePlaceholder(name string) *licensePlaceholder { } // Other special placeholders can be added here. + } else if name == "BSD-4-Clause" { + ret.Owner = append(ret.Owner, "COPYRIGHT HOLDER") + ret.Owner = append(ret.Owner, "the organization") } return ret } diff --git a/modules/repository/license_test.go b/modules/repository/license_test.go index a7d77743ac..3195f15dda 100644 --- a/modules/repository/license_test.go +++ b/modules/repository/license_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 repository @@ -170,6 +171,31 @@ Copyright (C) 2023 by Gitea teabot@gitea.io ... ... THE AUTHOR BE LIABLE FOR ... +`, + }, + { + name: "BSD-4-Clause", + args: args{ + name: "BSD-4-Clause", + values: &LicenseValues{Year: "2025", Owner: "Forgejo", Email: "hello@forgejo.org", Repo: "forgejo"}, + origin: ` +Copyright (c) . All rights reserved. + +... includes software developed by the organization. + +... Neither the name of the copyright holder nor + +... PROVIDED BY COPYRIGHT HOLDER "AS IS" ... NO EVENT SHALL COPYRIGHT HOLDER BE LIABLE ... +`, + }, + want: ` +Copyright (c) 2025 Forgejo. All rights reserved. + +... includes software developed by Forgejo. + +... Neither the name of the copyright holder nor + +... PROVIDED BY Forgejo "AS IS" ... NO EVENT SHALL Forgejo BE LIABLE ... `, }, } diff --git a/modules/repository/main_test.go b/modules/repository/main_test.go index f81dfcdafb..5906b10865 100644 --- a/modules/repository/main_test.go +++ b/modules/repository/main_test.go @@ -6,9 +6,10 @@ package repository import ( "testing" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/unittest" - _ "code.gitea.io/gitea/models/actions" + _ "forgejo.org/models/actions" + _ "forgejo.org/models/forgefed" ) func TestMain(m *testing.M) { diff --git a/modules/repository/push.go b/modules/repository/push.go index 66d0417caf..d8be0a3e8c 100644 --- a/modules/repository/push.go +++ b/modules/repository/push.go @@ -4,7 +4,7 @@ package repository import ( - "code.gitea.io/gitea/modules/git" + "forgejo.org/modules/git" ) // PushUpdateOptions defines the push update options diff --git a/modules/repository/repo.go b/modules/repository/repo.go index e08bc376b8..c86d48fe52 100644 --- a/modules/repository/repo.go +++ b/modules/repository/repo.go @@ -12,17 +12,17 @@ import ( "strings" "time" - "code.gitea.io/gitea/models/db" - git_model "code.gitea.io/gitea/models/git" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/git" - "code.gitea.io/gitea/modules/gitrepo" - "code.gitea.io/gitea/modules/lfs" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/db" + git_model "forgejo.org/models/git" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + "forgejo.org/modules/container" + "forgejo.org/modules/git" + "forgejo.org/modules/gitrepo" + "forgejo.org/modules/lfs" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" ) /* @@ -90,11 +90,11 @@ func SyncReleasesWithTags(ctx context.Context, repo *repo_model.Repository, gitR if rel.IsDraft { continue } - commitID, err := gitRepo.GetTagCommitID(rel.TagName) + commit, err := gitRepo.GetTagCommit(rel.TagName) if err != nil && !git.IsErrNotExist(err) { return fmt.Errorf("unable to GetTagCommitID for %q in Repo[%d:%s/%s]: %w", rel.TagName, repo.ID, repo.OwnerName, repo.Name, err) } - if git.IsErrNotExist(err) || commitID != rel.Sha1 { + if git.IsErrNotExist(err) || commit.ID.String() != rel.Sha1 { if err := repo_model.PushUpdateDeleteTag(ctx, repo, rel.TagName); err != nil { return fmt.Errorf("unable to PushUpdateDeleteTag: %q in Repo[%d:%s/%s]: %w", rel.TagName, repo.ID, repo.OwnerName, repo.Name, err) } @@ -182,11 +182,12 @@ func StoreMissingLfsObjectsInRepository(ctx context.Context, repo *repo_model.Re downloadObjects := func(pointers []lfs.Pointer) error { err := lfsClient.Download(ctx, pointers, func(p lfs.Pointer, content io.ReadCloser, objectError error) error { + if errors.Is(objectError, lfs.ErrObjectNotExist) { + log.Warn("Ignoring missing upstream LFS object %-v: %v", p, objectError) + return nil + } + if objectError != nil { - if errors.Is(objectError, lfs.ErrObjectNotExist) { - log.Warn("Repo[%-v]: Ignore missing LFS object %-v: %v", repo, p, objectError) - return nil - } return objectError } @@ -341,9 +342,10 @@ func pullMirrorReleaseSync(ctx context.Context, repo *repo_model.Repository, git for _, tag := range updates { if _, err := db.GetEngine(ctx).Where("repo_id = ? AND lower_tag_name = ?", repo.ID, strings.ToLower(tag.Name)). - Cols("sha1"). + Cols("sha1", "created_unix"). Update(&repo_model.Release{ - Sha1: tag.Object.String(), + Sha1: tag.Object.String(), + CreatedUnix: timeutil.TimeStamp(tag.Tagger.When.Unix()), }); err != nil { return fmt.Errorf("unable to update tag %s for pull-mirror Repo[%d:%s/%s]: %w", tag.Name, repo.ID, repo.OwnerName, repo.Name, err) } diff --git a/modules/repository/repo_test.go b/modules/repository/repo_test.go index f3e7be6d7d..278bdc2420 100644 --- a/modules/repository/repo_test.go +++ b/modules/repository/repo_test.go @@ -6,7 +6,7 @@ package repository import ( "testing" - "code.gitea.io/gitea/modules/git" + "forgejo.org/modules/git" "github.com/stretchr/testify/assert" ) diff --git a/modules/repository/temp.go b/modules/repository/temp.go index 04faa9db3d..6048c43a8e 100644 --- a/modules/repository/temp.go +++ b/modules/repository/temp.go @@ -9,9 +9,9 @@ import ( "path" "path/filepath" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" ) // LocalCopyPath returns the local repository temporary copy path. diff --git a/modules/secret/secret.go b/modules/secret/secret.go index e70ae1839c..fc63ec521b 100644 --- a/modules/secret/secret.go +++ b/modules/secret/secret.go @@ -27,7 +27,7 @@ func AesEncrypt(key, text []byte) ([]byte, error) { if _, err = io.ReadFull(rand.Reader, iv); err != nil { return nil, fmt.Errorf("AesEncrypt unable to read IV: %w", err) } - cfb := cipher.NewCFBEncrypter(block, iv) + cfb := cipher.NewCFBEncrypter(block, iv) //nolint:staticcheck cfb.XORKeyStream(ciphertext[aes.BlockSize:], []byte(b)) return ciphertext, nil } @@ -43,11 +43,11 @@ func AesDecrypt(key, text []byte) ([]byte, error) { } iv := text[:aes.BlockSize] text = text[aes.BlockSize:] - cfb := cipher.NewCFBDecrypter(block, iv) + cfb := cipher.NewCFBDecrypter(block, iv) //nolint:staticcheck cfb.XORKeyStream(text, text) data, err := base64.StdEncoding.DecodeString(string(text)) if err != nil { - return nil, fmt.Errorf("AesDecrypt invalid decrypted base64 string: %w", err) + return nil, fmt.Errorf("AesDecrypt invalid decrypted base64 string: %w - it can be caused by a change of the [security].SECRET_KEY setting or a database corruption - `forgejo doctor check --run check-db-consistency --fix` will get rid of orphaned rows found in the `two_factor` table and may fix this problem if they are the one with the invalid content", err) } return data, nil } diff --git a/modules/session/db.go b/modules/session/db.go index 3b12b93521..eea7e2136e 100644 --- a/modules/session/db.go +++ b/modules/session/db.go @@ -7,9 +7,9 @@ import ( "log" "sync" - "code.gitea.io/gitea/models/auth" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/models/auth" + "forgejo.org/models/db" + "forgejo.org/modules/timeutil" "code.forgejo.org/go-chi/session" ) diff --git a/modules/session/redis.go b/modules/session/redis.go index 230b501080..cf84ef21d9 100644 --- a/modules/session/redis.go +++ b/modules/session/redis.go @@ -22,8 +22,8 @@ import ( "sync" "time" - "code.gitea.io/gitea/modules/graceful" - "code.gitea.io/gitea/modules/nosql" + "forgejo.org/modules/graceful" + "forgejo.org/modules/nosql" "code.forgejo.org/go-chi/session" ) diff --git a/modules/session/virtual.go b/modules/session/virtual.go index 9cf3683a71..1c3e1c778b 100644 --- a/modules/session/virtual.go +++ b/modules/session/virtual.go @@ -7,8 +7,8 @@ import ( "fmt" "sync" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/json" + "forgejo.org/modules/log" "code.forgejo.org/go-chi/session" memcache "code.forgejo.org/go-chi/session/memcache" diff --git a/modules/setting/actions.go b/modules/setting/actions.go index 8c1b57b649..52a3ad5309 100644 --- a/modules/setting/actions.go +++ b/modules/setting/actions.go @@ -46,7 +46,7 @@ func (url defaultActionsURL) URL() string { } const ( - defaultActionsURLForgejo = "https://code.forgejo.org" + defaultActionsURLForgejo = "https://data.forgejo.org" defaultActionsURLGitHub = "github" // https://github.com defaultActionsURLSelf = "self" // the root URL of the self-hosted instance ) diff --git a/modules/setting/actions_test.go b/modules/setting/actions_test.go index afd76d3bee..4bff6e02ad 100644 --- a/modules/setting/actions_test.go +++ b/modules/setting/actions_test.go @@ -117,7 +117,7 @@ func Test_getDefaultActionsURLForActions(t *testing.T) { iniStr: ` [actions] `, - wantURL: "https://code.forgejo.org", + wantURL: "https://data.forgejo.org", }, { name: "github", diff --git a/modules/setting/admin.go b/modules/setting/admin.go index eed3aa22cf..7a1e071bac 100644 --- a/modules/setting/admin.go +++ b/modules/setting/admin.go @@ -4,7 +4,7 @@ package setting import ( - "code.gitea.io/gitea/modules/container" + "forgejo.org/modules/container" ) // Admin settings diff --git a/modules/setting/admin_test.go b/modules/setting/admin_test.go index 0c6c24b038..5473534521 100644 --- a/modules/setting/admin_test.go +++ b/modules/setting/admin_test.go @@ -6,7 +6,7 @@ package setting import ( "testing" - "code.gitea.io/gitea/modules/container" + "forgejo.org/modules/container" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/setting/annex.go b/modules/setting/annex.go new file mode 100644 index 0000000000..aa41c14ff0 --- /dev/null +++ b/modules/setting/annex.go @@ -0,0 +1,25 @@ +// Copyright 2023 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package setting + +import ( + "forgejo.org/modules/log" +) + +// Annex represents the configuration for git-annex +var Annex = struct { + Enabled bool `ini:"ENABLED"` + DisableP2PHTTP bool `ini:"DISABLE_P2PHTTP"` +}{} + +func loadAnnexFrom(rootCfg ConfigProvider) { + sec := rootCfg.Section("annex") + if err := sec.MapTo(&Annex); err != nil { + log.Fatal("Failed to map Annex settings: %v", err) + } + if !sec.HasKey("DISABLE_P2PHTTP") { + // If DisableP2PHTTP is not explicitly set then use DisableHTTPGit as its default + Annex.DisableP2PHTTP = Repository.DisableHTTPGit + } +} diff --git a/modules/setting/api.go b/modules/setting/api.go index c36f05cfd1..18180c3d07 100644 --- a/modules/setting/api.go +++ b/modules/setting/api.go @@ -7,7 +7,7 @@ import ( "net/url" "path" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // API settings diff --git a/modules/setting/attachment.go b/modules/setting/attachment.go index 4255ac985e..956525f0db 100644 --- a/modules/setting/attachment.go +++ b/modules/setting/attachment.go @@ -12,7 +12,7 @@ var Attachment = struct { Enabled bool }{ Storage: &Storage{}, - AllowedTypes: ".cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.webp,.xls,.xlsx,.zip", + AllowedTypes: ".avif,.cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.webp,.xls,.xlsx,.zip", MaxSize: 2048, MaxFiles: 5, Enabled: true, @@ -25,7 +25,7 @@ func loadAttachmentFrom(rootCfg ConfigProvider) (err error) { return err } - Attachment.AllowedTypes = sec.Key("ALLOWED_TYPES").MustString(".cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.webp,.xls,.xlsx,.zip") + Attachment.AllowedTypes = sec.Key("ALLOWED_TYPES").MustString(".avif,.cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.webp,.xls,.xlsx,.zip") Attachment.MaxSize = sec.Key("MAX_SIZE").MustInt64(2048) Attachment.MaxFiles = sec.Key("MAX_FILES").MustInt(5) Attachment.Enabled = sec.Key("ENABLED").MustBool(true) diff --git a/modules/setting/cache.go b/modules/setting/cache.go index bfa6ca0e61..cdc7e1a971 100644 --- a/modules/setting/cache.go +++ b/modules/setting/cache.go @@ -7,7 +7,7 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // Cache represents cache settings diff --git a/modules/setting/camo.go b/modules/setting/camo.go index 366e9a116c..5d31446a41 100644 --- a/modules/setting/camo.go +++ b/modules/setting/camo.go @@ -3,18 +3,28 @@ package setting -import "code.gitea.io/gitea/modules/log" +import ( + "strconv" + + "forgejo.org/modules/log" +) var Camo = struct { Enabled bool ServerURL string `ini:"SERVER_URL"` HMACKey string `ini:"HMAC_KEY"` - Allways bool + Always bool }{} func loadCamoFrom(rootCfg ConfigProvider) { mustMapSetting(rootCfg, "camo", &Camo) if Camo.Enabled { + oldValue := rootCfg.Section("camo").Key("ALLWAYS").MustString("") + if oldValue != "" { + log.Warn("camo.ALLWAYS is deprecated, use camo.ALWAYS instead") + Camo.Always, _ = strconv.ParseBool(oldValue) + } + if Camo.ServerURL == "" || Camo.HMACKey == "" { log.Fatal(`Camo settings require "SERVER_URL" and HMAC_KEY`) } diff --git a/modules/setting/config.go b/modules/setting/config.go index 03558574c2..6299640e61 100644 --- a/modules/setting/config.go +++ b/modules/setting/config.go @@ -6,8 +6,8 @@ package setting import ( "sync" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting/config" + "forgejo.org/modules/log" + "forgejo.org/modules/setting/config" ) type PictureStruct struct { diff --git a/modules/setting/config/value.go b/modules/setting/config/value.go index f0ec120544..3409f61b76 100644 --- a/modules/setting/config/value.go +++ b/modules/setting/config/value.go @@ -7,9 +7,9 @@ import ( "context" "sync" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/json" + "forgejo.org/modules/log" + "forgejo.org/modules/util" ) type CfgSecKey struct { diff --git a/modules/setting/config_env.go b/modules/setting/config_env.go index fa0100dba2..458dbb51bb 100644 --- a/modules/setting/config_env.go +++ b/modules/setting/config_env.go @@ -10,7 +10,7 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) const ( @@ -168,3 +168,22 @@ func EnvironmentToConfig(cfg ConfigProvider, envs []string) (changed bool) { } return changed } + +// InitGiteaEnvVars initializes the environment variables for gitea +func InitGiteaEnvVars() { + // Ideally Gitea should only accept the environment variables which it clearly knows instead of unsetting the ones it doesn't want, + // but the ideal behavior would be a breaking change, and it seems not bringing enough benefits to end users, + // so at the moment we could still keep "unsetting the unnecessary environments" + + // HOME is managed by Gitea, Gitea's git should use "HOME/.gitconfig". + // But git would try "XDG_CONFIG_HOME/git/config" first if "HOME/.gitconfig" does not exist, + // then our git.InitFull would still write to "XDG_CONFIG_HOME/git/config" if XDG_CONFIG_HOME is set. + _ = os.Unsetenv("XDG_CONFIG_HOME") + + _ = os.Unsetenv("GIT_AUTHOR_NAME") + _ = os.Unsetenv("GIT_AUTHOR_EMAIL") + _ = os.Unsetenv("GIT_AUTHOR_DATE") + _ = os.Unsetenv("GIT_COMMITTER_NAME") + _ = os.Unsetenv("GIT_COMMITTER_EMAIL") + _ = os.Unsetenv("GIT_COMMITTER_DATE") +} diff --git a/modules/setting/config_provider.go b/modules/setting/config_provider.go index 12cf36aa59..e93b21abda 100644 --- a/modules/setting/config_provider.go +++ b/modules/setting/config_provider.go @@ -12,8 +12,8 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/util" "gopkg.in/ini.v1" //nolint:depguard ) diff --git a/modules/setting/cors.go b/modules/setting/cors.go index 63daaad60b..5260887d9d 100644 --- a/modules/setting/cors.go +++ b/modules/setting/cors.go @@ -5,8 +5,6 @@ package setting import ( "time" - - "code.gitea.io/gitea/modules/log" ) // CORSConfig defines CORS settings @@ -28,7 +26,4 @@ var CORSConfig = struct { func loadCorsFrom(rootCfg ConfigProvider) { mustMapSetting(rootCfg, "cors", &CORSConfig) - if CORSConfig.Enabled { - log.Info("CORS Service Enabled") - } } diff --git a/modules/setting/disposable_email_domain_data.go b/modules/setting/disposable_email_domain_data.go new file mode 100644 index 0000000000..5f39f02e4b --- /dev/null +++ b/modules/setting/disposable_email_domain_data.go @@ -0,0 +1,3811 @@ +// Copyright 2024 James Hatfield +// SPDX-License-Identifier: MIT +// +// Code generated by build/generate-disposable-email.go. DO NOT EDIT +// Sourced from https://raw.githubusercontent.com/disposable-email-domains/disposable-email-domains/0c27e671231d27cf66370034d7f6818037416989/disposable_email_blocklist.conf +package setting + +import "sync" + +var DisposableEmailDomains = sync.OnceValue(func() []string { + return []string{ + "0-mail.com", + "027168.com", + "0815.ru", + "0815.ry", + "0815.su", + "0845.ru", + "0box.eu", + "0clickemail.com", + "0n0ff.net", + "0nelce.com", + "0v.ro", + "0w.ro", + "0wnd.net", + "0wnd.org", + "0x207.info", + "1-8.biz", + "1-tm.com", + "10-minute-mail.com", + "1000rebates.stream", + "100likers.com", + "105kg.ru", + "10dk.email", + "10mail.com", + "10mail.org", + "10mail.tk", + "10mail.xyz", + "10minmail.de", + "10minut.com.pl", + "10minut.xyz", + "10minutemail.be", + "10minutemail.cf", + "10minutemail.co.uk", + "10minutemail.co.za", + "10minutemail.com", + "10minutemail.de", + "10minutemail.ga", + "10minutemail.gq", + "10minutemail.ml", + "10minutemail.net", + "10minutemail.nl", + "10minutemail.pro", + "10minutemail.us", + "10minutemailbox.com", + "10minutemails.in", + "10minutenemail.de", + "10minutenmail.xyz", + "10minutesmail.com", + "10minutesmail.fr", + "10minutmail.pl", + "10x9.com", + "11163.com", + "123-m.com", + "12hosting.net", + "12houremail.com", + "12minutemail.com", + "12minutemail.net", + "12storage.com", + "140unichars.com", + "147.cl", + "14n.co.uk", + "15qm.com", + "1blackmoon.com", + "1ce.us", + "1chuan.com", + "1clck2.com", + "1fsdfdsfsdf.tk", + "1mail.ml", + "1pad.de", + "1s.fr", + "1secmail.com", + "1secmail.net", + "1secmail.org", + "1st-forms.com", + "1to1mail.org", + "1usemail.com", + "1webmail.info", + "1zhuan.com", + "2012-2016.ru", + "20email.eu", + "20email.it", + "20mail.eu", + "20mail.in", + "20mail.it", + "20minutemail.com", + "20minutemail.it", + "20mm.eu", + "2120001.net", + "21cn.com", + "247web.net", + "24hinbox.com", + "24hourmail.com", + "24hourmail.net", + "2anom.com", + "2chmail.net", + "2ether.net", + "2fdgdfgdfgdf.tk", + "2odem.com", + "2prong.com", + "2wc.info", + "300book.info", + "30mail.ir", + "30minutemail.com", + "30wave.com", + "3202.com", + "36ru.com", + "3d-painting.com", + "3l6.com", + "3mail.ga", + "3trtretgfrfe.tk", + "4-n.us", + "4057.com", + "418.dk", + "42o.org", + "4gfdsgfdgfd.tk", + "4k5.net", + "4mail.cf", + "4mail.ga", + "4nextmail.com", + "4nmv.ru", + "4tb.host", + "4warding.com", + "4warding.net", + "4warding.org", + "50set.ru", + "55hosting.net", + "5ghgfhfghfgh.tk", + "5gramos.com", + "5july.org", + "5mail.cf", + "5mail.ga", + "5minutemail.net", + "5oz.ru", + "5tb.in", + "5x25.com", + "5ymail.com", + "60minutemail.com", + "672643.net", + "675hosting.com", + "675hosting.net", + "675hosting.org", + "6hjgjhgkilkj.tk", + "6ip.us", + "6mail.cf", + "6mail.ga", + "6mail.ml", + "6paq.com", + "6somok.ru", + "6url.com", + "75hosting.com", + "75hosting.net", + "75hosting.org", + "7days-printing.com", + "7mail.ga", + "7mail.ml", + "7tags.com", + "80665.com", + "8127ep.com", + "8mail.cf", + "8mail.ga", + "8mail.ml", + "99.com", + "99cows.com", + "99experts.com", + "9mail.cf", + "9me.site", + "9mot.ru", + "9ox.net", + "9q.ro", + "a-bc.net", + "a45.in", + "a7996.com", + "aa5zy64.com", + "aaqwe.ru", + "aaqwe.store", + "abacuswe.us", + "abakiss.com", + "abatido.com", + "abcmail.email", + "abevw.com", + "abilitywe.us", + "abovewe.us", + "absolutewe.us", + "abundantwe.us", + "abusemail.de", + "abuser.eu", + "abyssmail.com", + "ac20mail.in", + "academiccommunity.com", + "academywe.us", + "acceleratewe.us", + "accentwe.us", + "acceptwe.us", + "acclaimwe.us", + "accordwe.us", + "accreditedwe.us", + "achievementwe.us", + "achievewe.us", + "acornwe.us", + "acrossgracealley.com", + "acrylicwe.us", + "activatewe.us", + "activitywe.us", + "acucre.com", + "acuitywe.us", + "acumenwe.us", + "adaptivewe.us", + "adaptwe.us", + "add3000.pp.ua", + "addictingtrailers.com", + "adeptwe.us", + "adfskj.com", + "adios.email", + "adiq.eu", + "aditus.info", + "admiralwe.us", + "ado888.biz", + "adobeccepdm.com", + "adoniswe.us", + "adpugh.org", + "adroh.com", + "adsd.org", + "adubiz.info", + "adult-work.info", + "advantagewe.us", + "advantimo.com", + "adventurewe.us", + "adventwe.us", + "advisorwe.us", + "advocatewe.us", + "adwaterandstir.com", + "aegde.com", + "aegia.net", + "aegiscorp.net", + "aegiswe.us", + "aelo.es", + "aeonpsi.com", + "afarek.com", + "affiliate-nebenjob.info", + "affiliatedwe.us", + "affilikingz.de", + "affinitywe.us", + "affluentwe.us", + "affordablewe.us", + "afia.pro", + "afrobacon.com", + "afterhourswe.us", + "agedmail.com", + "agendawe.us", + "agger.ro", + "agilewe.us", + "agorawe.us", + "agtx.net", + "aheadwe.us", + "ahem.email", + "ahk.jp", + "ahmedkhlef.com", + "air2token.com", + "airmailbox.website", + "airsi.de", + "aiworldx.com", + "ajaxapp.net", + "akapost.com", + "akerd.com", + "akgq701.com", + "akmail.in", + "akugu.com", + "al-qaeda.us", + "albionwe.us", + "alchemywe.us", + "alfaceti.com", + "aliaswe.us", + "alienware13.com", + "aligamel.com", + "alina-schiesser.ch", + "alisongamel.com", + "alivance.com", + "alivewe.us", + "all-cats.ru", + "allaccesswe.us", + "allamericanwe.us", + "allaroundwe.us", + "alldirectbuy.com", + "allegiancewe.us", + "allegrowe.us", + "allemojikeyboard.com", + "allgoodwe.us", + "alliancewe.us", + "allinonewe.us", + "allofthem.net", + "alloutwe.us", + "allowed.org", + "alloywe.us", + "allprowe.us", + "allseasonswe.us", + "allstarwe.us", + "allthegoodnamesaretaken.org", + "allurewe.us", + "almondwe.us", + "alph.wtf", + "alpha-web.net", + "alphaomegawe.us", + "alpinewe.us", + "altairwe.us", + "altitudewe.us", + "altuswe.us", + "ama-trade.de", + "ama-trans.de", + "amadeuswe.us", + "amail.club", + "amail.com", + "amail1.com", + "amail4.me", + "amazon-aws.org", + "amberwe.us", + "ambiancewe.us", + "ambitiouswe.us", + "amelabs.com", + "americanawe.us", + "americasbestwe.us", + "americaswe.us", + "amicuswe.us", + "amilegit.com", + "amiri.net", + "amiriindustries.com", + "amplewe.us", + "amplifiedwe.us", + "amplifywe.us", + "ampsylike.com", + "analogwe.us", + "analysiswe.us", + "analyticalwe.us", + "analyticswe.us", + "analyticwe.us", + "anappfor.com", + "anappthat.com", + "andreihusanu.ro", + "andthen.us", + "animesos.com", + "anit.ro", + "ano-mail.net", + "anon-mail.de", + "anonbox.net", + "anonmail.top", + "anonmails.de", + "anonymail.dk", + "anonymbox.com", + "anonymized.org", + "anonymousness.com", + "anotherdomaincyka.tk", + "ansibleemail.com", + "anthony-junkmail.com", + "antireg.com", + "antireg.ru", + "antispam.de", + "antispam24.de", + "antispammail.de", + "any.pink", + "anyalias.com", + "aoeuhtns.com", + "apfelkorps.de", + "aphlog.com", + "apkmd.com", + "appc.se", + "appinventor.nl", + "appixie.com", + "apps.dj", + "appzily.com", + "arduino.hk", + "ariaz.jetzt", + "armyspy.com", + "aron.us", + "arroisijewellery.com", + "art-en-ligne.pro", + "artman-conception.com", + "arur01.tk", + "arurgitu.gq", + "arvato-community.de", + "aschenbrandt.net", + "asdasd.nl", + "asdasd.ru", + "ashleyandrew.com", + "ask-mail.com", + "asorent.com", + "ass.pp.ua", + "astonut.tk", + "astroempires.info", + "asu.mx", + "asu.su", + "at.hm", + "at0mik.org", + "atnextmail.com", + "attnetwork.com", + "augmentationtechnology.com", + "ausgefallen.info", + "auti.st", + "autorobotica.com", + "autosouvenir39.ru", + "autotwollow.com", + "autowb.com", + "averdov.com", + "avia-tonic.fr", + "avls.pt", + "awatum.de", + "awdrt.org", + "awiki.org", + "awsoo.com", + "axiz.org", + "axon7zte.com", + "axsup.net", + "ayakamail.cf", + "azazazatashkent.tk", + "azcomputerworks.com", + "azmeil.tk", + "b1of96u.com", + "b2bx.net", + "b2cmail.de", + "badgerland.eu", + "badoop.com", + "badpotato.tk", + "balaket.com", + "bangban.uk", + "banit.club", + "banit.me", + "bank-opros1.ru", + "bareed.ws", + "barooko.com", + "barryogorman.com", + "bartdevos.be", + "basscode.org", + "bauwerke-online.com", + "bazaaboom.com", + "bbbbyyzz.info", + "bbhost.us", + "bbitf.com", + "bbitj.com", + "bbitq.com", + "bcaoo.com", + "bcast.ws", + "bcb.ro", + "bccto.me", + "bdmuzic.pw", + "beaconmessenger.com", + "bearsarefuzzy.com", + "beddly.com", + "beefmilk.com", + "belamail.org", + "belgianairways.com", + "belljonestax.com", + "beluckygame.com", + "benipaula.org", + "bepureme.com", + "beribase.ru", + "beribaza.ru", + "berirabotay.ru", + "best-john-boats.com", + "bestchoiceusedcar.com", + "bestlistbase.com", + "bestoption25.club", + "bestparadize.com", + "bestsoundeffects.com", + "besttempmail.com", + "betr.co", + "bgtmail.com", + "bgx.ro", + "bheps.com", + "bidourlnks.com", + "big1.us", + "bigprofessor.so", + "bigstring.com", + "bigwhoop.co.za", + "bij.pl", + "binka.me", + "binkmail.com", + "binnary.com", + "bio-muesli.info", + "bio-muesli.net", + "bione.co", + "bitwhites.top", + "bitymails.us", + "blackgoldagency.ru", + "blackmarket.to", + "bladesmail.net", + "blip.ch", + "blnkt.net", + "block521.com", + "blogmyway.org", + "blogos.net", + "blogspam.ro", + "blondemorkin.com", + "blondmail.com", + "bluedumpling.info", + "bluewerks.com", + "bnote.com", + "boatmail.us", + "bobgf.ru", + "bobgf.store", + "bobmail.info", + "bobmurchison.com", + "bofthew.com", + "bonobo.email", + "boofx.com", + "bookthemmore.com", + "bootybay.de", + "borged.com", + "borged.net", + "borged.org", + "bot.nu", + "boun.cr", + "bouncr.com", + "box-mail.ru", + "box-mail.store", + "boxem.ru", + "boxem.store", + "boxformail.in", + "boximail.com", + "boxlet.ru", + "boxlet.store", + "boxmail.lol", + "boxomail.live", + "boxtemp.com.br", + "bptfp.net", + "brand-app.biz", + "brandallday.net", + "brasx.org", + "breakthru.com", + "brefmail.com", + "brennendesreich.de", + "briggsmarcus.com", + "broadbandninja.com", + "bsnow.net", + "bspamfree.org", + "bspooky.com", + "bst-72.com", + "btb-notes.com", + "btc.email", + "btcmail.pw", + "btcmod.com", + "btizet.pl", + "buccalmassage.ru", + "budaya-tionghoa.com", + "budayationghoa.com", + "buffemail.com", + "bugfoo.com", + "bugmenever.com", + "bugmenot.com", + "bukhariansiddur.com", + "bulrushpress.com", + "bum.net", + "bumpymail.com", + "bunchofidiots.com", + "bund.us", + "bundes-li.ga", + "bunsenhoneydew.com", + "burnthespam.info", + "burstmail.info", + "businessbackend.com", + "businesssuccessislifesuccess.com", + "buspad.org", + "bussitussi.com", + "buymoreplays.com", + "buyordie.info", + "buyusdomain.com", + "buyusedlibrarybooks.org", + "buzzcluby.com", + "byebyemail.com", + "byespm.com", + "byom.de", + "c01.kr", + "c51vsgq.com", + "cachedot.net", + "californiafitnessdeals.com", + "cam4you.cc", + "camping-grill.info", + "candymail.de", + "cane.pw", + "capitalistdilemma.com", + "car101.pro", + "carbtc.net", + "cars2.club", + "carsencyclopedia.com", + "cartelera.org", + "caseedu.tk", + "cashflow35.com", + "casualdx.com", + "catgroup.uk", + "cavi.mx", + "cbair.com", + "cbes.net", + "cbty.ru", + "cbty.store", + "cc.liamria", + "ccmail.uk", + "cdfaq.com", + "cdpa.cc", + "ceed.se", + "cek.pm", + "cellurl.com", + "centermail.com", + "centermail.net", + "cetpass.com", + "cfo2go.ro", + "chacuo.net", + "chaichuang.com", + "chalupaurybnicku.cz", + "chammy.info", + "chapsmail.com", + "chasefreedomactivate.com", + "chatich.com", + "cheaphub.net", + "cheatmail.de", + "chenbot.email", + "chewydonut.com", + "chibakenma.ml", + "chickenkiller.com", + "chielo.com", + "childsavetrust.org", + "chilkat.com", + "chinamkm.com", + "chithinh.com", + "chitthi.in", + "choco.la", + "chogmail.com", + "choicemail1.com", + "chong-mail.com", + "chong-mail.net", + "chong-mail.org", + "chumpstakingdumps.com", + "cigar-auctions.com", + "civikli.com", + "civx.org", + "ckaazaza.tk", + "ckiso.com", + "cl-cl.org", + "cl0ne.net", + "claimab.com", + "clandest.in", + "classesmail.com", + "clearwatermail.info", + "click-email.com", + "clickdeal.co", + "clipmail.eu", + "clixser.com", + "clonemoi.tk", + "cloud-mail.top", + "clout.wiki", + "clowmail.com", + "clrmail.com", + "cmail.club", + "cmail.com", + "cmail.net", + "cmail.org", + "cnamed.com", + "cndps.com", + "cnew.ir", + "cnmsg.net", + "cnsds.de", + "co.cc", + "cobarekyo1.ml", + "cocoro.uk", + "cocovpn.com", + "codeandscotch.com", + "codivide.com", + "coffeetimer24.com", + "coieo.com", + "coin-host.net", + "coinlink.club", + "coldemail.info", + "compareshippingrates.org", + "completegolfswing.com", + "comwest.de", + "conf.work", + "consumerriot.com", + "contbay.com", + "cooh-2.site", + "coolandwacky.us", + "coolimpool.org", + "copyhome.win", + "coreclip.com", + "cosmorph.com", + "courrieltemporaire.com", + "coza.ro", + "crankhole.com", + "crapmail.org", + "crastination.de", + "crazespaces.pw", + "crazymailing.com", + "cream.pink", + "crepeau12.com", + "cringemonster.com", + "cross-law.ga", + "cross-law.gq", + "crossmailjet.com", + "crossroadsmail.com", + "crunchcompass.com", + "crusthost.com", + "cs.email", + "csh.ro", + "cszbl.com", + "ctmailing.us", + "ctos.ch", + "cu.cc", + "cubene.com", + "cubiclink.com", + "cuendita.com", + "cuirushi.org", + "cuoly.com", + "cupbest.com", + "curlhph.tk", + "currentmail.com", + "curryworld.de", + "cust.in", + "cutout.club", + "cutradition.com", + "cuvox.de", + "cyber-innovation.club", + "cyber-phone.eu", + "cylab.org", + "d1yun.com", + "d3p.dk", + "daabox.com", + "dab.ro", + "dacoolest.com", + "daemsteam.com", + "daibond.info", + "daily-email.com", + "daintly.com", + "damai.webcam", + "dammexe.net", + "damnthespam.com", + "dandikmail.com", + "darkharvestfilms.com", + "daryxfox.net", + "dasdasdascyka.tk", + "dash-pads.com", + "dataarca.com", + "datarca.com", + "datazo.ca", + "datenschutz.ru", + "datum2.com", + "davidkoh.net", + "davidlcreative.com", + "dawin.com", + "daymail.life", + "daymailonline.com", + "dayrep.com", + "dbunker.com", + "dcctb.com", + "dcemail.com", + "ddcrew.com", + "de-a.org", + "dea-21olympic.com", + "deadaddress.com", + "deadchildren.org", + "deadfake.cf", + "deadfake.ga", + "deadfake.ml", + "deadfake.tk", + "deadspam.com", + "deagot.com", + "dealja.com", + "dealrek.com", + "deekayen.us", + "defomail.com", + "degradedfun.net", + "deinbox.com", + "delayload.com", + "delayload.net", + "delikkt.de", + "delivrmail.com", + "demen.ml", + "dengekibunko.ga", + "dengekibunko.gq", + "dengekibunko.ml", + "der-kombi.de", + "derkombi.de", + "derluxuswagen.de", + "desoz.com", + "despam.it", + "despammed.com", + "dev-null.cf", + "dev-null.ga", + "dev-null.gq", + "dev-null.ml", + "developermail.com", + "devnullmail.com", + "deyom.com", + "dharmatel.net", + "dhm.ro", + "dhy.cc", + "dialogus.com", + "diapaulpainting.com", + "dicopto.com", + "digdig.org", + "digital-message.com", + "digitalesbusiness.info", + "digitalmail.info", + "digitalmariachis.com", + "digitalsanctuary.com", + "dildosfromspace.com", + "dim-coin.com", + "dingbone.com", + "diolang.com", + "directmail24.net", + "disaq.com", + "disbox.net", + "disbox.org", + "discard.cf", + "discard.email", + "discard.ga", + "discard.gq", + "discard.ml", + "discard.tk", + "discardmail.com", + "discardmail.de", + "discos4.com", + "dishcatfish.com", + "disign-concept.eu", + "disign-revelation.com", + "dispo.in", + "dispomail.eu", + "disposable-e.ml", + "disposable-email.ml", + "disposable.cf", + "disposable.ga", + "disposable.ml", + "disposable.site", + "disposableaddress.com", + "disposableemailaddresses.com", + "disposableinbox.com", + "disposablemails.com", + "dispose.it", + "disposeamail.com", + "disposemail.com", + "disposemymail.com", + "dispostable.com", + "divad.ga", + "divermail.com", + "divismail.ru", + "diwaq.com", + "dlemail.ru", + "dmarc.ro", + "dndent.com", + "dnses.ro", + "doanart.com", + "dob.jp", + "dodgeit.com", + "dodgemail.de", + "dodgit.com", + "dodgit.org", + "dodsi.com", + "doiea.com", + "dolphinnet.net", + "domforfb1.tk", + "domforfb18.tk", + "domforfb19.tk", + "domforfb2.tk", + "domforfb23.tk", + "domforfb27.tk", + "domforfb29.tk", + "domforfb3.tk", + "domforfb4.tk", + "domforfb5.tk", + "domforfb6.tk", + "domforfb7.tk", + "domforfb8.tk", + "domforfb9.tk", + "domozmail.com", + "donebyngle.com", + "donemail.ru", + "dongqing365.com", + "dontreg.com", + "dontsendmespam.de", + "doojazz.com", + "doquier.tk", + "dotman.de", + "dotmsg.com", + "dotslashrage.com", + "doublemail.de", + "douchelounge.com", + "dozvon-spb.ru", + "dp76.com", + "dpptd.com", + "dr69.site", + "drdrb.com", + "drdrb.net", + "dred.ru", + "drevo.si", + "drivetagdev.com", + "drmail.in", + "droolingfanboy.de", + "dropcake.de", + "dropjar.com", + "droplar.com", + "dropmail.me", + "dropsin.net", + "drowblock.com", + "dsgvo.party", + "dsgvo.ru", + "dshfjdafd.cloud", + "dsiay.com", + "dspwebservices.com", + "duam.net", + "duck2.club", + "dudmail.com", + "duk33.com", + "dukedish.com", + "dump-email.info", + "dumpandjunk.com", + "dumpmail.de", + "dumpyemail.com", + "durandinterstellar.com", + "duskmail.com", + "dwse.edu.pl", + "dyceroprojects.com", + "dz17.net", + "e-mail.com", + "e-mail.org", + "e-marketstore.ru", + "e-tomarigi.com", + "e3z.de", + "e4ward.com", + "eanok.com", + "easy-trash-mail.com", + "easynetwork.info", + "easytrashmail.com", + "eatmea2z.club", + "eay.jp", + "ebbob.com", + "ebeschlussbuch.de", + "ecallheandi.com", + "ecolo-online.fr", + "edgex.ru", + "edinburgh-airporthotels.com", + "edupolska.edu.pl", + "edv.to", + "ee1.pl", + "ee2.pl", + "eeedv.de", + "eelmail.com", + "efxs.ca", + "egzones.com", + "einmalmail.de", + "einrot.com", + "einrot.de", + "eintagsmail.de", + "elearningjournal.org", + "electro.mn", + "elitevipatlantamodels.com", + "elki-mkzn.ru", + "email-fake.cf", + "email-fake.com", + "email-fake.ga", + "email-fake.gq", + "email-fake.ml", + "email-fake.tk", + "email-jetable.fr", + "email-lab.com", + "email-temp.com", + "email.edu.pl", + "email.net", + "email1.pro", + "email60.com", + "emailage.cf", + "emailage.ga", + "emailage.gq", + "emailage.ml", + "emailage.tk", + "emailate.com", + "emailbin.net", + "emailcbox.pro", + "emailcu.icu", + "emaildienst.de", + "emaildrop.io", + "emailfake.com", + "emailfake.ml", + "emailfoxi.pro", + "emailfreedom.ml", + "emailgenerator.de", + "emailgo.de", + "emailias.com", + "emailigo.de", + "emailinfive.com", + "emailisvalid.com", + "emaillime.com", + "emailmiser.com", + "emailna.co", + "emailnax.com", + "emailo.pro", + "emailondeck.com", + "emailportal.info", + "emailproxsy.com", + "emailresort.com", + "emails.ga", + "emailsecurer.com", + "emailsensei.com", + "emailsingularity.net", + "emailspam.cf", + "emailspam.ga", + "emailspam.gq", + "emailspam.ml", + "emailspam.tk", + "emailsy.info", + "emailtech.info", + "emailtemporanea.com", + "emailtemporanea.net", + "emailtemporar.ro", + "emailtemporario.com.br", + "emailthe.net", + "emailtmp.com", + "emailto.de", + "emailure.net", + "emailwarden.com", + "emailxfer.com", + "emailz.cf", + "emailz.ga", + "emailz.gq", + "emailz.ml", + "emeil.in", + "emeil.ir", + "emeraldwebmail.com", + "emkei.cf", + "emkei.ga", + "emkei.gq", + "emkei.ml", + "emkei.tk", + "eml.pp.ua", + "emlhub.com", + "emlpro.com", + "emltmp.com", + "empireanime.ga", + "emstjzh.com", + "emz.net", + "enayu.com", + "enterto.com", + "envy17.com", + "eoffice.top", + "eoopy.com", + "epb.ro", + "epbox.ru", + "epbox.store", + "ephemail.net", + "ephemeral.email", + "eposta.buzz", + "eposta.work", + "epostal.ru", + "epostal.store", + "eqiluxspam.ga", + "ereplyzy.com", + "ericjohnson.ml", + "eripo.net", + "ero-tube.org", + "esadverse.com", + "esbano-ru.ru", + "esc.la", + "escapehatchapp.com", + "esemay.com", + "esgeneri.com", + "esiix.com", + "esprity.com", + "estate-invest.fr", + "esterace.com", + "eth2btc.info", + "ether123.net", + "ethereum1.top", + "ethersports.org", + "ethersportz.info", + "etotvibor.ru", + "etranquil.com", + "etranquil.net", + "etranquil.org", + "euaqa.com", + "evanfox.info", + "eveav.com", + "evilcomputer.com", + "evopo.com", + "evvgo.com", + "evyush.com", + "exdonuts.com", + "exelica.com", + "existiert.net", + "exitstageleft.net", + "explodemail.com", + "express.net.ua", + "extracurricularsociety.com", + "extremail.ru", + "exweme.com", + "eyepaste.com", + "ez.lv", + "ezehe.com", + "ezfill.com", + "ezstest.com", + "ezztt.com", + "f4k.es", + "facebook-email.cf", + "facebook-email.ga", + "facebook-email.ml", + "facebookmail.gq", + "facebookmail.ml", + "fackme.gq", + "fadingemail.com", + "faecesmail.me", + "fag.wf", + "failbone.com", + "faithkills.com", + "fake-box.com", + "fake-email.pp.ua", + "fake-mail.cf", + "fake-mail.ga", + "fake-mail.ml", + "fakedemail.com", + "fakeinbox.cf", + "fakeinbox.com", + "fakeinbox.ga", + "fakeinbox.info", + "fakeinbox.ml", + "fakeinbox.tk", + "fakeinformation.com", + "fakemail.fr", + "fakemail.io", + "fakemailgenerator.com", + "fakemailz.com", + "fallinhay.com", + "fammix.com", + "fanclub.pm", + "fangoh.com", + "fansworldwide.de", + "fantasymail.de", + "farrse.co.uk", + "fasssd.ru", + "fasssd.store", + "fast-email.info", + "fast-mail.fr", + "fastacura.com", + "fastchevy.com", + "fastchrysler.com", + "fasternet.biz", + "fastkawasaki.com", + "fastmazda.com", + "fastmitsubishi.com", + "fastnissan.com", + "fastsubaru.com", + "fastsuzuki.com", + "fasttoyota.com", + "fastyamaha.com", + "fatflap.com", + "fbma.tk", + "fddns.ml", + "fdfdsfds.com", + "femailtor.com", + "fer-gabon.org", + "fermaxxi.ru", + "fettometern.com", + "fexbox.org", + "fexbox.ru", + "fexpost.com", + "fextemp.com", + "ficken.de", + "fictionsite.com", + "fightallspam.com", + "figjs.com", + "figshot.com", + "figurescoin.com", + "fiifke.de", + "filbert4u.com", + "filberts4u.com", + "film-blog.biz", + "filzmail.com", + "findemail.info", + "findu.pl", + "finews.biz", + "fir.hk", + "firemailbox.club", + "fitnesrezink.ru", + "fivemail.de", + "fivermail.com", + "fixmail.tk", + "fizmail.com", + "fleckens.hu", + "flemail.ru", + "flexvio.com", + "fliegender.fish", + "flowu.com", + "flu.cc", + "fluidsoft.us", + "flurred.com", + "fly-ts.de", + "flyinggeek.net", + "flymail.tk", + "flyspam.com", + "fncp.ru", + "fncp.store", + "foobarbot.net", + "footard.com", + "foreastate.com", + "forecastertests.com", + "foreskin.cf", + "foreskin.ga", + "foreskin.gq", + "foreskin.ml", + "foreskin.tk", + "forgetmail.com", + "fornow.eu", + "forspam.net", + "forward.cat", + "fosil.pro", + "foxja.com", + "foxtrotter.info", + "fr.cr", + "fr.nf", + "fr33mail.info", + "fragolina2.tk", + "frapmail.com", + "frappina.tk", + "free-email.cf", + "free-email.ga", + "free-temp.net", + "freebabysittercam.com", + "freeblackbootytube.com", + "freecat.net", + "freedom4you.info", + "freedompop.us", + "freefattymovies.com", + "freehotmail.net", + "freeinbox.email", + "freelance-france.eu", + "freeletter.me", + "freemail.ms", + "freemails.cf", + "freemails.ga", + "freemails.ml", + "freemeil.ga", + "freemeil.gq", + "freemeil.ml", + "freeml.net", + "freeplumpervideos.com", + "freerubli.ru", + "freeschoolgirlvids.com", + "freesistercam.com", + "freeteenbums.com", + "freundin.ru", + "friendlymail.co.uk", + "front14.org", + "frwdmail.com", + "ftp.sh", + "ftpinc.ca", + "fuckedupload.com", + "fuckingduh.com", + "fuckme69.club", + "fucknloveme.top", + "fuckxxme.top", + "fudgerub.com", + "fuirio.com", + "fukaru.com", + "fukurou.ch", + "fullangle.org", + "fulvie.com", + "fun64.com", + "funnycodesnippets.com", + "funnymail.de", + "furzauflunge.de", + "futuramind.com", + "fuvk.ru", + "fuvk.store", + "fuwa.be", + "fuwa.li", + "fuwamofu.com", + "fuwari.be", + "fux0ringduh.com", + "fxnxs.com", + "fyii.de", + "g14l71lb.com", + "g1xmail.top", + "g2xmail.top", + "g3xmail.top", + "g4hdrop.us", + "gafy.net", + "gage.ga", + "galaxy.tv", + "gally.jp", + "gamail.top", + "gamegregious.com", + "gamgling.com", + "garasikita.pw", + "garbagecollector.org", + "garbagemail.org", + "gardenscape.ca", + "garizo.com", + "garliclife.com", + "garrymccooey.com", + "gav0.com", + "gawab.com", + "gbcmail.win", + "gbmail.top", + "gcmail.top", + "gdmail.top", + "gedmail.win", + "geekforex.com", + "geew.ru", + "gehensiemirnichtaufdensack.de", + "geldwaschmaschine.de", + "gelitik.in", + "genderfuck.net", + "geronra.com", + "geschent.biz", + "get-mail.cf", + "get-mail.ga", + "get-mail.ml", + "get-mail.tk", + "get.pp.ua", + "get1mail.com", + "get2mail.fr", + "getairmail.cf", + "getairmail.com", + "getairmail.ga", + "getairmail.gq", + "getairmail.ml", + "getairmail.tk", + "geteit.com", + "getfun.men", + "getmails.eu", + "getmule.com", + "getnada.com", + "getnowtoday.cf", + "getonemail.com", + "getonemail.net", + "getover.de", + "getsimpleemail.com", + "gett.icu", + "gexik.com", + "ggmal.ml", + "ggvk.ru", + "ggvk.store", + "ghosttexter.de", + "giacmosuaviet.info", + "giaiphapmuasam.com", + "giantmail.de", + "gifto12.com", + "gimpmail.com", + "ginzi.be", + "ginzi.co.uk", + "ginzi.es", + "ginzi.net", + "ginzy.co.uk", + "ginzy.eu", + "giratex.com", + "girlfriend.ru", + "girlmail.win", + "girlsindetention.com", + "girlsundertheinfluence.com", + "gishpuppy.com", + "giveh2o.info", + "givememail.club", + "givmail.com", + "gixenmixen.com", + "glitch.sx", + "globaltouron.com", + "glubex.com", + "glucosegrin.com", + "gmal.com", + "gmatch.org", + "gmial.com", + "gmx1mail.top", + "gmxmail.top", + "gmxmail.win", + "gnctr-calgary.com", + "go2usa.info", + "go2vpn.net", + "goatmail.uk", + "goemailgo.com", + "golemico.com", + "gomail.in", + "goonby.com", + "goplaygame.ru", + "gorillaswithdirtyarmpits.com", + "goround.info", + "gosarlar.com", + "gosuslugi-spravka.ru", + "gothere.biz", + "gotmail.com", + "gotmail.net", + "gotmail.org", + "gowikibooks.com", + "gowikicampus.com", + "gowikicars.com", + "gowikifilms.com", + "gowikigames.com", + "gowikimusic.com", + "gowikinetwork.com", + "gowikitravel.com", + "gowikitv.com", + "grandmamail.com", + "grandmasmail.com", + "grassdev.com", + "great-host.in", + "greencafe24.com", + "greendike.com", + "greenhousemail.com", + "greensloth.com", + "greggamel.com", + "greggamel.net", + "gregorsky.zone", + "gregorygamel.com", + "gregorygamel.net", + "grish.de", + "griuc.schule", + "grn.cc", + "groupbuff.com", + "grr.la", + "gruene-no-thanks.xyz", + "grugrug.ru", + "gruz-m.ru", + "gs-arc.org", + "gsredcross.org", + "gsrv.co.uk", + "gsxstring.ga", + "gudanglowongan.com", + "guerillamail.biz", + "guerillamail.com", + "guerillamail.de", + "guerillamail.info", + "guerillamail.net", + "guerillamail.org", + "guerillamailblock.com", + "guerrillamail.biz", + "guerrillamail.com", + "guerrillamail.de", + "guerrillamail.info", + "guerrillamail.net", + "guerrillamail.org", + "guerrillamailblock.com", + "gufum.com", + "gustr.com", + "guysmail.com", + "gxemail.men", + "gynzi.co.uk", + "gynzi.es", + "gynzy.at", + "gynzy.es", + "gynzy.eu", + "gynzy.gr", + "gynzy.info", + "gynzy.lt", + "gynzy.mobi", + "gynzy.pl", + "gynzy.ro", + "gynzy.sk", + "gzb.ro", + "h8s.org", + "habitue.net", + "hacccc.com", + "hackersquad.tk", + "hackthatbit.ch", + "hahawrong.com", + "haida-edu.cn", + "hairs24.ru", + "haltospam.com", + "hamham.uk", + "hangxomcuatoilatotoro.ml", + "happy2023year.com", + "happydomik.ru", + "harakirimail.com", + "haribu.com", + "hartbot.de", + "hasanmail.ml", + "hat-geld.de", + "hatespam.org", + "hawrong.com", + "haydoo.com", + "hazelnut4u.com", + "hazelnuts4u.com", + "hazmatshipping.org", + "hccmail.win", + "headstrong.de", + "heathenhammer.com", + "heathenhero.com", + "hecat.es", + "heisei.be", + "hellodream.mobi", + "helloricky.com", + "helpinghandtaxcenter.org", + "helpjobs.ru", + "heros3.com", + "herp.in", + "herpderp.nl", + "hezll.com", + "hi2.in", + "hi5.si", + "hiddentragedy.com", + "hidebox.org", + "hidebusiness.xyz", + "hidemail.de", + "hidemail.pro", + "hidemail.us", + "hidzz.com", + "highbros.org", + "hiltonvr.com", + "himail.online", + "hmail.us", + "hmamail.com", + "hmh.ro", + "hoanggiaanh.com", + "hoanglong.tech", + "hochsitze.com", + "hola.org", + "holl.ga", + "honeys.be", + "honor-8.com", + "hopemail.biz", + "hornyalwary.top", + "host1s.com", + "hostcalls.com", + "hostguru.top", + "hostingmail.me", + "hostlaba.com", + "hot-mail.cf", + "hot-mail.ga", + "hot-mail.gq", + "hot-mail.ml", + "hot-mail.tk", + "hotmai.com", + "hotmailproduct.com", + "hotmial.com", + "hotpop.com", + "hotprice.co", + "hotsoup.be", + "housat.com", + "hpc.tw", + "hs.vc", + "ht.cx", + "hthlm.com", + "huangniu8.com", + "huizk.com", + "hukkmu.tk", + "hulapla.de", + "humaility.com", + "hungpackage.com", + "hushmail.cf", + "huskion.net", + "hvastudiesucces.nl", + "hwsye.net", + "hxopi.ru", + "hxopi.store", + "hypenated-domain.com", + "i2pmail.org", + "i6.cloudns.cc", + "iaoss.com", + "ibnuh.bz", + "icantbelieveineedtoexplainthisshit.com", + "icemail.club", + "ich-essen-fleisch.bio", + "ichigo.me", + "icx.in", + "icx.ro", + "icznn.com", + "idx4.com", + "idxue.com", + "ieatspam.eu", + "ieatspam.info", + "ieh-mail.de", + "iencm.com", + "iffymedia.com", + "ige.es", + "igg.biz", + "ignoremail.com", + "ihateyoualot.info", + "ihazspam.ca", + "iheartspam.org", + "ikbenspamvrij.nl", + "ikuromi.com", + "illistnoise.com", + "ilovespam.com", + "imail1.net", + "imails.info", + "imailt.com", + "imgof.com", + "imgv.de", + "immo-gerance.info", + "imperialcnk.com", + "imstations.com", + "imul.info", + "in-ulm.de", + "in2reach.com", + "inactivemachine.com", + "inbax.tk", + "inbound.plus", + "inbox.si", + "inbox2.info", + "inboxalias.com", + "inboxbear.com", + "inboxclean.com", + "inboxclean.org", + "inboxdesign.me", + "inboxed.im", + "inboxed.pw", + "inboxkitten.com", + "inboxnow.ru", + "inboxnow.store", + "inboxproxy.com", + "inboxstore.me", + "inclusiveprogress.com", + "incognitomail.com", + "incognitomail.net", + "incognitomail.org", + "incq.com", + "ind.st", + "indieclad.com", + "indirect.ws", + "indomaed.pw", + "indomina.cf", + "indoserver.stream", + "indosukses.press", + "ineec.net", + "infocom.zp.ua", + "inggo.org", + "inkiny.com", + "inkomail.com", + "inmynetwork.tk", + "inoutmail.de", + "inoutmail.eu", + "inoutmail.info", + "inoutmail.net", + "inpwa.com", + "insanumingeniumhomebrew.com", + "insorg-mail.info", + "instaddr.ch", + "instaddr.uk", + "instaddr.win", + "instance-email.com", + "instant-mail.de", + "instantblingmail.info", + "instantemailaddress.com", + "instantmail.fr", + "instmail.uk", + "internet-v-stavropole.ru", + "internetkeno.com", + "internetoftags.com", + "interstats.org", + "intersteller.com", + "intopwa.com", + "intopwa.net", + "intopwa.org", + "investore.co", + "iozak.com", + "ip4.pp.ua", + "ip6.li", + "ip6.pp.ua", + "ipoo.org", + "ippandansei.tk", + "ipsur.org", + "irabops.com", + "iralborz.bid", + "irc.so", + "irish2me.com", + "irishspringrealty.com", + "iroid.com", + "ironiebehindert.de", + "irssi.tv", + "is.af", + "isdaq.com", + "ishop2k.com", + "isosq.com", + "istii.ro", + "isukrainestillacountry.com", + "it7.ovh", + "italy-mail.com", + "itcompu.com", + "itfast.net", + "itsjiff.com", + "itunesgiftcodegenerator.com", + "iubridge.com", + "iuemail.men", + "iwi.net", + "ixaks.com", + "ixx.io", + "j-p.us", + "jafps.com", + "jaga.email", + "jajxz.com", + "jakemsr.com", + "janproz.com", + "jaqis.com", + "jdmadventures.com", + "jdz.ro", + "je-recycle.info", + "jellow.ml", + "jellyrolls.com", + "jeoce.com", + "jet-renovation.fr", + "jetable.com", + "jetable.net", + "jetable.org", + "jetable.pp.ua", + "ji5.de", + "ji6.de", + "ji7.de", + "jiooq.com", + "jmail.ovh", + "jmail.ro", + "jnxjn.com", + "jobbikszimpatizans.hu", + "jobbrett.com", + "jobposts.net", + "jobs-to-be-done.net", + "joelpet.com", + "joetestalot.com", + "jofuso.com", + "jopho.com", + "joseihorumon.info", + "josse.ltd", + "jourrapide.com", + "jpco.org", + "jsrsolutions.com", + "jumonji.tk", + "jungkamushukum.com", + "junk.to", + "junk1e.com", + "junkmail.ga", + "junkmail.gq", + "just-email.com", + "justemail.ml", + "juyouxi.com", + "jwork.ru", + "kademen.com", + "kadokawa.cf", + "kadokawa.ga", + "kadokawa.gq", + "kadokawa.ml", + "kadokawa.tk", + "kaengu.ru", + "kagi.be", + "kakadua.net", + "kalapi.org", + "kamen-market.ru", + "kamsg.com", + "kaovo.com", + "kappala.info", + "kara-turk.net", + "karatraman.ml", + "kariplan.com", + "karta-kykyruza.ru", + "kartvelo.com", + "kasmail.com", + "kaspop.com", + "katztube.com", + "kazelink.ml", + "kbox.li", + "kcrw.de", + "keepmymail.com", + "keinhirn.de", + "keipino.de", + "kekita.com", + "kellychibale-researchgroup-uct.com", + "kemptvillebaseball.com", + "kiani.com", + "killmail.com", + "killmail.net", + "kimsdisk.com", + "kinda.email", + "kindamail.com", + "kingsq.ga", + "kino-100.ru", + "kiois.com", + "kismail.ru", + "kisstwink.com", + "kitnastar.com", + "kjkszpjcompany.com", + "kkmail.be", + "kkoup.com", + "kksm.be", + "klassmaster.com", + "klassmaster.net", + "klick-tipp.us", + "klipschx12.com", + "kloap.com", + "klovenode.com", + "kludgemush.com", + "klzlk.com", + "kmail.li", + "kmail.live", + "kmhow.com", + "knickerbockerban.de", + "knol-power.nl", + "kobrandly.com", + "kommunity.biz", + "kon42.com", + "konican.com", + "konultant-jurist.ru", + "kook.ml", + "kopagas.com", + "kopaka.net", + "korona-nedvizhimosti.ru", + "koshu.ru", + "kosmetik-obatkuat.com", + "kostenlosemailadresse.de", + "koszmail.pl", + "kpay.be", + "kpooa.com", + "kpost.be", + "krd.ag", + "krsw.tk", + "kruay.com", + "krypton.tk", + "ksmtrck.tk", + "kuhrap.com", + "kuku.lu", + "kulmeo.com", + "kulturbetrieb.info", + "kumli.racing", + "kurzepost.de", + "kutakbisajauhjauh.gq", + "kvhrr.com", + "kvhrs.com", + "kvhrw.com", + "kwift.net", + "kwilco.net", + "kyal.pl", + "kyois.com", + "kzccv.com", + "l-c-a.us", + "l33r.eu", + "l6factors.com", + "laafd.com", + "labetteraverouge.at", + "labworld.org", + "lacedmail.com", + "lackmail.net", + "lackmail.ru", + "lacto.info", + "lags.us", + "lain.ch", + "lak.pp.ua", + "lakelivingstonrealestate.com", + "lakqs.com", + "lamasticots.com", + "lambsauce.de", + "landmail.co", + "laoeq.com", + "larisia.com", + "larland.com", + "last-chance.pro", + "laste.ml", + "lastmail.co", + "lastmail.com", + "lawlita.com", + "laxex.ru", + "laxex.store", + "laymro.com", + "lazyinbox.com", + "lazyinbox.us", + "ldaho.biz", + "ldop.com", + "ldtp.com", + "le-tim.ru", + "lee.mx", + "leeching.net", + "leetmail.co", + "legalrc.loan", + "lellno.gq", + "lenovog4.com", + "lerbhe.com", + "letmeinonthis.com", + "letthemeatspam.com", + "lez.se", + "lgxscreen.com", + "lhsdv.com", + "liamcyrus.com", + "lifebyfood.com", + "lifetimefriends.info", + "lifetotech.com", + "ligsb.com", + "lillemap.net", + "lilo.me", + "lilspam.com", + "lindenbaumjapan.com", + "link2mail.net", + "linkedintuts2016.pw", + "linshiyou.com", + "linshiyouxiang.net", + "linuxmail.so", + "lista.cc", + "litedrop.com", + "liveradio.tk", + "lkgn.se", + "llogin.ru", + "loadby.us", + "loan101.pro", + "loaoa.com", + "loapq.com", + "locanto1.club", + "locantofuck.top", + "locantowsite.club", + "locomodev.net", + "login-email.cf", + "login-email.ga", + "login-email.ml", + "login-email.tk", + "logular.com", + "loh.pp.ua", + "loin.in", + "lolfreak.net", + "lolmail.biz", + "lookugly.com", + "lordsofts.com", + "lortemail.dk", + "losemymail.com", + "lovemeet.faith", + "lovemeleaveme.com", + "lpfmgmtltd.com", + "lr7.us", + "lr78.com", + "lroid.com", + "lru.me", + "ls-server.ru", + "lsyx24.com", + "luckymail.org", + "lukecarriere.com", + "lukemail.info", + "lukop.dk", + "luv2.us", + "lyfestylecreditsolutions.com", + "lyft.live", + "lyricspad.net", + "lzoaq.com", + "m21.cc", + "m4ilweb.info", + "maboard.com", + "mac-24.com", + "macr2.com", + "macromaid.com", + "macromice.info", + "magamail.com", + "maggotymeat.ga", + "magicbox.ro", + "magim.be", + "magspam.net", + "maidlow.info", + "mail-card.net", + "mail-easy.fr", + "mail-filter.com", + "mail-help.net", + "mail-hosting.co", + "mail-hub.info", + "mail-now.top", + "mail-owl.com", + "mail-share.com", + "mail-temporaire.com", + "mail-temporaire.fr", + "mail-tester.com", + "mail.by", + "mail.wtf", + "mail0.ga", + "mail1.top", + "mail114.net", + "mail1a.de", + "mail1web.org", + "mail21.cc", + "mail22.club", + "mail2rss.org", + "mail333.com", + "mail4trash.com", + "mail666.ru", + "mail7.io", + "mail707.com", + "mail72.com", + "mailapp.top", + "mailback.com", + "mailbidon.com", + "mailbiscuit.com", + "mailbiz.biz", + "mailblocks.com", + "mailbox.in.ua", + "mailbox.zip", + "mailbox52.ga", + "mailbox80.biz", + "mailbox82.biz", + "mailbox87.de", + "mailbox92.biz", + "mailboxify.ru", + "mailboxify.store", + "mailboxly.ru", + "mailboxly.store", + "mailboxy.fun", + "mailboxy.ru", + "mailboxy.store", + "mailbucket.org", + "mailcat.biz", + "mailcatch.com", + "mailchop.com", + "mailcker.com", + "maildax.me", + "mailde.de", + "mailde.info", + "maildrop.cc", + "maildrop.cf", + "maildrop.ga", + "maildrop.gq", + "maildrop.ml", + "maildu.de", + "maildx.com", + "maileater.com", + "mailed.in", + "mailed.ro", + "maileimer.de", + "maileme101.com", + "mailers.edu.pl", + "mailexpire.com", + "mailf5.com", + "mailfa.tk", + "mailfall.com", + "mailfast.pro", + "mailfirst.icu", + "mailforspam.com", + "mailfree.ga", + "mailfree.gq", + "mailfree.ml", + "mailfreeonline.com", + "mailfs.com", + "mailguard.me", + "mailgutter.com", + "mailhazard.com", + "mailhazard.us", + "mailhex.com", + "mailhub.pro", + "mailhz.me", + "mailimate.com", + "mailin8r.com", + "mailinatar.com", + "mailinater.com", + "mailinator.co.uk", + "mailinator.com", + "mailinator.gq", + "mailinator.info", + "mailinator.net", + "mailinator.org", + "mailinator.us", + "mailinator0.com", + "mailinator1.com", + "mailinator2.com", + "mailinator2.net", + "mailinator3.com", + "mailinator4.com", + "mailinator5.com", + "mailinator6.com", + "mailinator7.com", + "mailinator8.com", + "mailinator9.com", + "mailincubator.com", + "mailisia.com", + "mailismagic.com", + "mailita.tk", + "mailjunk.cf", + "mailjunk.ga", + "mailjunk.gq", + "mailjunk.ml", + "mailjunk.tk", + "mailmate.com", + "mailme.gq", + "mailme.ir", + "mailme.lv", + "mailme24.com", + "mailmenot.io", + "mailmetrash.com", + "mailmoat.com", + "mailmoth.com", + "mailms.com", + "mailna.biz", + "mailna.co", + "mailna.in", + "mailna.me", + "mailnator.com", + "mailnesia.com", + "mailnull.com", + "mailnuo.com", + "mailonaut.com", + "mailorc.com", + "mailorg.org", + "mailosaur.net", + "mailox.fun", + "mailpick.biz", + "mailpluss.com", + "mailpooch.com", + "mailpoof.com", + "mailpress.gq", + "mailproxsy.com", + "mailquack.com", + "mailrock.biz", + "mailsac.com", + "mailscrap.com", + "mailseal.de", + "mailshell.com", + "mailshiv.com", + "mailsiphon.com", + "mailslapping.com", + "mailslite.com", + "mailsucker.net", + "mailt.net", + "mailt.top", + "mailtechx.com", + "mailtemp.info", + "mailtemporaire.com", + "mailtemporaire.fr", + "mailto.plus", + "mailtome.de", + "mailtothis.com", + "mailtraps.com", + "mailtrash.net", + "mailtrix.net", + "mailtv.net", + "mailtv.tv", + "mailuniverse.co.uk", + "mailzi.ru", + "mailzilla.com", + "mailzilla.org", + "mainerfolg.info", + "makemenaughty.club", + "makemetheking.com", + "malahov.de", + "malayalamdtp.com", + "mama3.org", + "mamulenok.ru", + "mandraghen.cf", + "manifestgenerator.com", + "mannawo.com", + "mansiondev.com", + "manybrain.com", + "mark-compressoren.ru", + "marketlink.info", + "markmurfin.com", + "mask03.ru", + "maskmy.id", + "masonline.info", + "maswae.world", + "matamuasu.ga", + "matchpol.net", + "matra.site", + "max-mail.org", + "maxturns.com", + "mbox.re", + "mbx.cc", + "mcache.net", + "mciek.com", + "mdhc.tk", + "mdz.email", + "meantinc.com", + "mebelnu.info", + "mechanicalresumes.com", + "medkabinet-uzi.ru", + "meepsheep.eu", + "mehr-bitcoin.de", + "meidecn.com", + "meinspamschutz.de", + "meltedbrownies.com", + "meltmail.com", + "memsg.site", + "mentonit.net", + "mepost.pw", + "merepost.com", + "merry.pink", + "meruado.uk", + "messagebeamer.de", + "messwiththebestdielikethe.rest", + "metadownload.org", + "metaintern.net", + "metalunits.com", + "mezimages.net", + "mfsa.info", + "mfsa.ru", + "mfunza.com", + "mhzayt.online", + "miaferrari.com", + "miauj.com", + "midcoastcustoms.com", + "midcoastcustoms.net", + "midcoastsolutions.com", + "midcoastsolutions.net", + "midiharmonica.com", + "midlertidig.com", + "midlertidig.net", + "midlertidig.org", + "mierdamail.com", + "migmail.net", + "migmail.pl", + "migumail.com", + "mihep.com", + "mijnhva.nl", + "minimail.gq", + "ministry-of-silly-walks.de", + "minsmail.com", + "mintemail.com", + "mirai.re", + "misterpinball.de", + "miucce.com", + "mji.ro", + "mjj.edu.ge", + "mjukglass.nu", + "mkpfilm.com", + "ml8.ca", + "mliok.com", + "mm.my", + "mm5.se", + "mnode.me", + "moakt.cc", + "moakt.co", + "moakt.com", + "moakt.ws", + "mobileninja.co.uk", + "mobilevpn.top", + "moburl.com", + "mockmyid.com", + "moeri.org", + "mofu.be", + "mohmal.com", + "mohmal.im", + "mohmal.in", + "mohmal.tech", + "moimoi.re", + "molms.com", + "momentics.ru", + "monachat.tk", + "monadi.ml", + "moneypipe.net", + "monumentmail.com", + "moonwake.com", + "moot.es", + "moreawesomethanyou.com", + "moreorcs.com", + "morriesworld.ml", + "morsin.com", + "moruzza.com", + "motique.de", + "mountainregionallibrary.net", + "mox.pp.ua", + "moy-elektrik.ru", + "moza.pl", + "mozej.com", + "mp-j.ga", + "mr24.co", + "mrvpm.net", + "mrvpt.com", + "msgos.com", + "mspeciosa.com", + "msrc.ml", + "mswork.ru", + "msxd.com", + "mt2009.com", + "mt2014.com", + "mt2015.com", + "mtmdev.com", + "muathegame.com", + "muchomail.com", + "mucincanon.com", + "muehlacker.tk", + "muell.icu", + "muell.io", + "muell.monster", + "muell.xyz", + "muellemail.com", + "muellmail.com", + "munoubengoshi.gq", + "musiccode.me", + "mutant.me", + "mvrht.com", + "mvrht.net", + "mwarner.org", + "mxclip.com", + "mxfuel.com", + "my-pomsies.ru", + "my-teddyy.ru", + "my10minutemail.com", + "mybitti.de", + "mycleaninbox.net", + "mycorneroftheinter.net", + "myde.ml", + "mydefipet.live", + "mydemo.equipment", + "myecho.es", + "myemailboxy.com", + "mygeoweb.info", + "myindohome.services", + "myinfoinc.com", + "myinterserver.ml", + "mykickassideas.com", + "mymail-in.net", + "mymail90.com", + "mymailoasis.com", + "mymaily.lol", + "mynetstore.de", + "myopang.com", + "mypacks.net", + "mypartyclip.de", + "myphantomemail.com", + "mysamp.de", + "myspaceinc.com", + "myspaceinc.net", + "myspaceinc.org", + "myspacepimpedup.com", + "myspamless.com", + "mystvpn.com", + "mysugartime.ru", + "mytemp.email", + "mytempemail.com", + "mytempmail.com", + "mytrashmail.com", + "mywarnernet.net", + "mywrld.site", + "mywrld.top", + "myzx.com", + "mzico.com", + "n1nja.org", + "na-cat.com", + "naah.ru", + "naah.store", + "nabuma.com", + "nada.email", + "nada.ltd", + "nagi.be", + "nakedtruth.biz", + "namewok.com", + "nanonym.ch", + "naslazhdai.ru", + "nationalgardeningclub.com", + "navalcadets.com", + "nawmin.info", + "naymedia.com", + "nbzmr.com", + "negated.com", + "neko2.net", + "nekochan.fr", + "nekosan.uk", + "neomailbox.com", + "neotlozhniy-zaim.ru", + "nepwk.com", + "nervmich.net", + "nervtmich.net", + "net1mail.com", + "netcom.ws", + "netmails.com", + "netmails.net", + "netricity.nl", + "netris.net", + "netviewer-france.com", + "netzidiot.de", + "nevermail.de", + "newbpotato.tk", + "newfilm24.ru", + "newideasfornewpeople.info", + "newmail.top", + "next.ovh", + "nextmail.info", + "nextstopvalhalla.com", + "nezdiro.org", + "nezid.com", + "nezumi.be", + "nezzart.com", + "nfast.net", + "nguyenusedcars.com", + "nh3.ro", + "nice-4u.com", + "nicknassar.com", + "nincsmail.com", + "nincsmail.hu", + "niseko.be", + "niwl.net", + "nm123.com", + "nm7.cc", + "nmail.cf", + "nnh.com", + "nnot.net", + "nnoway.ru", + "no-spam.ws", + "no-trash.ru", + "no-ux.com", + "noblepioneer.com", + "nobugmail.com", + "nobulk.com", + "nobuma.com", + "noclickemail.com", + "nocp.ru", + "nocp.store", + "nodezine.com", + "nogmailspam.info", + "noicd.com", + "nokiamail.com", + "nolemail.ga", + "nomail.cf", + "nomail.ga", + "nomail.pw", + "nomail2me.com", + "nomorespamemails.com", + "nonspam.eu", + "nonspammer.de", + "nonze.ro", + "noref.in", + "norseforce.com", + "norwegischlernen.info", + "nospam4.us", + "nospamfor.us", + "nospamthanks.info", + "nothingtoseehere.ca", + "notif.me", + "notmailinator.com", + "notrnailinator.com", + "notsharingmy.info", + "now.im", + "nowhere.org", + "nowmymail.com", + "nowmymail.net", + "nproxi.com", + "nthrl.com", + "ntlhelp.net", + "nubescontrol.com", + "nullbox.info", + "nurfuerspam.de", + "nut.cc", + "nutpa.net", + "nuts2trade.com", + "nvhrw.com", + "nwldx.com", + "nwytg.com", + "nwytg.net", + "ny7.me", + "nyasan.com", + "nypato.com", + "nyrmusic.com", + "o2stk.org", + "o7i.net", + "oalsp.com", + "obfusko.com", + "objectmail.com", + "obobbo.com", + "oborudovanieizturcii.ru", + "obxpestcontrol.com", + "octovie.com", + "odaymail.com", + "odem.com", + "odnorazovoe.ru", + "oepia.com", + "oerpub.org", + "offshore-proxies.net", + "ofisher.net", + "ohaaa.de", + "ohi.tw", + "oida.icu", + "oing.cf", + "okclprojects.com", + "okinawa.li", + "okrent.us", + "okzk.com", + "olimp-case.ru", + "oloh.ru", + "oloh.store", + "olypmall.ru", + "omail.pro", + "omnievents.org", + "omtecha.com", + "one-mail.top", + "one-time.email", + "one2mail.info", + "onekisspresave.com", + "onemail.host", + "oneoffemail.com", + "oneoffmail.com", + "onetm.jp", + "onewaymail.com", + "onlatedotcom.info", + "online.ms", + "onlineidea.info", + "onlyapp.net", + "onqin.com", + "ontyne.biz", + "oohioo.com", + "oolus.com", + "oonies-shoprus.ru", + "oopi.org", + "oosln.com", + "oovk.ru", + "oovk.store", + "opayq.com", + "openavz.com", + "opendns.ro", + "opentrash.com", + "opmmedia.ga", + "opp24.com", + "optimaweb.me", + "opwebw.com", + "oranek.com", + "ordinaryamerican.net", + "oreidresume.com", + "orgmbx.cc", + "oroki.de", + "orsbap.com", + "oshietechan.link", + "otherinbox.com", + "ourklips.com", + "ourpreviewdomain.com", + "outlawspam.com", + "outlook.edu.pl", + "outmail.win", + "ovomail.co", + "ovpn.to", + "owleyes.ch", + "owlpic.com", + "ownsyou.de", + "oxopoha.com", + "ozatvn.com", + "ozyl.de", + "p-banlis.ru", + "p33.org", + "p71ce1m.com", + "pa9e.com", + "pachilly.com", + "packiu.com", + "pagamenti.tk", + "paharpurmim.ga", + "pakadebu.ga", + "pamaweb.com", + "pancakemail.com", + "papierkorb.me", + "paplease.com", + "para2019.ru", + "parlimentpetitioner.tk", + "pastebitch.com", + "patonce.com", + "pavilionx2.com", + "payperex2.com", + "payspun.com", + "pe.hu", + "pecinan.com", + "pecinan.net", + "pecinan.org", + "penisgoes.in", + "penoto.tk", + "pepbot.com", + "peterdethier.com", + "petloca.com", + "petrzilka.net", + "pewpewpewpew.pw", + "pflege-schoene-haut.de", + "pfui.ru", + "phone-elkey.ru", + "photo-impact.eu", + "photomark.net", + "pi.vu", + "piaa.me", + "pig.pp.ua", + "pii.at", + "piki.si", + "pimpedupmyspace.com", + "pinehill-seattle.org", + "pingir.com", + "pipemail.space", + "pisls.com", + "pitaniezdorovie.ru", + "pivo-bar.ru", + "pixiil.com", + "pizu.ru", + "pizu.store", + "pizzajunk.com", + "pjjkp.com", + "placebomail10.com", + "pleasenoham.org", + "plexfirm.com", + "plexolan.de", + "plhk.ru", + "ploae.com", + "ploncy.com", + "plw.me", + "poehali-otdihat.ru", + "pojok.ml", + "pokemail.net", + "pokiemobile.com", + "polarkingxx.ml", + "politikerclub.de", + "polyfaust.net", + "pooae.com", + "poofy.org", + "pookmail.com", + "poopiebutt.club", + "popcornfarm7.com", + "popcornfly.com", + "popesodomy.com", + "popgx.com", + "porjoton.com", + "porsh.net", + "posdz.com", + "posta.store", + "postacin.com", + "postbx.ru", + "postbx.store", + "postonline.me", + "poutineyourface.com", + "powered.name", + "powerencry.com", + "powlearn.com", + "pp7rvv.com", + "ppetw.com", + "pptrvv.com", + "pqoia.com", + "pratikmail.com", + "pratikmail.net", + "pratikmail.org", + "prazdnik-37.ru", + "predatorrat.cf", + "predatorrat.ga", + "predatorrat.gq", + "predatorrat.ml", + "predatorrat.tk", + "premium-mail.fr", + "primabananen.net", + "prin.be", + "privacy.net", + "privatdemail.net", + "privmail.edu.pl", + "privy-mail.com", + "privy-mail.de", + "privymail.de", + "pro-tag.org", + "pro5g.com", + "procrackers.com", + "profast.top", + "projectcl.com", + "promailt.com", + "proprietativalcea.ro", + "propscore.com", + "protempmail.com", + "proxymail.eu", + "proxyparking.com", + "prtnx.com", + "prtshr.com", + "prtz.eu", + "psh.me", + "psles.com", + "psnator.com", + "psoxs.com", + "puglieisi.com", + "puji.pro", + "punkass.com", + "puppetmail.de", + "purcell.email", + "purelogistics.org", + "pursip.com", + "put2.net", + "puttanamaiala.tk", + "putthisinyourspamdatabase.com", + "pwpwa.com", + "pwrby.com", + "qabq.com", + "qasti.com", + "qbfree.us", + "qc.to", + "qibl.at", + "qiott.com", + "qipmail.net", + "qiq.us", + "qisdo.com", + "qisoa.com", + "qmrbe.com", + "qodiq.com", + "qoika.com", + "qopow.com", + "qq.my", + "qsl.ro", + "qtum-ico.com", + "quadrafit.com", + "quick-mail.cc", + "quickemail.info", + "quickinbox.com", + "quickmail.nl", + "quicksend.ch", + "quipas.com", + "ququb.com", + "qvy.me", + "qwickmail.com", + "r4nd0m.de", + "ra3.us", + "rabin.ca", + "rabiot.reisen", + "rackabzar.com", + "raetp9.com", + "rainbowly.ml", + "raketenmann.de", + "ramenmail.de", + "ramin200.site", + "rancidhome.net", + "randomail.io", + "randomail.net", + "rapt.be", + "raqid.com", + "rax.la", + "raxtest.com", + "razemail.com", + "razuz.com", + "rbb.org", + "rcasd.com", + "rcpt.at", + "rdklcrv.xyz", + "re-gister.com", + "reality-concept.club", + "reallymymail.com", + "realquickemail.com", + "realtyalerts.ca", + "rebates.stream", + "receiveee.com", + "recipeforfailure.com", + "recode.me", + "reconmail.com", + "recyclemail.dk", + "redfeathercrow.com", + "reftoken.net", + "regapts.com", + "regbypass.com", + "regspaces.tk", + "reimondo.com", + "rejectmail.com", + "rejo.technology", + "reliable-mail.com", + "remail.cf", + "remail.ga", + "remarkable.rocks", + "remote.li", + "rentaen.com", + "replyloop.com", + "reptilegenetics.com", + "resgedvgfed.tk", + "revolvingdoorhoax.org", + "rfc822.org", + "rhyta.com", + "richfinances.pw", + "riddermark.de", + "rifkian.ga", + "rinseart.com", + "rippb.com", + "risingsuntouch.com", + "riski.cf", + "risu.be", + "rklips.com", + "rkomo.com", + "rm2rf.com", + "rma.ec", + "rmqkr.net", + "rnailinator.com", + "ro.lt", + "robertspcrepair.com", + "roborena.com", + "robot-mail.com", + "rollindo.agency", + "ronnierage.net", + "rootfest.net", + "rosebearmylove.ru", + "rotaniliam.com", + "rover.info", + "rowe-solutions.com", + "royal.net", + "royaldoodles.org", + "royalmarket.life", + "royandk.com", + "rppkn.com", + "rsvhr.com", + "rteet.com", + "rtrtr.com", + "rtskiya.xyz", + "rudymail.ml", + "rumgel.com", + "runi.ca", + "rupayamail.com", + "ruru.be", + "rustydoor.com", + "rustyload.com", + "ruu.kr", + "rvb.ro", + "ryteto.me", + "ryyr.ru", + "ryyr.store", + "s0ny.net", + "s33db0x.com", + "sabrestlouis.com", + "sackboii.com", + "saeoil.com", + "safaat.cf", + "safermail.info", + "safersignup.de", + "safetymail.info", + "safetypost.de", + "saharanightstempe.com", + "sailmail.io", + "salmeow.tk", + "samsclass.info", + "sandcars.net", + "sandelf.de", + "sandwhichvideo.com", + "sanfinder.com", + "sanim.net", + "sanstr.com", + "sast.ro", + "satisfyme.club", + "satukosong.com", + "sausen.com", + "saynotospams.com", + "scatmail.com", + "scay.net", + "schachrol.com", + "schafmail.de", + "schmeissweg.tk", + "schrott-email.de", + "scrsot.com", + "sd3.in", + "sdvft.com", + "sdvgeft.com", + "sdvrecft.com", + "secmail.pw", + "secretemail.de", + "secure-mail.biz", + "secure-mail.cc", + "secured-link.net", + "securehost.com.es", + "seekapps.com", + "seekjobs4u.com", + "sejaa.lv", + "selfdestructingmail.com", + "selfdestructingmail.org", + "send22u.info", + "sendapp.uk", + "sendfree.org", + "sendingspecialflyers.com", + "sendnow.win", + "sendspamhere.com", + "senseless-entertainment.com", + "seosnaps.com", + "server.ms", + "services391.com", + "sexforswingers.com", + "sexical.com", + "sexyalwasmi.top", + "sfolkar.com", + "sgatra.com", + "shadap.org", + "shalar.net", + "sharedmailbox.org", + "sharkfaces.com", + "sharklasers.com", + "shchiba.uk", + "sheryli.com", + "shhmail.com", + "shhuut.org", + "shieldedmail.com", + "shieldemail.com", + "shiftmail.com", + "shipfromto.com", + "shiphazmat.org", + "shipping-regulations.com", + "shippingterms.org", + "shitaway.tk", + "shitmail.de", + "shitmail.me", + "shitmail.org", + "shmeriously.com", + "shopxda.com", + "shortmail.net", + "shotmail.ru", + "showslow.de", + "shrib.com", + "shut.name", + "shut.ws", + "siberpay.com", + "sidelka-mytischi.ru", + "siftportal.ru", + "sify.com", + "sika3.com", + "sikux.com", + "silenceofthespam.com", + "siliwangi.ga", + "silvercoin.life", + "sim-simka.ru", + "simaenaga.com", + "simpleitsecurity.info", + "sin.cl", + "sinaite.net", + "sinema.ml", + "sinfiltro.cl", + "singlespride.com", + "sinnlos-mail.de", + "sino.tw", + "siteposter.net", + "sizzlemctwizzle.com", + "sjuaq.com", + "skeefmail.com", + "skrak.com", + "skrx.tk", + "sky-inbox.com", + "sky-ts.de", + "skygazerhub.com", + "skyrt.de", + "slapsfromlastnight.com", + "slaskpost.se", + "slave-auctions.net", + "slippery.email", + "slipry.net", + "slopsbox.com", + "slothmail.net", + "slushmail.com", + "sluteen.com", + "sly.io", + "smallker.tk", + "smapfree24.com", + "smapfree24.de", + "smapfree24.eu", + "smapfree24.info", + "smapfree24.org", + "smartemailbox.co", + "smartnator.com", + "smarttalent.pw", + "smashmail.de", + "smellfear.com", + "smellrear.com", + "smellypotato.tk", + "smtp99.com", + "smwg.info", + "snakebutt.com", + "snakemail.com", + "snapmail.cc", + "snapwet.com", + "sneakmail.de", + "snece.com", + "social-mailer.tk", + "socialfurry.org", + "sociallymediocre.com", + "sofia.re", + "sofimail.com", + "sofort-mail.de", + "sofortmail.de", + "sofrge.com", + "softkey-office.ru", + "softpls.asia", + "sogetthis.com", + "sohai.ml", + "sohus.cn", + "soioa.com", + "soisz.com", + "solar-impact.pro", + "solvemail.info", + "solventtrap.wiki", + "songsign.com", + "sonshi.cf", + "soodmail.com", + "soodomail.com", + "soodonims.com", + "soombo.com", + "soon.it", + "spacebazzar.ru", + "spam-be-gone.com", + "spam.care", + "spam.ceo", + "spam.la", + "spam.org.es", + "spam.su", + "spam4.me", + "spamail.de", + "spamarrest.com", + "spamavert.com", + "spambob.com", + "spambob.net", + "spambob.org", + "spambog.com", + "spambog.de", + "spambog.net", + "spambog.ru", + "spambooger.com", + "spambox.info", + "spambox.me", + "spambox.org", + "spambox.us", + "spamcero.com", + "spamcon.org", + "spamcorptastic.com", + "spamcowboy.com", + "spamcowboy.net", + "spamcowboy.org", + "spamday.com", + "spamdecoy.net", + "spamex.com", + "spamfellas.com", + "spamfighter.cf", + "spamfighter.ga", + "spamfighter.gq", + "spamfighter.ml", + "spamfighter.tk", + "spamfree.eu", + "spamfree24.com", + "spamfree24.de", + "spamfree24.eu", + "spamfree24.info", + "spamfree24.net", + "spamfree24.org", + "spamgoes.in", + "spamherelots.com", + "spamhereplease.com", + "spamhole.com", + "spamify.com", + "spaminator.de", + "spamkill.info", + "spaml.com", + "spaml.de", + "spamlot.net", + "spammer.fail", + "spammotel.com", + "spammy.host", + "spamobox.com", + "spamoff.de", + "spamsalad.in", + "spamsandwich.com", + "spamslicer.com", + "spamsphere.com", + "spamspot.com", + "spamstack.net", + "spamthis.co.uk", + "spamthis.network", + "spamthisplease.com", + "spamtrail.com", + "spamtrap.ro", + "spamtroll.net", + "spamwc.cf", + "spamwc.ga", + "spamwc.gq", + "spamwc.ml", + "speedgaus.net", + "sperma.cf", + "spicysoda.com", + "spikio.com", + "spindl-e.com", + "spoofmail.de", + "sportrid.com", + "spr.io", + "spritzzone.de", + "spruzme.com", + "spybox.de", + "spymail.com", + "spymail.one", + "squizzy.de", + "squizzy.net", + "sroff.com", + "sry.li", + "ssoia.com", + "stanfordujjain.com", + "starlight-breaker.net", + "starmail.net", + "starpower.space", + "startfu.com", + "startkeys.com", + "statdvr.com", + "stathost.net", + "statiix.com", + "stayhome.li", + "steam-area.ru", + "steambot.net", + "stexsy.com", + "stinkefinger.net", + "stop-my-spam.cf", + "stop-my-spam.com", + "stop-my-spam.ga", + "stop-my-spam.ml", + "stop-my-spam.pp.ua", + "stop-my-spam.tk", + "stopspam.app", + "storiqax.top", + "storj99.com", + "storj99.top", + "streetwisemail.com", + "stromox.com", + "stuckmail.com", + "stuffmail.de", + "stumpfwerk.com", + "stylist-volos.ru", + "submic.com", + "suburbanthug.com", + "suckmyd.com", + "sudern.de", + "sueshaw.com", + "suexamplesb.com", + "suioe.com", + "super-auswahl.de", + "superblohey.com", + "supergreatmail.com", + "supermailer.jp", + "superplatyna.com", + "superrito.com", + "supersave.net", + "superstachel.de", + "superyp.com", + "suremail.info", + "sute.jp", + "svip520.cn", + "svk.jp", + "svxr.org", + "sweetpotato.ml", + "sweetxxx.de", + "swift-mail.net", + "swift10minutemail.com", + "syinxun.com", + "sylvannet.com", + "symphonyresume.com", + "syosetu.gq", + "syujob.accountants", + "szerz.com", + "tafmail.com", + "tafoi.gr", + "taglead.com", + "tagmymedia.com", + "tagyourself.com", + "talkinator.com", + "talmetry.com", + "tanlanav.com", + "tanukis.org", + "taobudao.com", + "tapchicuoihoi.com", + "taphear.com", + "tapi.re", + "tarzanmail.cf", + "tastrg.com", + "tatsu.uk", + "taukah.com", + "tb-on-line.net", + "tcwlm.com", + "tcwlx.com", + "tdtda.com", + "tech69.com", + "techblast.ch", + "techemail.com", + "techgroup.me", + "technoproxy.ru", + "teerest.com", + "teewars.org", + "tefl.ro", + "telecomix.pl", + "teleg.eu", + "telegmail.com", + "teleworm.com", + "teleworm.us", + "tellos.xyz", + "telvetto.com", + "teml.net", + "temp-link.net", + "temp-mail.com", + "temp-mail.de", + "temp-mail.org", + "temp-mail.pp.ua", + "temp-mail.ru", + "temp-mails.com", + "tempail.com", + "tempalias.com", + "tempe-mail.com", + "tempemail.biz", + "tempemail.co.za", + "tempemail.com", + "tempemail.net", + "tempinbox.co.uk", + "tempinbox.com", + "tempmail.cn", + "tempmail.co", + "tempmail.de", + "tempmail.eu", + "tempmail.it", + "tempmail.pp.ua", + "tempmail.us", + "tempmail.ws", + "tempmail2.com", + "tempmaildemo.com", + "tempmailer.com", + "tempmailer.de", + "tempmailer.net", + "tempmailo.com", + "tempomail.fr", + "tempomail.org", + "temporarily.de", + "temporarioemail.com.br", + "temporary-mail.net", + "temporaryemail.net", + "temporaryemail.us", + "temporaryforwarding.com", + "temporaryinbox.com", + "temporarymailaddress.com", + "tempr.email", + "tempsky.com", + "temptami.com", + "tempthe.net", + "tempymail.com", + "tensi.org", + "ternaklele.ga", + "testore.co", + "testudine.com", + "thanksnospam.info", + "thankyou2010.com", + "thatim.info", + "thc.st", + "theaviors.com", + "thebearshark.com", + "thecarinformation.com", + "thechildrensfocus.com", + "thecity.biz", + "thecloudindex.com", + "thediamants.org", + "thedirhq.info", + "theeyeoftruth.com", + "thejoker5.com", + "thelightningmail.net", + "thelimestones.com", + "thembones.com.au", + "themegreview.com", + "themostemail.com", + "thereddoors.online", + "theroyalweb.club", + "thescrappermovie.com", + "thespamfather.com", + "theteastory.info", + "thex.ro", + "thichanthit.com", + "thietbivanphong.asia", + "thisisnotmyrealemail.com", + "thismail.net", + "thisurl.website", + "thnikka.com", + "thoas.ru", + "thraml.com", + "thrma.com", + "throam.com", + "thrott.com", + "throwam.com", + "throwawayemailaddress.com", + "throwawaymail.com", + "throwawaymail.pp.ua", + "throya.com", + "thrubay.com", + "thunderbolt.science", + "thunkinator.org", + "thxmate.com", + "tiapz.com", + "tic.ec", + "tilien.com", + "timgiarevn.com", + "timkassouf.com", + "tinoza.org", + "tinyurl24.com", + "tipsb.com", + "tittbit.in", + "tiv.cc", + "tizi.com", + "tkitc.de", + "tlpn.org", + "tmail.com", + "tmail.io", + "tmail.link", + "tmail.ws", + "tmail3.com", + "tmail9.com", + "tmailinator.com", + "tmails.net", + "tmmbt.net", + "tmpbox.net", + "tmpemails.com", + "tmpeml.com", + "tmpeml.info", + "tmpjr.me", + "tmpmail.net", + "tmpmail.org", + "tmpmailtor.com", + "tmpnator.live", + "tmpx.sa.com", + "toddsbighug.com", + "tofeat.com", + "toiea.com", + "tokem.co", + "tokenmail.de", + "tonaeto.com", + "tonne.to", + "tonymanso.com", + "toomail.biz", + "toon.ml", + "top-shop-tovar.ru", + "top101.de", + "top1mail.ru", + "top1post.ru", + "topinrock.cf", + "topmail2.com", + "topmail2.net", + "topofertasdehoy.com", + "topranklist.de", + "toprumours.com", + "tormail.org", + "tospage.com", + "toss.pw", + "tosunkaya.com", + "totallynotfake.net", + "totalvista.com", + "totesmail.com", + "totoan.info", + "tourcc.com", + "tp-qa-mail.com", + "tpwlb.com", + "tqoai.com", + "tqosi.com", + "trackden.com", + "tradermail.info", + "tranceversal.com", + "trap-mail.de", + "trash-amil.com", + "trash-mail.at", + "trash-mail.cf", + "trash-mail.com", + "trash-mail.de", + "trash-mail.ga", + "trash-mail.gq", + "trash-mail.ml", + "trash-mail.tk", + "trash-me.com", + "trash2009.com", + "trash2010.com", + "trash2011.com", + "trashcanmail.com", + "trashdevil.com", + "trashdevil.de", + "trashemail.de", + "trashemails.de", + "trashinbox.com", + "trashmail.at", + "trashmail.com", + "trashmail.de", + "trashmail.gq", + "trashmail.io", + "trashmail.me", + "trashmail.net", + "trashmail.org", + "trashmail.ws", + "trashmailer.com", + "trashmailgenerator.de", + "trashmails.com", + "trashymail.com", + "trashymail.net", + "trasz.com", + "trayna.com", + "trbvm.com", + "trbvn.com", + "trbvo.com", + "trend-maker.ru", + "trgfu.com", + "trgovinanaveliko.info", + "trialmail.de", + "trickmail.net", + "trillianpro.com", + "triots.com", + "trixtrux1.ru", + "trollproject.com", + "tropicalbass.info", + "trungtamtoeic.com", + "truthfinderlogin.com", + "tryalert.com", + "tryninja.io", + "tryzoe.com", + "tsderp.com", + "ttirv.org", + "ttszuo.xyz", + "tualias.com", + "tuofs.com", + "tupmail.com", + "turoid.com", + "turual.com", + "turuma.com", + "tutuapp.bid", + "tvchd.com", + "tverya.com", + "twinmail.de", + "twkly.ml", + "twocowmail.net", + "twoweirdtricks.com", + "twzhhq.online", + "txcct.com", + "txen.de", + "txtadvertise.com", + "tyhe.ro", + "tyldd.com", + "tympe.net", + "uacro.com", + "uber-mail.com", + "ubinert.com", + "ubismail.net", + "ubm.md", + "ucche.us", + "ucupdong.ml", + "uemail99.com", + "ufacturing.com", + "uggsrock.com", + "uguuchantele.com", + "uhe2.com", + "uhhu.ru", + "uiu.us", + "ujijima1129.gq", + "uk.to", + "ultra.fyi", + "ultrada.ru", + "uma3.be", + "umail.net", + "undo.it", + "unicodeworld.com", + "unids.com", + "unimark.org", + "unit7lahaina.com", + "unmail.ru", + "uooos.com", + "uorak.com", + "upliftnow.com", + "uplipht.com", + "uploadnolimit.com", + "upozowac.info", + "urfunktion.se", + "urhen.com", + "uroid.com", + "us.af", + "us.to", + "usa.cc", + "usako.net", + "usbc.be", + "used-product.fr", + "ushijima1129.cf", + "ushijima1129.ga", + "ushijima1129.gq", + "ushijima1129.ml", + "ushijima1129.tk", + "utiket.us", + "uu.gl", + "uu2.ovh", + "uuf.me", + "uwork4.us", + "uyhip.com", + "vaasfc4.tk", + "vaati.org", + "valemail.net", + "valhalladev.com", + "vankin.de", + "vasteron.com", + "vctel.com", + "vda.ro", + "vddaz.com", + "vdig.com", + "veanlo.com", + "vemomail.win", + "venompen.com", + "veo.kr", + "ver0.cf", + "ver0.ga", + "ver0.gq", + "ver0.ml", + "ver0.tk", + "vercelli.cf", + "vercelli.ga", + "vercelli.gq", + "vercelli.ml", + "verdejo.com", + "vermutlich.net", + "veryday.ch", + "veryday.eu", + "veryday.info", + "veryrealemail.com", + "vesa.pw", + "vevs.de", + "vfemail.net", + "via.tokyo.jp", + "vickaentb.tk", + "victime.ninja", + "victoriantwins.com", + "vidchart.com", + "viditag.com", + "viewcastmedia.com", + "viewcastmedia.net", + "viewcastmedia.org", + "vikingsonly.com", + "vinernet.com", + "vintomaper.com", + "vipepe.com", + "vipmail.name", + "vipmail.pw", + "vipxm.net", + "viralplays.com", + "virtualemail.info", + "visal007.tk", + "visal168.cf", + "visal168.ga", + "visal168.gq", + "visal168.ml", + "visal168.tk", + "visignal.com", + "vixletdev.com", + "vixtricks.com", + "vjoid.ru", + "vjoid.store", + "vjuum.com", + "vkbb.ru", + "vkbb.store", + "vkbt.ru", + "vkbt.store", + "vkcbt.ru", + "vkcbt.store", + "vkcode.ru", + "vkfu.ru", + "vkfu.store", + "vkpr.store", + "vkr1.com", + "vkrr.ru", + "vkrr.store", + "vmailing.info", + "vmani.com", + "vmpanda.com", + "vnedu.me", + "voidbay.com", + "volaj.com", + "voltaer.com", + "vomoto.com", + "vorga.org", + "votiputox.org", + "voxelcore.com", + "vpn.st", + "vps30.com", + "vps911.net", + "vradportal.com", + "vremonte24-store.ru", + "vrmtr.com", + "vsimcard.com", + "vssms.com", + "vtxmail.us", + "vubby.com", + "vuiy.pw", + "vusra.com", + "vztc.com", + "w-asertun.ru", + "w3internet.co.uk", + "wakingupesther.com", + "walala.org", + "walkmail.net", + "walkmail.ru", + "wallm.com", + "wanko.be", + "watch-harry-potter.com", + "watchever.biz", + "watchfull.net", + "watchironman3onlinefreefullmovie.com", + "waterisgone.com", + "watrf.com", + "wazabi.club", + "wbdev.tech", + "wbml.net", + "web-contact.info", + "web-ideal.fr", + "web-inc.net", + "web-mail.pp.ua", + "web2mailco.com", + "webcontact-france.eu", + "webemail.me", + "webhook.site", + "webm4il.info", + "webmail24.top", + "webtrip.ch", + "webuser.in", + "wecp.ru", + "wecp.store", + "wee.my", + "wef.gr", + "weg-werf-email.de", + "wegwerf-email-addressen.de", + "wegwerf-email-adressen.de", + "wegwerf-email.at", + "wegwerf-email.de", + "wegwerf-email.net", + "wegwerf-emails.de", + "wegwerfadresse.de", + "wegwerfemail.com", + "wegwerfemail.de", + "wegwerfemail.info", + "wegwerfemail.net", + "wegwerfemail.org", + "wegwerfemailadresse.com", + "wegwerfmail.de", + "wegwerfmail.info", + "wegwerfmail.net", + "wegwerfmail.org", + "wegwerpmailadres.nl", + "wegwrfmail.de", + "wegwrfmail.net", + "wegwrfmail.org", + "weizixu.com", + "wekawa.com", + "welikecookies.com", + "wellsfargocomcardholders.com", + "wemel.top", + "wenkuu.com", + "wentcity.com", + "wetrainbayarea.com", + "wetrainbayarea.org", + "wfgdfhj.tk", + "wg0.com", + "wh4f.org", + "whaaaaaaaaaat.com", + "whatiaas.com", + "whatifanalytics.com", + "whatpaas.com", + "whatsaas.com", + "whiffles.org", + "whopy.com", + "whyspam.me", + "wibblesmith.com", + "wickmail.net", + "widaryanto.info", + "widget.gg", + "wiemei.com", + "wierie.tk", + "wifimaple.com", + "wifioak.com", + "wikfee.com", + "wikidocuslava.ru", + "wilemail.com", + "willhackforfood.biz", + "willselfdestruct.com", + "wimsg.com", + "winemaven.info", + "wins.com.br", + "wlist.ro", + "wmail.cf", + "wmail.club", + "wokcy.com", + "wolfmail.ml", + "wolfsmail.tk", + "wollan.info", + "worldspace.link", + "wpdork.com", + "wpg.im", + "wralawfirm.com", + "writeme.us", + "wronghead.com", + "ws.gy", + "wsym.de", + "wudet.men", + "wuespdj.xyz", + "wupics.com", + "wuuvo.com", + "wuzak.com", + "wuzup.net", + "wuzupmail.net", + "wwjmp.com", + "wwvk.ru", + "wwvk.store", + "wwwnew.eu", + "wxnw.net", + "x24.com", + "xagloo.co", + "xagloo.com", + "xbaby69.top", + "xcode.ro", + "xcodes.net", + "xcompress.com", + "xcoxc.com", + "xcpy.com", + "xemaps.com", + "xemne.com", + "xents.com", + "xepa.ru", + "xjoi.com", + "xkx.me", + "xl.cx", + "xmail.com", + "xmailer.be", + "xmaily.com", + "xn--9kq967o.com", + "xn--d-bga.net", + "xojxe.com", + "xost.us", + "xoxox.cc", + "xperiae5.com", + "xrap.de", + "xrho.com", + "xvx.us", + "xww.ro", + "xxhamsterxx.ga", + "xxi2.com", + "xxlocanto.us", + "xxolocanto.us", + "xxqx3802.com", + "xxvk.ru", + "xxvk.store", + "xxxhi.cc", + "xy9ce.tk", + "xylar.ru", + "xylar.store", + "xyzfree.net", + "xzsok.com", + "yabai-oppai.tk", + "yahmail.top", + "yahooproduct.net", + "yamail.win", + "yanet.me", + "yannmail.win", + "yapped.net", + "yaqp.com", + "yarnpedia.ga", + "ycare.de", + "ycn.ro", + "ye.vc", + "yecp.ru", + "yecp.store", + "yedi.org", + "yeezus.ru", + "yep.it", + "yermail.net", + "yhg.biz", + "ynmrealty.com", + "yodx.ro", + "yogamaven.com", + "yoggm.com", + "yomail.info", + "yoo.ro", + "yopmail.com", + "yopmail.fr", + "yopmail.gq", + "yopmail.net", + "yopmail.pp.ua", + "yordanmail.cf", + "you-spam.com", + "yougotgoated.com", + "youmail.ga", + "youmailr.com", + "youneedmore.info", + "youpymail.com", + "your5.ru", + "your5.store", + "yourdomain.com", + "youremail.cf", + "yourewronghereswhy.com", + "yourlms.biz", + "yourspamgoesto.space", + "yourtube.ml", + "youxiang.dev", + "yroid.com", + "yspend.com", + "ytpayy.com", + "yugasandrika.com", + "yui.it", + "yuoia.com", + "yuurok.com", + "yxdad.ru", + "yxdad.store", + "yxzx.net", + "yyolf.net", + "z-o-e-v-a.ru", + "z0d.eu", + "z1p.biz", + "z86.ru", + "zain.site", + "zainmax.net", + "zaktouni.fr", + "zarabotokdoma11.ru", + "zasod.com", + "zaym-zaym.ru", + "zcovz.ru", + "zcovz.store", + "zcrcd.com", + "zdenka.net", + "ze.tc", + "zebins.com", + "zebins.eu", + "zehnminuten.de", + "zehnminutenmail.de", + "zemzar.net", + "zepp.dk", + "zetmail.com", + "zfymail.com", + "zhaoqian.ninja", + "zhaoyuanedu.cn", + "zhcne.com", + "zhewei88.com", + "zhorachu.com", + "zik.dj", + "zipcad.com", + "zipcatfish.com", + "zipo1.gq", + "zippymail.info", + "zipsendtest.com", + "ziragold.com", + "zoaxe.com", + "zoemail.com", + "zoemail.net", + "zoemail.org", + "zoetropes.org", + "zombie-hive.com", + "zomg.info", + "zsero.com", + "zumpul.com", + "zv68.com", + "zxcv.com", + "zxcvbnm.com", + "zymuying.com", + "zzi.us", + "zzrgg.com", + "zzz.com", + } +}) diff --git a/modules/setting/f3.go b/modules/setting/f3.go index 8669b70562..31d12294b8 100644 --- a/modules/setting/f3.go +++ b/modules/setting/f3.go @@ -3,7 +3,7 @@ package setting import ( - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // Friendly Forge Format (F3) settings diff --git a/modules/setting/federation.go b/modules/setting/federation.go index aeb30683ea..a0fdec228e 100644 --- a/modules/setting/federation.go +++ b/modules/setting/federation.go @@ -4,9 +4,9 @@ package setting import ( - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" - "github.com/go-fed/httpsig" + "github.com/42wim/httpsig" ) // Federation settings diff --git a/modules/setting/git.go b/modules/setting/git.go index 812c4fe6c9..f35592a924 100644 --- a/modules/setting/git.go +++ b/modules/setting/git.go @@ -8,7 +8,7 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // Git settings diff --git a/modules/setting/i18n.go b/modules/setting/i18n.go index 889e52beb6..a400cf844c 100644 --- a/modules/setting/i18n.go +++ b/modules/setting/i18n.go @@ -9,7 +9,9 @@ var defaultI18nLangNames = []string{ "zh-CN", "简体中文", "zh-HK", "ç¹é«”中文(香港)", "zh-TW", "ç¹é«”中文(å°ç£ï¼‰", + "da", "Dansk", "de-DE", "Deutsch", + "nds", "Plattdüütsch", "fr-FR", "Français", "nl-NL", "Nederlands", "lv-LV", "LatvieÅ¡u", diff --git a/modules/setting/incoming_email.go b/modules/setting/incoming_email.go index 287e72941c..502be159a1 100644 --- a/modules/setting/incoming_email.go +++ b/modules/setting/incoming_email.go @@ -8,7 +8,7 @@ import ( "net/mail" "strings" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) var IncomingEmail = struct { diff --git a/modules/setting/indexer.go b/modules/setting/indexer.go index 3c96b58740..6a464ee0de 100644 --- a/modules/setting/indexer.go +++ b/modules/setting/indexer.go @@ -9,7 +9,7 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" "github.com/gobwas/glob" ) @@ -109,7 +109,7 @@ func IndexerGlobFromString(globstr string) []Glob { expr = strings.TrimSpace(expr) if expr != "" { if g, err := glob.Compile(expr, '.', '/'); err != nil { - log.Info("Invalid glob expression '%s' (skipped): %v", expr, err) + log.Warn("Invalid glob expression '%s' (skipped): %v", expr, err) } else { extarr = append(extarr, Glob{glob: g, pattern: expr}) } diff --git a/modules/setting/lfs.go b/modules/setting/lfs.go index 750101747f..3cd48c538b 100644 --- a/modules/setting/lfs.go +++ b/modules/setting/lfs.go @@ -7,25 +7,35 @@ import ( "fmt" "time" - "code.gitea.io/gitea/modules/generate" + "forgejo.org/modules/generate" ) -// LFS represents the configuration for Git LFS +// LFS represents the server-side configuration for Git LFS. +// Ideally these options should be in a section like "[lfs_server]", +// but they are in "[server]" section due to historical reasons. +// Could be refactored in the future while keeping backwards compatibility. var LFS = struct { StartServer bool `ini:"LFS_START_SERVER"` JWTSecretBytes []byte `ini:"-"` HTTPAuthExpiry time.Duration `ini:"LFS_HTTP_AUTH_EXPIRY"` MaxFileSize int64 `ini:"LFS_MAX_FILE_SIZE"` LocksPagingNum int `ini:"LFS_LOCKS_PAGING_NUM"` + MaxBatchSize int `ini:"LFS_MAX_BATCH_SIZE"` Storage *Storage }{} +// LFSClient represents configuration for Gitea's LFS clients, for example: mirroring upstream Git LFS +var LFSClient = struct { + BatchSize int `ini:"BATCH_SIZE"` + BatchOperationConcurrency int `ini:"BATCH_OPERATION_CONCURRENCY"` +}{} + func loadLFSFrom(rootCfg ConfigProvider) error { + mustMapSetting(rootCfg, "lfs_client", &LFSClient) + + mustMapSetting(rootCfg, "server", &LFS) sec := rootCfg.Section("server") - if err := sec.MapTo(&LFS); err != nil { - return fmt.Errorf("failed to map LFS settings: %v", err) - } lfsSec, _ := rootCfg.GetSection("lfs") @@ -52,6 +62,15 @@ func loadLFSFrom(rootCfg ConfigProvider) error { LFS.LocksPagingNum = 50 } + if LFSClient.BatchSize < 1 { + LFSClient.BatchSize = 20 + } + + if LFSClient.BatchOperationConcurrency < 1 { + // match the default git-lfs's `lfs.concurrenttransfers` https://github.com/git-lfs/git-lfs/blob/main/docs/man/git-lfs-config.adoc#upload-and-download-transfer-settings + LFSClient.BatchOperationConcurrency = 8 + } + LFS.HTTPAuthExpiry = sec.Key("LFS_HTTP_AUTH_EXPIRY").MustDuration(24 * time.Hour) if !LFS.StartServer || !InstallLock { diff --git a/modules/setting/lfs_test.go b/modules/setting/lfs_test.go index c7f16379b2..2b204282a8 100644 --- a/modules/setting/lfs_test.go +++ b/modules/setting/lfs_test.go @@ -100,3 +100,32 @@ STORAGE_TYPE = minio assert.EqualValues(t, "gitea", LFS.Storage.MinioConfig.Bucket) assert.EqualValues(t, "lfs/", LFS.Storage.MinioConfig.BasePath) } + +func Test_LFSClientServerConfigs(t *testing.T) { + iniStr := ` +[server] +LFS_MAX_BATCH_SIZE = 100 +[lfs_client] +# will default to 20 +BATCH_SIZE = 0 +` + cfg, err := NewConfigProviderFromData(iniStr) + assert.NoError(t, err) + + assert.NoError(t, loadLFSFrom(cfg)) + assert.EqualValues(t, 100, LFS.MaxBatchSize) + assert.EqualValues(t, 20, LFSClient.BatchSize) + assert.EqualValues(t, 8, LFSClient.BatchOperationConcurrency) + + iniStr = ` +[lfs_client] +BATCH_SIZE = 50 +BATCH_OPERATION_CONCURRENCY = 10 +` + cfg, err = NewConfigProviderFromData(iniStr) + assert.NoError(t, err) + + assert.NoError(t, loadLFSFrom(cfg)) + assert.EqualValues(t, 50, LFSClient.BatchSize) + assert.EqualValues(t, 10, LFSClient.BatchOperationConcurrency) +} diff --git a/modules/setting/log.go b/modules/setting/log.go index a141188c0c..0747ac4dac 100644 --- a/modules/setting/log.go +++ b/modules/setting/log.go @@ -11,8 +11,8 @@ import ( "path/filepath" "strings" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/util" ) type LogGlobalConfig struct { diff --git a/modules/setting/log_test.go b/modules/setting/log_test.go index 3134d3e75c..eda6dc36af 100644 --- a/modules/setting/log_test.go +++ b/modules/setting/log_test.go @@ -8,8 +8,8 @@ import ( "strings" "testing" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/json" + "forgejo.org/modules/log" "github.com/stretchr/testify/require" ) diff --git a/modules/setting/mailer.go b/modules/setting/mailer.go index 136d932b8d..b7f69c3492 100644 --- a/modules/setting/mailer.go +++ b/modules/setting/mailer.go @@ -11,7 +11,7 @@ import ( "text/template" "time" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" shellquote "github.com/kballard/go-shellquote" ) @@ -263,8 +263,6 @@ func loadMailerFrom(rootCfg ConfigProvider) { MailService.OverrideEnvelopeFrom = true MailService.EnvelopeFrom = parsed.Address } - - log.Info("Mail Service Enabled") } func loadRegisterMailFrom(rootCfg ConfigProvider) { @@ -275,7 +273,6 @@ func loadRegisterMailFrom(rootCfg ConfigProvider) { return } Service.RegisterEmailConfirm = true - log.Info("Register Mail Service Enabled") } func loadNotifyMailFrom(rootCfg ConfigProvider) { @@ -286,7 +283,6 @@ func loadNotifyMailFrom(rootCfg ConfigProvider) { return } Service.EnableNotifyMail = true - log.Info("Notify Mail Service Enabled") } func tryResolveAddr(addr string) []net.IPAddr { diff --git a/modules/setting/markup.go b/modules/setting/markup.go index e893c1c2f1..90fc86b131 100644 --- a/modules/setting/markup.go +++ b/modules/setting/markup.go @@ -7,7 +7,7 @@ import ( "regexp" "strings" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // ExternalMarkupRenderers represents the external markup renderers diff --git a/modules/setting/mirror.go b/modules/setting/mirror.go index 3aa530a1f4..58c57c5c95 100644 --- a/modules/setting/mirror.go +++ b/modules/setting/mirror.go @@ -6,7 +6,7 @@ package setting import ( "time" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // Mirror settings diff --git a/modules/setting/oauth2.go b/modules/setting/oauth2.go index 49288e2639..72500cfc89 100644 --- a/modules/setting/oauth2.go +++ b/modules/setting/oauth2.go @@ -8,8 +8,8 @@ import ( "path/filepath" "sync/atomic" - "code.gitea.io/gitea/modules/generate" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/generate" + "forgejo.org/modules/log" ) // OAuth2UsernameType is enum describing the way gitea 'name' should be generated from oauth2 data diff --git a/modules/setting/oauth2_test.go b/modules/setting/oauth2_test.go index 18252b2447..2fc5da6996 100644 --- a/modules/setting/oauth2_test.go +++ b/modules/setting/oauth2_test.go @@ -7,8 +7,8 @@ import ( "os" "testing" - "code.gitea.io/gitea/modules/generate" - "code.gitea.io/gitea/modules/test" + "forgejo.org/modules/generate" + "forgejo.org/modules/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/setting/other.go b/modules/setting/other.go index 4ba494765b..db60cd2205 100644 --- a/modules/setting/other.go +++ b/modules/setting/other.go @@ -3,7 +3,7 @@ package setting -import "code.gitea.io/gitea/modules/log" +import "forgejo.org/modules/log" type OtherConfig struct { ShowFooterVersion bool diff --git a/modules/setting/packages.go b/modules/setting/packages.go index b3f50617d2..87e41fb5a0 100644 --- a/modules/setting/packages.go +++ b/modules/setting/packages.go @@ -42,6 +42,7 @@ var ( LimitSizePub int64 LimitSizePyPI int64 LimitSizeRpm int64 + LimitSizeAlt int64 LimitSizeRubyGems int64 LimitSizeSwift int64 LimitSizeVagrant int64 @@ -106,6 +107,7 @@ func loadPackagesFrom(rootCfg ConfigProvider) (err error) { Packages.LimitSizeSwift = mustBytes(sec, "LIMIT_SIZE_SWIFT") Packages.LimitSizeVagrant = mustBytes(sec, "LIMIT_SIZE_VAGRANT") Packages.DefaultRPMSignEnabled = sec.Key("DEFAULT_RPM_SIGN_ENABLED").MustBool(false) + Packages.LimitSizeAlt = mustBytes(sec, "LIMIT_SIZE_ALT") return nil } diff --git a/modules/setting/path.go b/modules/setting/path.go index 85d0e06302..33f27db8fd 100644 --- a/modules/setting/path.go +++ b/modules/setting/path.go @@ -10,7 +10,7 @@ import ( "path/filepath" "strings" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) var ( @@ -34,11 +34,7 @@ var ( func getAppPath() (string, error) { var appPath string var err error - if IsWindows && filepath.IsAbs(os.Args[0]) { - appPath = filepath.Clean(os.Args[0]) - } else { - appPath, err = exec.LookPath(os.Args[0]) - } + appPath, err = exec.LookPath(os.Args[0]) if err != nil { if !errors.Is(err, exec.ErrDot) { return "", err diff --git a/modules/setting/proxy.go b/modules/setting/proxy.go index 4ff420d090..7a9de9568b 100644 --- a/modules/setting/proxy.go +++ b/modules/setting/proxy.go @@ -6,7 +6,7 @@ package setting import ( "net/url" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // Proxy settings diff --git a/modules/setting/queue.go b/modules/setting/queue.go index 251a6c1e30..06d007c140 100644 --- a/modules/setting/queue.go +++ b/modules/setting/queue.go @@ -7,8 +7,8 @@ import ( "path/filepath" "runtime" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/json" + "forgejo.org/modules/log" ) // QueueSettings represent the settings for a queue from the ini diff --git a/modules/setting/repository.go b/modules/setting/repository.go index 6086dd1d57..9efd674f8b 100644 --- a/modules/setting/repository.go +++ b/modules/setting/repository.go @@ -9,7 +9,7 @@ import ( "path/filepath" "strings" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // enumerates all the policy repository creating @@ -87,6 +87,7 @@ var ( DefaultMergeMessageAllAuthors bool DefaultMergeMessageMaxApprovers int DefaultMergeMessageOfficialApproversOnly bool + DefaultUpdateStyle string PopulateSquashCommentWithCommitMessages bool AddCoCommitterTrailers bool TestConflictingPatchesWithGitApply bool @@ -216,6 +217,7 @@ var ( DefaultMergeMessageAllAuthors bool DefaultMergeMessageMaxApprovers int DefaultMergeMessageOfficialApproversOnly bool + DefaultUpdateStyle string PopulateSquashCommentWithCommitMessages bool AddCoCommitterTrailers bool TestConflictingPatchesWithGitApply bool @@ -232,6 +234,7 @@ var ( DefaultMergeMessageAllAuthors: false, DefaultMergeMessageMaxApprovers: 10, DefaultMergeMessageOfficialApproversOnly: true, + DefaultUpdateStyle: "merge", PopulateSquashCommentWithCommitMessages: false, AddCoCommitterTrailers: true, RetargetChildrenOnMerge: true, @@ -286,7 +289,7 @@ func loadRepositoryFrom(rootCfg ConfigProvider) { // Determine and create root git repository path. sec := rootCfg.Section("repository") Repository.DisableHTTPGit = sec.Key("DISABLE_HTTP_GIT").MustBool() - Repository.UseCompatSSHURI = sec.Key("USE_COMPAT_SSH_URI").MustBool() + Repository.UseCompatSSHURI = sec.Key("USE_COMPAT_SSH_URI").MustBool(true) Repository.GoGetCloneURLProtocol = sec.Key("GO_GET_CLONE_URL_PROTOCOL").MustString("https") Repository.MaxCreationLimit = sec.Key("MAX_CREATION_LIMIT").MustInt(-1) Repository.DefaultBranch = sec.Key("DEFAULT_BRANCH").MustString(Repository.DefaultBranch) diff --git a/modules/setting/security.go b/modules/setting/security.go index 678a57cb30..f3480d1056 100644 --- a/modules/setting/security.go +++ b/modules/setting/security.go @@ -8,10 +8,10 @@ import ( "os" "strings" - "code.gitea.io/gitea/modules/auth/password/hash" - "code.gitea.io/gitea/modules/generate" - "code.gitea.io/gitea/modules/keying" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/auth/password/hash" + "forgejo.org/modules/generate" + "forgejo.org/modules/keying" + "forgejo.org/modules/log" ) var ( diff --git a/modules/setting/server.go b/modules/setting/server.go index 5cc33f6fc4..bff51f787d 100644 --- a/modules/setting/server.go +++ b/modules/setting/server.go @@ -13,9 +13,9 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/json" + "forgejo.org/modules/log" + "forgejo.org/modules/util" ) // Scheme describes protocol types @@ -265,7 +265,7 @@ func loadServerFrom(rootCfg ConfigProvider) { } UnixSocketPermission = uint32(UnixSocketPermissionParsed) - if !filepath.IsAbs(HTTPAddr) { + if HTTPAddr[0] != '@' && !filepath.IsAbs(HTTPAddr) { HTTPAddr = filepath.Join(AppWorkPath, HTTPAddr) } } diff --git a/modules/setting/server_test.go b/modules/setting/server_test.go index 8db8168854..4450f99546 100644 --- a/modules/setting/server_test.go +++ b/modules/setting/server_test.go @@ -6,9 +6,10 @@ package setting import ( "testing" - "code.gitea.io/gitea/modules/test" + "forgejo.org/modules/test" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestDisplayNameDefault(t *testing.T) { @@ -34,3 +35,54 @@ func TestDisplayNameCustomFormat(t *testing.T) { displayName := generateDisplayName() assert.Equal(t, "Forgejo - Beyond coding. We Forge.", displayName) } + +func TestMaxUserRedirectsDefault(t *testing.T) { + iniStr := `` + cfg, err := NewConfigProviderFromData(iniStr) + require.NoError(t, err) + loadServiceFrom(cfg) + + assert.EqualValues(t, 0, Service.UsernameCooldownPeriod) + assert.EqualValues(t, 0, Service.MaxUserRedirects) + + iniStr = `[service] +MAX_USER_REDIRECTS = 8` + cfg, err = NewConfigProviderFromData(iniStr) + require.NoError(t, err) + loadServiceFrom(cfg) + + assert.EqualValues(t, 0, Service.UsernameCooldownPeriod) + assert.EqualValues(t, 8, Service.MaxUserRedirects) + + iniStr = `[service] +USERNAME_COOLDOWN_PERIOD = 3` + cfg, err = NewConfigProviderFromData(iniStr) + require.NoError(t, err) + loadServiceFrom(cfg) + + assert.EqualValues(t, 3, Service.UsernameCooldownPeriod) + assert.EqualValues(t, 5, Service.MaxUserRedirects) + + iniStr = `[service] +USERNAME_COOLDOWN_PERIOD = 3 +MAX_USER_REDIRECTS = 8` + cfg, err = NewConfigProviderFromData(iniStr) + require.NoError(t, err) + loadServiceFrom(cfg) + + assert.EqualValues(t, 3, Service.UsernameCooldownPeriod) + assert.EqualValues(t, 8, Service.MaxUserRedirects) +} + +func TestUnixSocketAbstractNamespace(t *testing.T) { + iniStr := ` + [server] + PROTOCOL=http+unix + HTTP_ADDR=@forgejo + ` + cfg, err := NewConfigProviderFromData(iniStr) + require.NoError(t, err) + loadServerFrom(cfg) + + assert.EqualValues(t, "@forgejo", HTTPAddr) +} diff --git a/modules/setting/service.go b/modules/setting/service.go index afaee18101..729b10839e 100644 --- a/modules/setting/service.go +++ b/modules/setting/service.go @@ -1,15 +1,18 @@ // Copyright 2019 The Gitea Authors. All rights reserved. +// Copyright 2025 The Forgejo Authors. All rights reserved // SPDX-License-Identifier: MIT package setting import ( + "net/url" "regexp" + "slices" "strings" "time" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/structs" + "forgejo.org/modules/log" + "forgejo.org/modules/structs" "github.com/gobwas/glob" ) @@ -37,10 +40,12 @@ var Service = struct { RegisterManualConfirm bool EmailDomainAllowList []glob.Glob EmailDomainBlockList []glob.Glob + EmailDomainBlockDisposable bool DisableRegistration bool AllowOnlyInternalRegistration bool AllowOnlyExternalRegistration bool ShowRegistrationButton bool + EnableInternalSignIn bool ShowMilestonesDashboardPage bool RequireSignInView bool EnableNotifyMail bool @@ -82,6 +87,8 @@ var Service = struct { DefaultOrgMemberVisible bool UserDeleteWithCommentsMaxTime time.Duration ValidSiteURLSchemes []string + UsernameCooldownPeriod int64 + MaxUserRedirects int64 // OpenID settings EnableOpenIDSignIn bool @@ -91,8 +98,10 @@ var Service = struct { // Explore page settings Explore struct { - RequireSigninView bool `ini:"REQUIRE_SIGNIN_VIEW"` - DisableUsersPage bool `ini:"DISABLE_USERS_PAGE"` + RequireSigninView bool `ini:"REQUIRE_SIGNIN_VIEW"` + DisableUsersPage bool `ini:"DISABLE_USERS_PAGE"` + DisableOrganizationsPage bool `ini:"DISABLE_ORGANIZATIONS_PAGE"` + DisableCodePage bool `ini:"DISABLE_CODE_PAGE"` } `ini:"service.explore"` }{ AllowedUserVisibilityModesSlice: []bool{true, true, true}, @@ -133,6 +142,25 @@ func CompileEmailGlobList(sec ConfigSection, keys ...string) (globs []glob.Glob) return globs } +// LoadServiceSetting loads the service settings +func LoadServiceSetting() { + loadServiceFrom(CfgProvider) +} + +func appURLAsGlob(fqdn string) (glob.Glob, error) { + localFqdn, err := url.ParseRequestURI(fqdn) + if err != nil { + log.Error("Error in EmailDomainAllowList: %v", err) + return nil, err + } + appFqdn, err := glob.Compile(localFqdn.Hostname(), ',') + if err != nil { + log.Error("Error in EmailDomainAllowList: %v", err) + return nil, err + } + return appFqdn, nil +} + func loadServiceFrom(rootCfg ConfigProvider) { sec := rootCfg.Section("service") Service.ActiveCodeLives = sec.Key("ACTIVE_CODE_LIVE_MINUTES").MustInt(180) @@ -152,9 +180,34 @@ func loadServiceFrom(rootCfg ConfigProvider) { if sec.HasKey("EMAIL_DOMAIN_WHITELIST") { deprecatedSetting(rootCfg, "service", "EMAIL_DOMAIN_WHITELIST", "service", "EMAIL_DOMAIN_ALLOWLIST", "1.21") } - Service.EmailDomainAllowList = CompileEmailGlobList(sec, "EMAIL_DOMAIN_WHITELIST", "EMAIL_DOMAIN_ALLOWLIST") + emailDomainAllowList := CompileEmailGlobList(sec, "EMAIL_DOMAIN_WHITELIST", "EMAIL_DOMAIN_ALLOWLIST") + + if len(emailDomainAllowList) > 0 && Federation.Enabled { + appURL, err := appURLAsGlob(AppURL) + if err == nil { + emailDomainAllowList = append(emailDomainAllowList, appURL) + } + } + Service.EmailDomainAllowList = emailDomainAllowList Service.EmailDomainBlockList = CompileEmailGlobList(sec, "EMAIL_DOMAIN_BLOCKLIST") + Service.EmailDomainBlockDisposable = sec.Key("EMAIL_DOMAIN_BLOCK_DISPOSABLE").MustBool(false) + if Service.EmailDomainBlockDisposable { + toAdd := make([]glob.Glob, 0, len(DisposableEmailDomains())) + for _, domain := range DisposableEmailDomains() { + domain = strings.ToLower(domain) + // Only add domains that aren't blocked yet. + if !slices.ContainsFunc(Service.EmailDomainBlockList, func(g glob.Glob) bool { return g.Match(domain) }) { + if g, err := glob.Compile(domain); err != nil { + log.Error("Error in disposable domain %s: %v", domain, err) + } else { + toAdd = append(toAdd, g) + } + } + } + Service.EmailDomainBlockList = append(Service.EmailDomainBlockList, toAdd...) + } Service.ShowRegistrationButton = sec.Key("SHOW_REGISTRATION_BUTTON").MustBool(!(Service.DisableRegistration || Service.AllowOnlyExternalRegistration)) + Service.EnableInternalSignIn = sec.Key("ENABLE_INTERNAL_SIGNIN").MustBool(true) Service.ShowMilestonesDashboardPage = sec.Key("SHOW_MILESTONES_DASHBOARD_PAGE").MustBool(true) Service.RequireSignInView = sec.Key("REQUIRE_SIGNIN_VIEW").MustBool() Service.EnableBasicAuth = sec.Key("ENABLE_BASIC_AUTHENTICATION").MustBool(true) @@ -235,6 +288,14 @@ func loadServiceFrom(rootCfg ConfigProvider) { } } Service.ValidSiteURLSchemes = schemes + Service.UsernameCooldownPeriod = sec.Key("USERNAME_COOLDOWN_PERIOD").MustInt64(0) + + // Only set a default if USERNAME_COOLDOWN_PERIOD's feature is active. + maxUserRedirectsDefault := int64(0) + if Service.UsernameCooldownPeriod > 0 { + maxUserRedirectsDefault = 5 + } + Service.MaxUserRedirects = sec.Key("MAX_USER_REDIRECTS").MustInt64(maxUserRedirectsDefault) mustMapSetting(rootCfg, "service.explore", &Service.Explore) diff --git a/modules/setting/service_test.go b/modules/setting/service_test.go index 7a13e39238..4fc09021b6 100644 --- a/modules/setting/service_test.go +++ b/modules/setting/service_test.go @@ -4,15 +4,28 @@ package setting import ( + "fmt" + "sort" + "strings" "testing" - "code.gitea.io/gitea/modules/structs" + "forgejo.org/modules/structs" "github.com/gobwas/glob" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "golang.org/x/net/publicsuffix" ) +func match(globs []glob.Glob, s string) bool { + for _, g := range globs { + if g.Match(s) { + return true + } + } + return false +} + func TestLoadServices(t *testing.T) { oldService := Service defer func() { @@ -28,15 +41,6 @@ EMAIL_DOMAIN_BLOCKLIST = d3, *.b require.NoError(t, err) loadServiceFrom(cfg) - match := func(globs []glob.Glob, s string) bool { - for _, g := range globs { - if g.Match(s) { - return true - } - } - return false - } - assert.True(t, match(Service.EmailDomainAllowList, "d1")) assert.True(t, match(Service.EmailDomainAllowList, "foo.w")) assert.True(t, match(Service.EmailDomainAllowList, "d2")) @@ -48,6 +52,121 @@ EMAIL_DOMAIN_BLOCKLIST = d3, *.b assert.False(t, match(Service.EmailDomainBlockList, "d1")) } +func TestLoadServiceBlockDisposable(t *testing.T) { + oldService := Service + defer func() { + Service = oldService + }() + + cfg, err := NewConfigProviderFromData(` +[service] +EMAIL_DOMAIN_BLOCK_DISPOSABLE = true +`) + + require.NoError(t, err) + loadServiceFrom(cfg) + + for _, domain := range DisposableEmailDomains() { + require.True(t, match(Service.EmailDomainBlockList, domain)) + } + + require.Len(t, Service.EmailDomainBlockList, len(DisposableEmailDomains())) + + knownGood := [...]string{ + "aol.com", + "gmx.com", + "mail.com", + "zoho.com", + "proton.me", + "gmail.com", + "yahoo.com", + "icloud.com", + "outlook.com", + "protonmail.com", + } + + for _, domain := range knownGood { + require.False(t, match(Service.EmailDomainBlockList, domain)) + } +} + +func TestLoadServiceBlockDisposableWithExistingGlobs(t *testing.T) { + oldService := Service + defer func() { + Service = oldService + }() + + tldCounts := make(map[string]int) + for _, domain := range DisposableEmailDomains() { + tld, _ := publicsuffix.PublicSuffix(domain) + tldCounts[tld]++ + } + + type tldkv struct { + Tld string + Count int + } + + sortedTldCounts := make([]tldkv, 0) + for tld, count := range tldCounts { + sortedTldCounts = append(sortedTldCounts, tldkv{tld, count}) + } + + sort.Slice(sortedTldCounts, func(i, j int) bool { + return sortedTldCounts[i].Count > sortedTldCounts[j].Count + }) + require.GreaterOrEqual(t, len(sortedTldCounts), 2) + + blockString := fmt.Sprintf("*.%s,*.%s", sortedTldCounts[0].Tld, sortedTldCounts[1].Tld) + + cfg, err := NewConfigProviderFromData(fmt.Sprintf(` +[service] +EMAIL_DOMAIN_BLOCKLIST = %s +EMAIL_DOMAIN_BLOCK_DISPOSABLE = true +`, blockString)) + + require.NoError(t, err) + loadServiceFrom(cfg) + + for _, domain := range DisposableEmailDomains() { + require.True(t, match(Service.EmailDomainBlockList, domain)) + } + + redundant := 0 + for _, val := range DisposableEmailDomains() { + if strings.HasSuffix(val, sortedTldCounts[0].Tld) || + strings.HasSuffix(val, sortedTldCounts[1].Tld) { + redundant++ + } + } + + expected := len(DisposableEmailDomains()) - redundant + 2 + require.Len(t, Service.EmailDomainBlockList, expected) +} + +func TestLoadServiceBlockDisposableWithComplementGlobs(t *testing.T) { + oldService := Service + defer func() { + Service = oldService + }() + + cfg, err := NewConfigProviderFromData(` +[service] +EMAIL_DOMAIN_BLOCKLIST = *.random +EMAIL_DOMAIN_BLOCK_DISPOSABLE = true +`) + + require.NoError(t, err) + loadServiceFrom(cfg) + + for _, domain := range DisposableEmailDomains() { + require.True(t, match(Service.EmailDomainBlockList, domain)) + } + + expected := len(DisposableEmailDomains()) + 1 + require.Len(t, Service.EmailDomainBlockList, expected) +} + func TestLoadServiceVisibilityModes(t *testing.T) { oldService := Service defer func() { diff --git a/modules/setting/session.go b/modules/setting/session.go index e9637fdfc5..e9ff9bf0bc 100644 --- a/modules/setting/session.go +++ b/modules/setting/session.go @@ -9,8 +9,8 @@ import ( "path/filepath" "strings" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/json" + "forgejo.org/modules/log" ) // SessionConfig defines Session settings @@ -73,6 +73,4 @@ func loadSessionFrom(rootCfg ConfigProvider) { SessionConfig.ProviderConfig = string(shadowConfig) SessionConfig.OriginalProvider = SessionConfig.Provider SessionConfig.Provider = "VirtualSession" - - log.Info("Session Service Enabled") } diff --git a/modules/setting/setting.go b/modules/setting/setting.go index c9d30836ac..7c40f6057e 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -1,5 +1,6 @@ // Copyright 2014 The Gogs Authors. All rights reserved. // Copyright 2017 The Gitea Authors. All rights reserved. +// Copyright 2025 The Forgejo Authors. All rights reserved // SPDX-License-Identifier: MIT package setting @@ -7,13 +8,12 @@ package setting import ( "fmt" "os" - "runtime" "strings" "time" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/user" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/user" + "forgejo.org/modules/util" ) var ForgejoVersion = "1.0.0" @@ -33,7 +33,6 @@ var ( RunMode string RunUser string IsProd bool - IsWindows bool // IsInTesting indicates whether the testing is running. A lot of unreliable code causes a lot of nonsense error logs during testing // TODO: this is only a temporary solution, we should make the test code more reliable @@ -41,22 +40,18 @@ var ( ) func init() { - IsWindows = runtime.GOOS == "windows" if AppVer == "" { AppVer = "dev" } - // We can rely on log.CanColorStdout being set properly because modules/log/console_windows.go comes before modules/setting/setting.go lexicographically // By default set this logger at Info - we'll change it later, but we need to start with something. log.SetConsoleLogger(log.DEFAULT, "console", log.INFO) } // IsRunUserMatchCurrentUser returns false if configured run user does not match // actual user that runs the app. The first return value is the actual user name. -// This check is ignored under Windows since SSH remote login is not the main -// method to login on Windows. func IsRunUserMatchCurrentUser(runUser string) (string, bool) { - if IsWindows || SSH.StartBuiltinServer { + if SSH.StartBuiltinServer { return "", true } @@ -153,6 +148,7 @@ func loadCommonSettingsFrom(cfg ConfigProvider) error { loadCamoFrom(cfg) loadI18nFrom(cfg) loadGitFrom(cfg) + loadAnnexFrom(cfg) loadMirrorFrom(cfg) loadMarkupFrom(cfg) loadQuotaFrom(cfg) @@ -210,6 +206,7 @@ func LoadSettings() { initAllLoggers() loadDBSetting(CfgProvider) + loadFederationFrom(CfgProvider) loadServiceFrom(CfgProvider) loadOAuth2ClientFrom(CfgProvider) loadCacheFrom(CfgProvider) @@ -224,7 +221,6 @@ func LoadSettings() { LoadQueueSettings() loadProjectFrom(CfgProvider) loadMimeTypeMapFrom(CfgProvider) - loadFederationFrom(CfgProvider) loadF3From(CfgProvider) } diff --git a/modules/setting/setting_test.go b/modules/setting/setting_test.go index f77ee65974..1fef9e068a 100644 --- a/modules/setting/setting_test.go +++ b/modules/setting/setting_test.go @@ -1,4 +1,5 @@ // Copyright 2020 The Gitea Authors. All rights reserved. +// Copyright 2025 The Forgejo Authors. All rights reserved // SPDX-License-Identifier: MIT package setting @@ -6,9 +7,10 @@ package setting import ( "testing" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestMakeAbsoluteAssetURL(t *testing.T) { @@ -30,3 +32,84 @@ func TestMakeManifestData(t *testing.T) { jsonBytes := MakeManifestData(`Example App '\"`, "https://example.com", "https://example.com/foo/bar") assert.True(t, json.Valid(jsonBytes)) } + +func TestLoadServiceDomainListsForFederation(t *testing.T) { + oldAppURL := AppURL + oldFederation := Federation + oldService := Service + + defer func() { + AppURL = oldAppURL + Federation = oldFederation + Service = oldService + }() + + cfg, err := NewConfigProviderFromData(` +[federation] +ENABLED = true +[service] +EMAIL_DOMAIN_ALLOWLIST = *.allow.random +EMAIL_DOMAIN_BLOCKLIST = *.block.random +`) + + require.NoError(t, err) + loadServerFrom(cfg) + loadFederationFrom(cfg) + loadServiceFrom(cfg) + + assert.True(t, match(Service.EmailDomainAllowList, "d1.allow.random")) + assert.True(t, match(Service.EmailDomainAllowList, "localhost")) +} + +func TestLoadServiceDomainListsNoFederation(t *testing.T) { + oldAppURL := AppURL + oldFederation := Federation + oldService := Service + + defer func() { + AppURL = oldAppURL + Federation = oldFederation + Service = oldService + }() + + cfg, err := NewConfigProviderFromData(` +[federation] +ENABLED = false +[service] +EMAIL_DOMAIN_ALLOWLIST = *.allow.random +EMAIL_DOMAIN_BLOCKLIST = *.block.random +`) + + require.NoError(t, err) + loadServerFrom(cfg) + loadFederationFrom(cfg) + loadServiceFrom(cfg) + + assert.True(t, match(Service.EmailDomainAllowList, "d1.allow.random")) +} + +func TestLoadServiceDomainListsFederationEmptyAllowList(t *testing.T) { + oldAppURL := AppURL + oldFederation := Federation + oldService := Service + + defer func() { + AppURL = oldAppURL + Federation = oldFederation + Service = oldService + }() + + cfg, err := NewConfigProviderFromData(` +[federation] +ENABLED = true +[service] +EMAIL_DOMAIN_BLOCKLIST = *.block.random +`) + + require.NoError(t, err) + loadServerFrom(cfg) + loadFederationFrom(cfg) + loadServiceFrom(cfg) + + assert.Empty(t, Service.EmailDomainAllowList) +} diff --git a/modules/setting/ssh.go b/modules/setting/ssh.go index ea387e521f..86193bddb9 100644 --- a/modules/setting/ssh.go +++ b/modules/setting/ssh.go @@ -11,8 +11,8 @@ import ( "text/template" "time" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/util" gossh "golang.org/x/crypto/ssh" ) diff --git a/modules/setting/storage_test.go b/modules/setting/storage_test.go index 271607914c..59135b5911 100644 --- a/modules/setting/storage_test.go +++ b/modules/setting/storage_test.go @@ -445,7 +445,7 @@ MINIO_BASE_PATH = /lfs require.NoError(t, loadLFSFrom(cfg)) assert.EqualValues(t, "my_access_key", LFS.Storage.MinioConfig.AccessKeyID) assert.EqualValues(t, "my_secret_key", LFS.Storage.MinioConfig.SecretAccessKey) - assert.True(t, true, LFS.Storage.MinioConfig.UseSSL) + assert.True(t, LFS.Storage.MinioConfig.UseSSL) assert.EqualValues(t, "/lfs", LFS.Storage.MinioConfig.BasePath) cfg, err = NewConfigProviderFromData(` diff --git a/modules/setting/time.go b/modules/setting/time.go index 39acba12ef..1211fd475a 100644 --- a/modules/setting/time.go +++ b/modules/setting/time.go @@ -6,7 +6,7 @@ package setting import ( "time" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // DefaultUILocation is the location on the UI, so that we can display the time on UI. @@ -20,7 +20,6 @@ func loadTimeFrom(rootCfg ConfigProvider) { if err != nil { log.Fatal("Load time zone failed: %v", err) } - log.Info("Default UI Location is %v", zone) } if DefaultUILocation == nil { DefaultUILocation = time.Local diff --git a/modules/setting/ui.go b/modules/setting/ui.go index 056d670ba6..2e6a3df4c6 100644 --- a/modules/setting/ui.go +++ b/modules/setting/ui.go @@ -6,8 +6,8 @@ package setting import ( "time" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/container" + "forgejo.org/modules/log" ) // UI settings @@ -88,6 +88,7 @@ var UI = struct { Reactions: []string{`+1`, `-1`, `laugh`, `hooray`, `confused`, `heart`, `rocket`, `eyes`}, CustomEmojis: []string{`git`, `gitea`, `codeberg`, `gitlab`, `github`, `gogs`, `forgejo`}, CustomEmojisMap: map[string]string{"git": ":git:", "gitea": ":gitea:", "codeberg": ":codeberg:", "gitlab": ":gitlab:", "github": ":github:", "gogs": ":gogs:", "forgejo": ":forgejo:"}, + ExploreDefaultSort: "recentupdate", PreferredTimestampTense: "mixed", AmbiguousUnicodeDetection: true, diff --git a/modules/setting/webhook.go b/modules/setting/webhook.go index 7b1ab4db1f..071b729aa1 100644 --- a/modules/setting/webhook.go +++ b/modules/setting/webhook.go @@ -6,26 +6,28 @@ package setting import ( "net/url" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) // Webhook settings var Webhook = struct { - QueueLength int - DeliverTimeout int - SkipTLSVerify bool - AllowedHostList string - PagingNum int - ProxyURL string - ProxyURLFixed *url.URL - ProxyHosts []string + QueueLength int + DeliverTimeout int + SkipTLSVerify bool + AllowedHostList string + PagingNum int + ProxyURL string + ProxyURLFixed *url.URL + ProxyHosts []string + PayloadCommitLimit int }{ - QueueLength: 1000, - DeliverTimeout: 5, - SkipTLSVerify: false, - PagingNum: 10, - ProxyURL: "", - ProxyHosts: []string{}, + QueueLength: 1000, + DeliverTimeout: 5, + SkipTLSVerify: false, + PagingNum: 10, + ProxyURL: "", + ProxyHosts: []string{}, + PayloadCommitLimit: 15, } func loadWebhookFrom(rootCfg ConfigProvider) { @@ -45,4 +47,5 @@ func loadWebhookFrom(rootCfg ConfigProvider) { } } Webhook.ProxyHosts = sec.Key("PROXY_HOSTS").Strings(",") + Webhook.PayloadCommitLimit = sec.Key("PAYLOAD_COMMIT_LIMIT").MustInt(15) } diff --git a/modules/ssh/init.go b/modules/ssh/init.go index 21d4f89936..1ccd95b18b 100644 --- a/modules/ssh/init.go +++ b/modules/ssh/init.go @@ -11,8 +11,8 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" ) func Init() error { diff --git a/modules/ssh/ssh.go b/modules/ssh/ssh.go index f8e4f569b8..19cac0b603 100644 --- a/modules/ssh/ssh.go +++ b/modules/ssh/ssh.go @@ -11,7 +11,6 @@ import ( "crypto/x509" "encoding/pem" "errors" - "fmt" "io" "net" "os" @@ -22,21 +21,17 @@ import ( "sync" "syscall" - asymkey_model "code.gitea.io/gitea/models/asymkey" - "code.gitea.io/gitea/modules/graceful" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/process" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + asymkey_model "forgejo.org/models/asymkey" + "forgejo.org/modules/graceful" + "forgejo.org/modules/log" + "forgejo.org/modules/process" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" "github.com/gliderlabs/ssh" gossh "golang.org/x/crypto/ssh" ) -type contextKey string - -const giteaKeyID = contextKey("gitea-key-id") - func getExitStatusFromError(err error) int { if err == nil { return 0 @@ -62,7 +57,7 @@ func getExitStatusFromError(err error) int { } func sessionHandler(session ssh.Session) { - keyID := fmt.Sprintf("%d", session.Context().Value(giteaKeyID).(int64)) + keyID := session.ConnPermissions().Extensions["forgejo-key-id"] command := session.RawCommand() @@ -238,7 +233,10 @@ func publicKeyHandler(ctx ssh.Context, key ssh.PublicKey) bool { if log.IsDebug() { // <- FingerprintSHA256 is kinda expensive so only calculate it if necessary log.Debug("Successfully authenticated: %s Certificate Fingerprint: %s Principal: %s", ctx.RemoteAddr(), gossh.FingerprintSHA256(key), principal) } - ctx.SetValue(giteaKeyID, pkey.ID) + if ctx.Permissions().Extensions == nil { + ctx.Permissions().Extensions = map[string]string{} + } + ctx.Permissions().Extensions["forgejo-key-id"] = strconv.FormatInt(pkey.ID, 10) return true } @@ -266,7 +264,10 @@ func publicKeyHandler(ctx ssh.Context, key ssh.PublicKey) bool { if log.IsDebug() { // <- FingerprintSHA256 is kinda expensive so only calculate it if necessary log.Debug("Successfully authenticated: %s Public Key Fingerprint: %s", ctx.RemoteAddr(), gossh.FingerprintSHA256(key)) } - ctx.SetValue(giteaKeyID, pkey.ID) + if ctx.Permissions().Extensions == nil { + ctx.Permissions().Extensions = map[string]string{} + } + ctx.Permissions().Extensions["forgejo-key-id"] = strconv.FormatInt(pkey.ID, 10) return true } diff --git a/modules/ssh/ssh_graceful.go b/modules/ssh/ssh_graceful.go index cad2c685bd..825313ab1c 100644 --- a/modules/ssh/ssh_graceful.go +++ b/modules/ssh/ssh_graceful.go @@ -4,9 +4,9 @@ package ssh import ( - "code.gitea.io/gitea/modules/graceful" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/graceful" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" "github.com/gliderlabs/ssh" ) diff --git a/modules/storage/helper.go b/modules/storage/helper.go index 95f1c7b9a8..8bec3a0042 100644 --- a/modules/storage/helper.go +++ b/modules/storage/helper.go @@ -30,7 +30,7 @@ func (s DiscardStorage) Delete(_ string) error { return fmt.Errorf("%s", s) } -func (s DiscardStorage) URL(_, _ string) (*url.URL, error) { +func (s DiscardStorage) URL(_, _ string, _ url.Values) (*url.URL, error) { return nil, fmt.Errorf("%s", s) } diff --git a/modules/storage/helper_test.go b/modules/storage/helper_test.go index 60a7c61289..dd30c9b8ac 100644 --- a/modules/storage/helper_test.go +++ b/modules/storage/helper_test.go @@ -38,7 +38,7 @@ func Test_discardStorage(t *testing.T) { require.Error(t, err, string(tt)) } { - got, err := tt.URL("path", "name") + got, err := tt.URL("path", "name", nil) assert.Nil(t, got) require.Errorf(t, err, string(tt)) } diff --git a/modules/storage/local.go b/modules/storage/local.go index 9bb532f1df..6f851983b1 100644 --- a/modules/storage/local.go +++ b/modules/storage/local.go @@ -11,9 +11,9 @@ import ( "os" "path/filepath" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" ) var _ ObjectStorage = &LocalStorage{} @@ -114,7 +114,7 @@ func (l *LocalStorage) Delete(path string) error { } // URL gets the redirect URL to a file -func (l *LocalStorage) URL(path, name string) (*url.URL, error) { +func (l *LocalStorage) URL(path, name string, reqParams url.Values) (*url.URL, error) { return nil, ErrURLNotSupported } diff --git a/modules/storage/local_test.go b/modules/storage/local_test.go index e230323f67..d0dd3a6462 100644 --- a/modules/storage/local_test.go +++ b/modules/storage/local_test.go @@ -8,7 +8,7 @@ import ( "path/filepath" "testing" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" ) diff --git a/modules/storage/minio.go b/modules/storage/minio.go index d0c2dec65b..ee545edc10 100644 --- a/modules/storage/minio.go +++ b/modules/storage/minio.go @@ -15,9 +15,9 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" @@ -276,8 +276,12 @@ func (m *MinioStorage) Delete(path string) error { } // URL gets the redirect URL to a file. The presigned link is valid for 5 minutes. -func (m *MinioStorage) URL(path, name string) (*url.URL, error) { - reqParams := make(url.Values) +func (m *MinioStorage) URL(path, name string, serveDirectReqParams url.Values) (*url.URL, error) { + // copy serveDirectReqParams + reqParams, err := url.ParseQuery(serveDirectReqParams.Encode()) + if err != nil { + return nil, err + } // TODO it may be good to embed images with 'inline' like ServeData does, but we don't want to have to read the file, do we? reqParams.Set("response-content-disposition", "attachment; filename=\""+quoteEscaper.Replace(name)+"\"") u, err := m.client.PresignedGetObject(m.ctx, m.bucket, m.buildMinioPath(path), 5*time.Minute, reqParams) diff --git a/modules/storage/minio_test.go b/modules/storage/minio_test.go index 9ce1dbc7b4..99f70c4565 100644 --- a/modules/storage/minio_test.go +++ b/modules/storage/minio_test.go @@ -10,7 +10,7 @@ import ( "os" "testing" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "github.com/minio/minio-go/v7" "github.com/stretchr/testify/assert" diff --git a/modules/storage/storage.go b/modules/storage/storage.go index b83b1c7929..db081e0768 100644 --- a/modules/storage/storage.go +++ b/modules/storage/storage.go @@ -11,32 +11,13 @@ import ( "net/url" "os" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" ) // ErrURLNotSupported represents url is not supported var ErrURLNotSupported = errors.New("url method not supported") -// ErrInvalidConfiguration is called when there is invalid configuration for a storage -type ErrInvalidConfiguration struct { - cfg any - err error -} - -func (err ErrInvalidConfiguration) Error() string { - if err.err != nil { - return fmt.Sprintf("Invalid Configuration Argument: %v: Error: %v", err.cfg, err.err) - } - return fmt.Sprintf("Invalid Configuration Argument: %v", err.cfg) -} - -// IsErrInvalidConfiguration checks if an error is an ErrInvalidConfiguration -func IsErrInvalidConfiguration(err error) bool { - _, ok := err.(ErrInvalidConfiguration) - return ok -} - type Type = setting.StorageType // NewStorageFunc is a function that creates a storage @@ -63,7 +44,7 @@ type ObjectStorage interface { Save(path string, r io.Reader, size int64) (int64, error) Stat(path string) (os.FileInfo, error) Delete(path string) error - URL(path, name string) (*url.URL, error) + URL(path, name string, reqParams url.Values) (*url.URL, error) IterateObjects(path string, iterator func(path string, obj Object) error) error } @@ -131,7 +112,7 @@ var ( ActionsArtifacts ObjectStorage = UninitializedStorage ) -// Init init the stoarge +// Init init the storage func Init() error { for _, f := range []func() error{ initAttachments, diff --git a/modules/storage/storage_test.go b/modules/storage/storage_test.go index 70bcd3155a..af3dd9520e 100644 --- a/modules/storage/storage_test.go +++ b/modules/storage/storage_test.go @@ -7,7 +7,7 @@ import ( "bytes" "testing" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/structs/action.go b/modules/structs/action.go new file mode 100644 index 0000000000..df9f845adc --- /dev/null +++ b/modules/structs/action.go @@ -0,0 +1,25 @@ +// Copyright 2024 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package structs + +// ActionRunJob represents a job of a run +// swagger:model +type ActionRunJob struct { + // the action run job id + ID int64 `json:"id"` + // the repository id + RepoID int64 `json:"repo_id"` + // the owner id + OwnerID int64 `json:"owner_id"` + // the action run job name + Name string `json:"name"` + // the action run job needed ids + Needs []string `json:"needs"` + // the action run job labels to run on + RunsOn []string `json:"runs_on"` + // the action run job latest task id + TaskID int64 `json:"task_id"` + // the action run job status + Status string `json:"status"` +} diff --git a/modules/structs/admin_user.go b/modules/structs/admin_user.go index 5b7df127b4..8a4d066d72 100644 --- a/modules/structs/admin_user.go +++ b/modules/structs/admin_user.go @@ -15,7 +15,7 @@ type CreateUserOption struct { FullName string `json:"full_name" binding:"MaxSize(100)"` // required: true // swagger:strfmt email - Email string `json:"email" binding:"Required;Email;MaxSize(254)"` + Email string `json:"email" binding:"Required;EmailForAdmin;MaxSize(254)"` Password string `json:"password" binding:"MaxSize(255)"` MustChangePassword *bool `json:"must_change_password"` SendNotify bool `json:"send_notify"` diff --git a/modules/structs/attachment.go b/modules/structs/attachment.go index c97cdcb83c..0a3d4140c2 100644 --- a/modules/structs/attachment.go +++ b/modules/structs/attachment.go @@ -1,7 +1,7 @@ // Copyright 2017 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package structs // import "code.gitea.io/gitea/modules/structs" +package structs // import "forgejo.org/modules/structs" import ( "time" diff --git a/modules/structs/hook.go b/modules/structs/hook.go index b7f8861b76..28c2e00588 100644 --- a/modules/structs/hook.go +++ b/modules/structs/hook.go @@ -9,7 +9,7 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" ) // ErrInvalidReceiveHook FIXME @@ -53,7 +53,8 @@ type CreateHookOption struct { BranchFilter string `json:"branch_filter" binding:"GlobPattern"` AuthorizationHeader string `json:"authorization_header"` // default: false - Active bool `json:"active"` + Active bool `json:"active"` + IsSystemWebhook bool `json:"is_system_webhook"` } // EditHookOption options when modify one hook @@ -141,26 +142,6 @@ func (p *CreatePayload) JSONPayload() ([]byte, error) { return json.MarshalIndent(p, "", " ") } -// ParseCreateHook parses create event hook content. -func ParseCreateHook(raw []byte) (*CreatePayload, error) { - hook := new(CreatePayload) - if err := json.Unmarshal(raw, hook); err != nil { - return nil, err - } - - // it is possible the JSON was parsed, however, - // was not from Gogs (maybe was from Bitbucket) - // So we'll check to be sure certain key fields - // were populated - switch { - case hook.Repo == nil: - return nil, ErrInvalidReceiveHook - case len(hook.Ref) == 0: - return nil, ErrInvalidReceiveHook - } - return hook, nil -} - // ________ .__ __ // \______ \ ____ | | _____/ |_ ____ // | | \_/ __ \| | _/ __ \ __\/ __ \ @@ -221,13 +202,14 @@ const ( // IssueCommentPayload represents a payload information of issue comment event. type IssueCommentPayload struct { - Action HookIssueCommentAction `json:"action"` - Issue *Issue `json:"issue"` - Comment *Comment `json:"comment"` - Changes *ChangesPayload `json:"changes,omitempty"` - Repository *Repository `json:"repository"` - Sender *User `json:"sender"` - IsPull bool `json:"is_pull"` + Action HookIssueCommentAction `json:"action"` + Issue *Issue `json:"issue"` + PullRequest *PullRequest `json:"pull_request,omitempty"` + Comment *Comment `json:"comment"` + Changes *ChangesPayload `json:"changes,omitempty"` + Repository *Repository `json:"repository"` + Sender *User `json:"sender"` + IsPull bool `json:"is_pull"` } // JSONPayload implements Payload @@ -291,22 +273,6 @@ func (p *PushPayload) JSONPayload() ([]byte, error) { return json.MarshalIndent(p, "", " ") } -// ParsePushHook parses push event hook content. -func ParsePushHook(raw []byte) (*PushPayload, error) { - hook := new(PushPayload) - if err := json.Unmarshal(raw, hook); err != nil { - return nil, err - } - - switch { - case hook.Repo == nil: - return nil, ErrInvalidReceiveHook - case len(hook.Ref) == 0: - return nil, ErrInvalidReceiveHook - } - return hook, nil -} - // Branch returns branch name from a payload func (p *PushPayload) Branch() string { return strings.ReplaceAll(p.Ref, "refs/heads/", "") @@ -362,6 +328,7 @@ type IssuePayload struct { Repository *Repository `json:"repository"` Sender *User `json:"sender"` CommitID string `json:"commit_id"` + Label *Label `json:"label,omitempty"` } // JSONPayload encodes the IssuePayload to JSON, with an indentation of two spaces. @@ -399,6 +366,7 @@ type PullRequestPayload struct { Sender *User `json:"sender"` CommitID string `json:"commit_id"` Review *ReviewPayload `json:"review"` + Label *Label `json:"label,omitempty"` } // JSONPayload FIXME diff --git a/modules/structs/miscellaneous.go b/modules/structs/miscellaneous.go index bff10f95b7..7866cb5fc0 100644 --- a/modules/structs/miscellaneous.go +++ b/modules/structs/miscellaneous.go @@ -37,6 +37,10 @@ type MarkupOption struct { // // in: body FilePath string + // The current branch path where the form gets posted + // + // in: body + BranchPath string } // MarkupRender is a rendered markup document diff --git a/modules/structs/org.go b/modules/structs/org.go index b2b2c61a01..451153b620 100644 --- a/modules/structs/org.go +++ b/modules/structs/org.go @@ -47,13 +47,22 @@ type CreateOrgOption struct { // EditOrgOption options for editing an organization type EditOrgOption struct { - FullName string `json:"full_name" binding:"MaxSize(100)"` - Email string `json:"email" binding:"MaxSize(255)"` - Description string `json:"description" binding:"MaxSize(255)"` - Website string `json:"website" binding:"ValidUrl;MaxSize(255)"` - Location string `json:"location" binding:"MaxSize(50)"` + FullName string `json:"full_name" binding:"MaxSize(100)"` + Email *string `json:"email" binding:"MaxSize(255)"` + Description string `json:"description" binding:"MaxSize(255)"` + Website string `json:"website" binding:"ValidUrl;MaxSize(255)"` + Location string `json:"location" binding:"MaxSize(50)"` // possible values are `public`, `limited` or `private` // enum: ["public", "limited", "private"] Visibility string `json:"visibility" binding:"In(,public,limited,private)"` RepoAdminChangeTeamAccess *bool `json:"repo_admin_change_team_access"` } + +// RenameOrgOption options when renaming an organization +type RenameOrgOption struct { + // New username for this org. This name cannot be in use yet by any other user. + // + // required: true + // unique: true + NewName string `json:"new_name" binding:"Required"` +} diff --git a/modules/structs/pull.go b/modules/structs/pull.go index ab627666c9..1ce7550e19 100644 --- a/modules/structs/pull.go +++ b/modules/structs/pull.go @@ -57,7 +57,8 @@ type PullRequest struct { // swagger:strfmt date-time Closed *time.Time `json:"closed_at"` - PinOrder int `json:"pin_order"` + PinOrder int `json:"pin_order"` + Flow int64 `json:"flow"` } // PRBranchInfo information about a branch diff --git a/modules/structs/pull_review.go b/modules/structs/pull_review.go index c77ebea07d..f89c1f2a63 100644 --- a/modules/structs/pull_review.go +++ b/modules/structs/pull_review.go @@ -89,7 +89,6 @@ type CreatePullReviewComment struct { NewLineNum int64 `json:"new_position"` } -// CreatePullReviewCommentOptions are options to create a pull review comment type CreatePullReviewCommentOptions CreatePullReviewComment // SubmitPullReviewOptions are options to submit a pending pull review diff --git a/modules/structs/repo.go b/modules/structs/repo.go index f2fe9c7ac3..c9cd729cf3 100644 --- a/modules/structs/repo.go +++ b/modules/structs/repo.go @@ -105,6 +105,7 @@ type Repository struct { DefaultDeleteBranchAfterMerge bool `json:"default_delete_branch_after_merge"` DefaultMergeStyle string `json:"default_merge_style"` DefaultAllowMaintainerEdit bool `json:"default_allow_maintainer_edit"` + DefaultUpdateStyle string `json:"default_update_style"` AvatarURL string `json:"avatar_url"` Internal bool `json:"internal"` MirrorInterval string `json:"mirror_interval"` @@ -223,8 +224,10 @@ type EditRepoOption struct { AllowRebaseUpdate *bool `json:"allow_rebase_update,omitempty"` // set to `true` to delete pr branch after merge by default DefaultDeleteBranchAfterMerge *bool `json:"default_delete_branch_after_merge,omitempty"` - // set to a merge style to be used by this repository: "merge", "rebase", "rebase-merge", "squash", or "fast-forward-only". - DefaultMergeStyle *string `json:"default_merge_style,omitempty"` + // set to a merge style to be used by this repository: "merge", "rebase", "rebase-merge", "squash", "fast-forward-only", "manually-merged", or "rebase-update-only". + DefaultMergeStyle *string `json:"default_merge_style,omitempty" binding:"In(merge,rebase,rebase-merge,squash,fast-forward-only,manually-merged,rebase-update-only)"` + // set to a update style to be used by this repository: "rebase" or "merge" + DefaultUpdateStyle *string `json:"default_update_style,omitempty" binding:"In(merge,rebase)"` // set to `true` to allow edits from maintainers by default DefaultAllowMaintainerEdit *bool `json:"default_allow_maintainer_edit,omitempty"` // set to `true` to archive this repository. @@ -290,6 +293,16 @@ type CreateBranchRepoOption struct { OldRefName string `json:"old_ref_name" binding:"GitRefName;MaxSize(100)"` } +// UpdateBranchRepoOption options when updating a branch in a repository +// swagger:model +type UpdateBranchRepoOption struct { + // New branch name + // + // required: true + // unique: true + Name string `json:"name" binding:"Required;GitRefName;MaxSize(100)"` +} + // TransferRepoOption options when transfer a repository's ownership // swagger:model type TransferRepoOption struct { diff --git a/modules/structs/repo_compare.go b/modules/structs/repo_compare.go index 8a12498705..6e77a813d3 100644 --- a/modules/structs/repo_compare.go +++ b/modules/structs/repo_compare.go @@ -5,6 +5,7 @@ package structs // Compare represents a comparison between two commits. type Compare struct { - TotalCommits int `json:"total_commits"` // Total number of commits in the comparison. - Commits []*Commit `json:"commits"` // List of commits in the comparison. + TotalCommits int `json:"total_commits"` // Total number of commits in the comparison. + Commits []*Commit `json:"commits"` // List of commits in the comparison. + Files []*CommitAffectedFiles `json:"files"` // Total files modified in this comparison. } diff --git a/modules/structs/repo_note.go b/modules/structs/repo_note.go index 4eaf5a255d..76c6c17898 100644 --- a/modules/structs/repo_note.go +++ b/modules/structs/repo_note.go @@ -8,3 +8,7 @@ type Note struct { Message string `json:"message"` Commit *Commit `json:"commit"` } + +type NoteOptions struct { + Message string `json:"message"` +} diff --git a/modules/structs/user.go b/modules/structs/user.go index f2747b1473..49e4c495cf 100644 --- a/modules/structs/user.go +++ b/modules/structs/user.go @@ -6,7 +6,7 @@ package structs import ( "time" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" ) // User represents a user @@ -27,7 +27,7 @@ type User struct { Email string `json:"email"` // URL to the user's avatar AvatarURL string `json:"avatar_url"` - // URL to the user's gitea page + // URL to the user's profile page HTMLURL string `json:"html_url"` // User locale Language string `json:"language"` @@ -84,6 +84,7 @@ type UserSettings struct { EnableRepoUnitHints bool `json:"enable_repo_unit_hints"` // Privacy HideEmail bool `json:"hide_email"` + HidePronouns bool `json:"hide_pronouns"` HideActivity bool `json:"hide_activity"` } @@ -101,6 +102,7 @@ type UserSettingsOptions struct { EnableRepoUnitHints *bool `json:"enable_repo_unit_hints"` // Privacy HideEmail *bool `json:"hide_email"` + HidePronouns *bool `json:"hide_pronouns"` HideActivity *bool `json:"hide_activity"` } diff --git a/modules/structs/user_email.go b/modules/structs/user_email.go index 9319667e8f..485d0de1af 100644 --- a/modules/structs/user_email.go +++ b/modules/structs/user_email.go @@ -7,7 +7,7 @@ package structs // Email an email address belonging to a user type Email struct { // swagger:strfmt email - Email string `json:"email"` + Email string `json:"email" binding:"EmailWithAllowedDomain"` Verified bool `json:"verified"` Primary bool `json:"primary"` UserID int64 `json:"user_id"` diff --git a/modules/structs/workflow.go b/modules/structs/workflow.go index c4429ea0a2..704ed0e65b 100644 --- a/modules/structs/workflow.go +++ b/modules/structs/workflow.go @@ -12,4 +12,18 @@ type DispatchWorkflowOption struct { Ref string `json:"ref"` // Input keys and values configured in the workflow file. Inputs map[string]string `json:"inputs"` + // Flag to return the run info + // default: false + ReturnRunInfo bool `json:"return_run_info"` +} + +// DispatchWorkflowRun represents a workflow run +// swagger:model +type DispatchWorkflowRun struct { + // the workflow run id + ID int64 `json:"id"` + // a unique number for each run of a repository + RunNumber int64 `json:"run_number"` + // the jobs name + Jobs []string `json:"jobs"` } diff --git a/modules/svg/svg.go b/modules/svg/svg.go index 016e1dc08b..e00d8de2d1 100644 --- a/modules/svg/svg.go +++ b/modules/svg/svg.go @@ -9,9 +9,9 @@ import ( "path" "strings" - gitea_html "code.gitea.io/gitea/modules/html" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/public" + gitea_html "forgejo.org/modules/html" + "forgejo.org/modules/log" + "forgejo.org/modules/public" ) var svgIcons map[string]string diff --git a/modules/sync/status_pool.go b/modules/sync/status_pool.go index 6f075d54b7..f22e3e155b 100644 --- a/modules/sync/status_pool.go +++ b/modules/sync/status_pool.go @@ -6,7 +6,7 @@ package sync import ( "sync" - "code.gitea.io/gitea/modules/container" + "forgejo.org/modules/container" ) // StatusTable is a table maintains true/false values. diff --git a/modules/system/appstate_test.go b/modules/system/appstate_test.go index 2f44c7b845..8a444aff0f 100644 --- a/modules/system/appstate_test.go +++ b/modules/system/appstate_test.go @@ -6,8 +6,8 @@ package system import ( "testing" - "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/unittest" + "forgejo.org/models/db" + "forgejo.org/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/system/db.go b/modules/system/db.go index 17178283d9..384087ab4f 100644 --- a/modules/system/db.go +++ b/modules/system/db.go @@ -6,9 +6,9 @@ package system import ( "context" - "code.gitea.io/gitea/models/system" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/util" + "forgejo.org/models/system" + "forgejo.org/modules/json" + "forgejo.org/modules/util" ) // DBStore can be used to store app state items in local filesystem diff --git a/modules/templates/base.go b/modules/templates/base.go index 2c2f35bbed..76d8e3271e 100644 --- a/modules/templates/base.go +++ b/modules/templates/base.go @@ -7,8 +7,8 @@ import ( "slices" "strings" - "code.gitea.io/gitea/modules/assetfs" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/assetfs" + "forgejo.org/modules/setting" ) func AssetFS() *assetfs.LayeredFS { diff --git a/modules/templates/dynamic.go b/modules/templates/dynamic.go index e1babd83c9..c5752c8c72 100644 --- a/modules/templates/dynamic.go +++ b/modules/templates/dynamic.go @@ -6,8 +6,8 @@ package templates import ( - "code.gitea.io/gitea/modules/assetfs" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/assetfs" + "forgejo.org/modules/setting" ) func BuiltinAssets() *assetfs.Layer { diff --git a/modules/templates/eval/eval.go b/modules/templates/eval/eval.go index 5d4ac915b9..487a1de4b0 100644 --- a/modules/templates/eval/eval.go +++ b/modules/templates/eval/eval.go @@ -8,7 +8,7 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/util" ) type Num struct { diff --git a/modules/templates/helper.go b/modules/templates/helper.go index aeae8204ad..02b175e6f6 100644 --- a/modules/templates/helper.go +++ b/modules/templates/helper.go @@ -14,15 +14,14 @@ import ( "strings" "time" - user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/base" - "code.gitea.io/gitea/modules/markup" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/svg" - "code.gitea.io/gitea/modules/templates/eval" - "code.gitea.io/gitea/modules/timeutil" - "code.gitea.io/gitea/modules/util" - "code.gitea.io/gitea/services/gitdiff" + user_model "forgejo.org/models/user" + "forgejo.org/modules/base" + "forgejo.org/modules/markup" + "forgejo.org/modules/setting" + "forgejo.org/modules/svg" + "forgejo.org/modules/templates/eval" + "forgejo.org/modules/util" + "forgejo.org/services/gitdiff" ) // NewFuncMap returns functions for injecting to templates @@ -52,6 +51,7 @@ func NewFuncMap() template.FuncMap { "StringUtils": NewStringUtils, "SliceUtils": NewSliceUtils, "JsonUtils": NewJsonUtils, + "DateUtils": NewDateUtils, // ----------------------------------------------------------------- // svg / avatar / icon / color @@ -64,16 +64,18 @@ func NewFuncMap() template.FuncMap { // ----------------------------------------------------------------- // time / number / format - "FileSize": FileSizePanic, - "CountFmt": base.FormatNumberSI, - "TimeSince": timeutil.TimeSince, - "TimeSinceUnix": timeutil.TimeSinceUnix, - "DateTime": timeutil.DateTime, - "Sec2Time": util.SecToTime, + "FileSize": FileSizePanic, + "CountFmt": base.FormatNumberSI, + "Sec2Time": util.SecToTime, "LoadTimes": func(startTime time.Time) string { return fmt.Sprint(time.Since(startTime).Nanoseconds()/1e6) + "ms" }, + // for backward compatibility only, do not use them anymore + "TimeSince": timeSinceLegacy, + "TimeSinceUnix": timeSinceLegacy, + "DateTime": dateTimeLegacy, + // ----------------------------------------------------------------- // setting "AppName": func() string { @@ -101,6 +103,10 @@ func NewFuncMap() template.FuncMap { "AppVer": func() string { return setting.AppVer }, + "AppVerNoMetadata": func() string { + version, _, _ := strings.Cut(setting.AppVer, "+") + return version + }, "AppDomain": func() string { // documented in mail-templates.md return setting.Domain }, @@ -182,6 +188,7 @@ func NewFuncMap() template.FuncMap { "RenderMarkdownToHtml": RenderMarkdownToHtml, "RenderLabel": RenderLabel, "RenderLabels": RenderLabels, + "RenderReviewRequest": RenderReviewRequest, // ----------------------------------------------------------------- // misc diff --git a/modules/templates/htmlrenderer.go b/modules/templates/htmlrenderer.go index 55a55dd7f4..d60397df08 100644 --- a/modules/templates/htmlrenderer.go +++ b/modules/templates/htmlrenderer.go @@ -19,12 +19,12 @@ import ( "sync/atomic" texttemplate "text/template" - "code.gitea.io/gitea/modules/assetfs" - "code.gitea.io/gitea/modules/graceful" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/templates/scopedtmpl" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/assetfs" + "forgejo.org/modules/graceful" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/templates/scopedtmpl" + "forgejo.org/modules/util" ) type TemplateExecutor scopedtmpl.TemplateExecutor diff --git a/modules/templates/htmlrenderer_test.go b/modules/templates/htmlrenderer_test.go index a1d3783a75..7373605744 100644 --- a/modules/templates/htmlrenderer_test.go +++ b/modules/templates/htmlrenderer_test.go @@ -10,7 +10,7 @@ import ( "strings" "testing" - "code.gitea.io/gitea/modules/assetfs" + "forgejo.org/modules/assetfs" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/templates/mailer.go b/modules/templates/mailer.go index ee79755dbb..a40728d7c7 100644 --- a/modules/templates/mailer.go +++ b/modules/templates/mailer.go @@ -11,9 +11,9 @@ import ( "strings" texttmpl "text/template" - "code.gitea.io/gitea/modules/base" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/base" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" ) var mailSubjectSplit = regexp.MustCompile(`(?m)^-{3,}\s*$`) diff --git a/modules/templates/main_test.go b/modules/templates/main_test.go index bbdf5d2f99..946bc603f6 100644 --- a/modules/templates/main_test.go +++ b/modules/templates/main_test.go @@ -7,11 +7,12 @@ import ( "context" "testing" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/markup" + "forgejo.org/models/unittest" + "forgejo.org/modules/markup" - _ "code.gitea.io/gitea/models" - _ "code.gitea.io/gitea/models/issues" + _ "forgejo.org/models" + _ "forgejo.org/models/forgefed" + _ "forgejo.org/models/issues" ) func TestMain(m *testing.M) { diff --git a/modules/templates/static.go b/modules/templates/static.go index b5a7e561ec..776548c853 100644 --- a/modules/templates/static.go +++ b/modules/templates/static.go @@ -8,8 +8,8 @@ package templates import ( "time" - "code.gitea.io/gitea/modules/assetfs" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/assetfs" + "forgejo.org/modules/timeutil" ) // GlobalModTime provide a global mod time for embedded asset files diff --git a/modules/templates/util_avatar.go b/modules/templates/util_avatar.go index 85832cf264..93ebec51e4 100644 --- a/modules/templates/util_avatar.go +++ b/modules/templates/util_avatar.go @@ -9,13 +9,13 @@ import ( "html" "html/template" - activities_model "code.gitea.io/gitea/models/activities" - "code.gitea.io/gitea/models/avatars" - "code.gitea.io/gitea/models/organization" - repo_model "code.gitea.io/gitea/models/repo" - user_model "code.gitea.io/gitea/models/user" - gitea_html "code.gitea.io/gitea/modules/html" - "code.gitea.io/gitea/modules/setting" + activities_model "forgejo.org/models/activities" + "forgejo.org/models/avatars" + "forgejo.org/models/organization" + repo_model "forgejo.org/models/repo" + user_model "forgejo.org/models/user" + gitea_html "forgejo.org/modules/html" + "forgejo.org/modules/setting" ) type AvatarUtils struct { @@ -34,7 +34,7 @@ func AvatarHTML(src string, size int, class, name string) template.HTML { name = "avatar" } - return template.HTML(``) + return template.HTML(``) } // Avatar renders user avatars. args: user, size (int), class (string) diff --git a/modules/templates/util_date.go b/modules/templates/util_date.go new file mode 100644 index 0000000000..bb83bf692a --- /dev/null +++ b/modules/templates/util_date.go @@ -0,0 +1,151 @@ +// Copyright 2024 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package templates + +import ( + "fmt" + "html" + "html/template" + "strings" + "time" + + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" + "forgejo.org/modules/translation" +) + +type DateUtils struct{} + +func NewDateUtils() *DateUtils { + return (*DateUtils)(nil) // the util is stateless, and we do not need to create an instance +} + +// AbsoluteShort renders in "Jan 01, 2006" format +func (du *DateUtils) AbsoluteShort(time any) template.HTML { + return dateTimeFormat("short", time) +} + +// AbsoluteLong renders in "January 01, 2006" format +func (du *DateUtils) AbsoluteLong(time any) template.HTML { + return dateTimeFormat("long", time) +} + +// FullTime renders in "Jan 01, 2006 20:33:44" format +func (du *DateUtils) FullTime(time any) template.HTML { + return dateTimeFormat("full", time) +} + +func (du *DateUtils) TimeSince(time any) template.HTML { + return TimeSince(time) +} + +// ParseLegacy parses the datetime in legacy format, eg: "2016-01-02" in server's timezone. +// It shouldn't be used in new code. New code should use Time or TimeStamp as much as possible. +func (du *DateUtils) ParseLegacy(datetime string) time.Time { + return parseLegacy(datetime) +} + +func parseLegacy(datetime string) time.Time { + t, err := time.Parse(time.RFC3339, datetime) + if err != nil { + t, _ = time.ParseInLocation(time.DateOnly, datetime, setting.DefaultUILocation) + } + return t +} + +func dateTimeLegacy(format string, datetime any, _ ...string) template.HTML { + if !setting.IsProd || setting.IsInTesting { + panic("dateTimeLegacy is for backward compatibility only, do not use it in new code") + } + if s, ok := datetime.(string); ok { + datetime = parseLegacy(s) + } + return dateTimeFormat(format, datetime) +} + +func timeSinceLegacy(time any, _ translation.Locale) template.HTML { + if !setting.IsProd || setting.IsInTesting { + panic("timeSinceLegacy is for backward compatibility only, do not use it in new code") + } + return TimeSince(time) +} + +func anyToTime(any any) (t time.Time, isZero bool) { + switch v := any.(type) { + case nil: + // it is zero + case *time.Time: + if v != nil { + t = *v + } + case time.Time: + t = v + case timeutil.TimeStamp: + t = v.AsTime() + case timeutil.TimeStampNano: + t = v.AsTime() + case int: + t = timeutil.TimeStamp(v).AsTime() + case int64: + t = timeutil.TimeStamp(v).AsTime() + default: + panic(fmt.Sprintf("Unsupported time type %T", any)) + } + return t, t.IsZero() || t.Unix() == 0 +} + +func dateTimeFormat(format string, datetime any) template.HTML { + t, isZero := anyToTime(datetime) + if isZero { + return "-" + } + var textEscaped string + datetimeEscaped := html.EscapeString(t.Format(time.RFC3339)) + if format == "full" { + textEscaped = html.EscapeString(t.Format("2006-01-02 15:04:05 -07:00")) + } else { + textEscaped = html.EscapeString(t.Format("2006-01-02")) + } + + attrs := []string{`weekday=""`, `year="numeric"`} + switch format { + case "short", "long": // date only + attrs = append(attrs, `month="`+format+`"`, `day="numeric"`) + return template.HTML(fmt.Sprintf(`%s`, strings.Join(attrs, " "), datetimeEscaped, textEscaped)) + case "full": // full date including time + attrs = append(attrs, `format="datetime"`, `month="short"`, `day="numeric"`, `hour="numeric"`, `minute="numeric"`, `second="numeric"`, `data-tooltip-content`, `data-tooltip-interactive="true"`) + return template.HTML(fmt.Sprintf(`%s`, strings.Join(attrs, " "), datetimeEscaped, textEscaped)) + default: + panic(fmt.Sprintf("Unsupported format %s", format)) + } +} + +func timeSinceTo(then any, now time.Time) template.HTML { + thenTime, isZero := anyToTime(then) + if isZero { + return "-" + } + + friendlyText := thenTime.Format("2006-01-02 15:04:05 -07:00") + + // document: https://github.com/github/relative-time-element + attrs := `tense="past"` + isFuture := now.Before(thenTime) + if isFuture { + attrs = `tense="future"` + } + + // declare data-tooltip-content attribute to switch from "title" tooltip to "tippy" tooltip + htm := fmt.Sprintf(`%s`, + attrs, thenTime.Format(time.RFC3339), friendlyText) + return template.HTML(htm) +} + +// TimeSince renders relative time HTML given a time +func TimeSince(then any) template.HTML { + if setting.UI.PreferredTimestampTense == "absolute" { + return dateTimeFormat("full", then) + } + return timeSinceTo(then, time.Now()) +} diff --git a/modules/templates/util_date_test.go b/modules/templates/util_date_test.go new file mode 100644 index 0000000000..37caf0d422 --- /dev/null +++ b/modules/templates/util_date_test.go @@ -0,0 +1,82 @@ +// Copyright 2023 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package templates + +import ( + "html/template" + "testing" + "time" + + "forgejo.org/modules/setting" + "forgejo.org/modules/test" + "forgejo.org/modules/timeutil" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestDateTime(t *testing.T) { + testTz, err := time.LoadLocation("America/New_York") + require.NoError(t, err) + defer test.MockVariableValue(&setting.DefaultUILocation, testTz)() + defer test.MockVariableValue(&setting.IsInTesting, false)() + + du := NewDateUtils() + + refTimeStr := "2018-01-01T00:00:00Z" + refDateStr := "2018-01-01" + refTime, _ := time.Parse(time.RFC3339, refTimeStr) + refTimeStamp := timeutil.TimeStamp(refTime.Unix()) + + for _, val := range []any{nil, 0, time.Time{}, timeutil.TimeStamp(0)} { + for _, fun := range []func(val any) template.HTML{du.AbsoluteLong, du.AbsoluteShort, du.FullTime} { + assert.EqualValues(t, "-", fun(val)) + } + } + + actual := dateTimeLegacy("short", "invalid") + assert.EqualValues(t, `-`, actual) + + actual = dateTimeLegacy("short", refTimeStr) + assert.EqualValues(t, `2018-01-01`, actual) + + actual = du.AbsoluteShort(refTime) + assert.EqualValues(t, `2018-01-01`, actual) + + actual = du.AbsoluteLong(refTime) + assert.EqualValues(t, `2018-01-01`, actual) + + actual = dateTimeLegacy("short", refDateStr) + assert.EqualValues(t, `2018-01-01`, actual) + + actual = du.AbsoluteShort(refTimeStamp) + assert.EqualValues(t, `2017-12-31`, actual) + + actual = du.AbsoluteLong(refTimeStamp) + assert.EqualValues(t, `2017-12-31`, actual) + + actual = du.FullTime(refTimeStamp) + assert.EqualValues(t, `2017-12-31 19:00:00 -05:00`, actual) +} + +func TestTimeSince(t *testing.T) { + testTz, _ := time.LoadLocation("America/New_York") + defer test.MockVariableValue(&setting.DefaultUILocation, testTz)() + defer test.MockVariableValue(&setting.IsInTesting, false)() + + du := NewDateUtils() + assert.EqualValues(t, "-", du.TimeSince(nil)) + + refTimeStr := "2018-01-01T00:00:00Z" + refTime, _ := time.Parse(time.RFC3339, refTimeStr) + + actual := du.TimeSince(refTime) + assert.EqualValues(t, `2018-01-01 00:00:00 +00:00`, actual) + + actual = timeSinceTo(&refTime, time.Time{}) + assert.EqualValues(t, `2018-01-01 00:00:00 +00:00`, actual) + + actual = timeSinceLegacy(timeutil.TimeStampNano(refTime.UnixNano()), nil) + assert.EqualValues(t, `2017-12-31 19:00:00 -05:00`, actual) +} diff --git a/modules/templates/util_dict.go b/modules/templates/util_dict.go index 8d6376b522..9d9af77fad 100644 --- a/modules/templates/util_dict.go +++ b/modules/templates/util_dict.go @@ -9,9 +9,9 @@ import ( "html/template" "reflect" - "code.gitea.io/gitea/modules/container" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/container" + "forgejo.org/modules/json" + "forgejo.org/modules/setting" ) func dictMerge(base map[string]any, arg any) bool { diff --git a/modules/templates/util_json.go b/modules/templates/util_json.go index 71a4e23d36..3bc80e8f21 100644 --- a/modules/templates/util_json.go +++ b/modules/templates/util_json.go @@ -6,7 +6,7 @@ package templates import ( "bytes" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" ) type JsonUtils struct{} //nolint:revive diff --git a/modules/templates/util_misc.go b/modules/templates/util_misc.go index 774385483b..12a65c87da 100644 --- a/modules/templates/util_misc.go +++ b/modules/templates/util_misc.go @@ -12,14 +12,14 @@ import ( "strings" "time" - activities_model "code.gitea.io/gitea/models/activities" - repo_model "code.gitea.io/gitea/models/repo" - "code.gitea.io/gitea/modules/git" - giturl "code.gitea.io/gitea/modules/git/url" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/repository" - "code.gitea.io/gitea/modules/svg" + activities_model "forgejo.org/models/activities" + repo_model "forgejo.org/models/repo" + "forgejo.org/modules/git" + giturl "forgejo.org/modules/git/url" + "forgejo.org/modules/json" + "forgejo.org/modules/log" + "forgejo.org/modules/repository" + "forgejo.org/modules/svg" "github.com/editorconfig/editorconfig-core-go/v2" ) diff --git a/modules/templates/util_render.go b/modules/templates/util_render.go index c53bdd876f..a4d7a82eea 100644 --- a/modules/templates/util_render.go +++ b/modules/templates/util_render.go @@ -14,14 +14,14 @@ import ( "strings" "unicode" - issues_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/modules/emoji" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/markup" - "code.gitea.io/gitea/modules/markup/markdown" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/translation" - "code.gitea.io/gitea/modules/util" + issues_model "forgejo.org/models/issues" + "forgejo.org/modules/emoji" + "forgejo.org/modules/log" + "forgejo.org/modules/markup" + "forgejo.org/modules/markup/markdown" + "forgejo.org/modules/setting" + "forgejo.org/modules/translation" + "forgejo.org/modules/util" ) // RenderCommitMessage renders commit message with XSS-safe and special links. @@ -262,3 +262,15 @@ func RenderLabels(ctx context.Context, locale translation.Locale, labels []*issu htmlCode += "" return template.HTML(htmlCode) } + +func RenderReviewRequest(users []issues_model.RequestReviewTarget) template.HTML { + usernames := make([]string, 0, len(users)) + for _, user := range users { + usernames = append(usernames, template.HTMLEscapeString(user.Name())) + } + + htmlCode := `` + htmlCode += strings.Join(usernames, ", ") + htmlCode += "" + return template.HTML(htmlCode) +} diff --git a/modules/templates/util_render_test.go b/modules/templates/util_render_test.go index da74298ef7..20c39eb417 100644 --- a/modules/templates/util_render_test.go +++ b/modules/templates/util_render_test.go @@ -8,10 +8,10 @@ import ( "html/template" "testing" - "code.gitea.io/gitea/models/db" - issues_model "code.gitea.io/gitea/models/issues" - "code.gitea.io/gitea/models/unittest" - "code.gitea.io/gitea/modules/translation" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + "forgejo.org/models/unittest" + "forgejo.org/modules/translation" "github.com/stretchr/testify/assert" ) @@ -46,13 +46,13 @@ var testMetas = map[string]string{ } func TestApostrophesInMentions(t *testing.T) { - rendered := RenderMarkdownToHtml(context.Background(), "@mention-user's comment") - assert.EqualValues(t, template.HTML("

      @mention-user's comment

      \n"), rendered) + rendered := RenderMarkdownToHtml(t.Context(), "@mention-user's comment") + assert.EqualValues(t, template.HTML("

      @mention-user's comment

      \n"), rendered) } func TestNonExistantUserMention(t *testing.T) { - rendered := RenderMarkdownToHtml(context.Background(), "@ThisUserDoesNotExist @mention-user") - assert.EqualValues(t, template.HTML("

      @ThisUserDoesNotExist @mention-user

      \n"), rendered) + rendered := RenderMarkdownToHtml(t.Context(), "@ThisUserDoesNotExist @mention-user") + assert.EqualValues(t, template.HTML("

      @ThisUserDoesNotExist @mention-user

      \n"), rendered) } func TestRenderCommitBody(t *testing.T) { @@ -69,7 +69,7 @@ func TestRenderCommitBody(t *testing.T) { { name: "multiple lines", args: args{ - ctx: context.Background(), + ctx: t.Context(), msg: "first line\nsecond line", }, want: "second line", @@ -77,7 +77,7 @@ func TestRenderCommitBody(t *testing.T) { { name: "multiple lines with leading newlines", args: args{ - ctx: context.Background(), + ctx: t.Context(), msg: "\n\n\n\nfirst line\nsecond line", }, want: "second line", @@ -85,7 +85,7 @@ func TestRenderCommitBody(t *testing.T) { { name: "multiple lines with trailing newlines", args: args{ - ctx: context.Background(), + ctx: t.Context(), msg: "first line\nsecond line\n\n\n", }, want: "second line", @@ -111,25 +111,25 @@ func TestRenderCommitBody(t *testing.T) { com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare 88fc37a3c0 com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit -👠+👠mail@domain.com @mention-user test #123 space -` + "`code 👠#123 code`" - assert.EqualValues(t, expected, RenderCommitBody(context.Background(), testInput, testMetas)) +` + "`code 👠#123 code`" + assert.EqualValues(t, expected, RenderCommitBody(t.Context(), testInput, testMetas)) } func TestRenderCommitMessage(t *testing.T) { expected := `space @mention-user ` - assert.EqualValues(t, expected, RenderCommitMessage(context.Background(), testInput, testMetas)) + assert.EqualValues(t, expected, RenderCommitMessage(t.Context(), testInput, testMetas)) } func TestRenderCommitMessageLinkSubject(t *testing.T) { expected := `space @mention-user` - assert.EqualValues(t, expected, RenderCommitMessageLinkSubject(context.Background(), testInput, "https://example.com/link", testMetas)) + assert.EqualValues(t, expected, RenderCommitMessageLinkSubject(t.Context(), testInput, "https://example.com/link", testMetas)) } func TestRenderIssueTitle(t *testing.T) { @@ -148,14 +148,14 @@ https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb.. com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit -👠+👠mail@domain.com @mention-user test #123 space code :+1: #123 code ` - assert.EqualValues(t, expected, RenderIssueTitle(context.Background(), testInput, testMetas)) + assert.EqualValues(t, expected, RenderIssueTitle(t.Context(), testInput, testMetas)) } func TestRenderRefIssueTitle(t *testing.T) { @@ -174,18 +174,18 @@ https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb.. com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit -👠+👠mail@domain.com @mention-user test #123 space code :+1: #123 code ` - assert.EqualValues(t, expected, RenderRefIssueTitle(context.Background(), testInput)) + assert.EqualValues(t, expected, RenderRefIssueTitle(t.Context(), testInput)) } func TestRenderMarkdownToHtml(t *testing.T) { - expected := `

      space @mention-user
      + expected := `

      space @mention-user
      /just/a/path.bin https://example.com/file.bin local link @@ -194,20 +194,20 @@ func TestRenderMarkdownToHtml(t *testing.T) { remote link local image remote image -local image -remote link + + 88fc37a3c0...12fc37a3c0 (hash) com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare 88fc37a3c0 com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit -👠+👠mail@domain.com -@mention-user test +@mention-user test #123 space code :+1: #123 code

      ` - assert.EqualValues(t, expected, RenderMarkdownToHtml(context.Background(), testInput)) + assert.EqualValues(t, expected, RenderMarkdownToHtml(t.Context(), testInput)) } func TestRenderLabels(t *testing.T) { diff --git a/modules/templates/util_string.go b/modules/templates/util_string.go index f23b74786a..2d255e54a7 100644 --- a/modules/templates/util_string.go +++ b/modules/templates/util_string.go @@ -8,7 +8,7 @@ import ( "html/template" "strings" - "code.gitea.io/gitea/modules/base" + "forgejo.org/modules/base" ) type StringUtils struct{} @@ -19,6 +19,10 @@ func NewStringUtils() *StringUtils { return &stringUtils } +func (su *StringUtils) Make(arr ...string) []string { + return arr +} + func (su *StringUtils) HasPrefix(s any, prefix string) bool { switch v := s.(type) { case string: diff --git a/modules/test/distant_federation_server_mock.go b/modules/test/distant_federation_server_mock.go new file mode 100644 index 0000000000..fd68c88a40 --- /dev/null +++ b/modules/test/distant_federation_server_mock.go @@ -0,0 +1,117 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package test + +import ( + "fmt" + "io" + "net/http" + "net/http/httptest" + "strings" + "testing" +) + +type FederationServerMockPerson struct { + ID int64 + Name string + PubKey string +} +type FederationServerMockRepository struct { + ID int64 +} +type FederationServerMock struct { + Persons []FederationServerMockPerson + Repositories []FederationServerMockRepository + LastPost string +} + +func NewFederationServerMockPerson(id int64, name string) FederationServerMockPerson { + return FederationServerMockPerson{ + ID: id, + Name: name, + PubKey: `"-----BEGIN PUBLIC KEY-----\nMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEA18H5s7N6ItZUAh9tneII\nIuZdTTa3cZlLa/9ejWAHTkcp3WLW+/zbsumlMrWYfBy2/yTm56qasWt38iY4D6ul\n` + + `CPiwhAqX3REvVq8tM79a2CEqZn9ka6vuXoDgBg/sBf/BUWqf7orkjUXwk/U0Egjf\nk5jcurF4vqf1u+rlAHH37dvSBaDjNj6Qnj4OP12bjfaY/yvs7+jue/eNXFHjzN4E\n` + + `T2H4B/yeKTJ4UuAwTlLaNbZJul2baLlHelJPAsxiYaziVuV5P+IGWckY6RSerRaZ\nAkc4mmGGtjAyfN9aewe+lNVfwS7ElFx546PlLgdQgjmeSwLX8FWxbPE5A/PmaXCs\n` + + `nx+nou+3dD7NluULLtdd7K+2x02trObKXCAzmi5/Dc+yKTzpFqEz+hLNCz7TImP/\ncK//NV9Q+X67J9O27baH9R9ZF4zMw8rv2Pg0WLSw1z7lLXwlgIsDapeMCsrxkVO4\n` + + `LXX5AQ1xQNtlssnVoUBqBrvZsX2jUUKUocvZqMGuE4hfAgMBAAE=\n-----END PUBLIC KEY-----\n"`, + } +} + +func NewFederationServerMockRepository(id int64) FederationServerMockRepository { + return FederationServerMockRepository{ + ID: id, + } +} + +func (p FederationServerMockPerson) marshal(host string) string { + return fmt.Sprintf(`{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1"],`+ + `"id":"http://%[1]v/api/activitypub/user-id/%[2]v",`+ + `"type":"Person",`+ + `"icon":{"type":"Image","mediaType":"image/png","url":"http://%[1]v/avatars/1bb05d9a5f6675ed0272af9ea193063c"},`+ + `"url":"http://%[1]v/%[2]v",`+ + `"inbox":"http://%[1]v/api/activitypub/user-id/%[2]v/inbox",`+ + `"outbox":"http://%[1]v/api/activitypub/user-id/%[2]v/outbox",`+ + `"preferredUsername":"%[3]v",`+ + `"publicKey":{"id":"http://%[1]v/api/activitypub/user-id/%[2]v#main-key",`+ + `"owner":"http://%[1]v/api/activitypub/user-id/%[2]v",`+ + `"publicKeyPem":%[4]v}}`, host, p.ID, p.Name, p.PubKey) +} + +func NewFederationServerMock() *FederationServerMock { + return &FederationServerMock{ + Persons: []FederationServerMockPerson{ + NewFederationServerMockPerson(15, "stargoose1"), + NewFederationServerMockPerson(30, "stargoose2"), + }, + Repositories: []FederationServerMockRepository{ + NewFederationServerMockRepository(1), + }, + LastPost: "", + } +} + +func (mock *FederationServerMock) DistantServer(t *testing.T) *httptest.Server { + federatedRoutes := http.NewServeMux() + federatedRoutes.HandleFunc("/.well-known/nodeinfo", + func(res http.ResponseWriter, req *http.Request) { + // curl -H "Accept: application/json" https://federated-repo.prod.meissa.de/.well-known/nodeinfo + // TODO: as soon as content-type will become important: content-type: application/json;charset=utf-8 + fmt.Fprintf(res, `{"links":[{"href":"http://%s/api/v1/nodeinfo","rel":"http://nodeinfo.diaspora.software/ns/schema/2.1"}]}`, req.Host) + }) + federatedRoutes.HandleFunc("/api/v1/nodeinfo", + func(res http.ResponseWriter, req *http.Request) { + // curl -H "Accept: application/json" https://federated-repo.prod.meissa.de/api/v1/nodeinfo + fmt.Fprint(res, `{"version":"2.1","software":{"name":"forgejo","version":"1.20.0+dev-3183-g976d79044",`+ + `"repository":"https://codeberg.org/forgejo/forgejo.git","homepage":"https://forgejo.org/"},`+ + `"protocols":["activitypub"],"services":{"inbound":[],"outbound":["rss2.0"]},`+ + `"openRegistrations":true,"usage":{"users":{"total":14,"activeHalfyear":2}},"metadata":{}}`) + }) + for _, person := range mock.Persons { + federatedRoutes.HandleFunc(fmt.Sprintf("/api/v1/activitypub/user-id/%v", person.ID), + func(res http.ResponseWriter, req *http.Request) { + // curl -H "Accept: application/json" https://federated-repo.prod.meissa.de/api/v1/activitypub/user-id/2 + fmt.Fprint(res, person.marshal(req.Host)) + }) + } + for _, repository := range mock.Repositories { + federatedRoutes.HandleFunc(fmt.Sprintf("/api/v1/activitypub/repository-id/%v/inbox/", repository.ID), + func(res http.ResponseWriter, req *http.Request) { + if req.Method != "POST" { + t.Errorf("POST expected at: %q", req.URL.EscapedPath()) + } + buf := new(strings.Builder) + _, err := io.Copy(buf, req.Body) + if err != nil { + t.Errorf("Error reading body: %q", err) + } + mock.LastPost = buf.String() + }) + } + federatedRoutes.HandleFunc("/", + func(res http.ResponseWriter, req *http.Request) { + t.Errorf("Unhandled request: %q", req.URL.EscapedPath()) + }) + federatedSrv := httptest.NewServer(federatedRoutes) + return federatedSrv +} diff --git a/modules/test/logchecker.go b/modules/test/logchecker.go index 0f12257f3e..8e8fc32216 100644 --- a/modules/test/logchecker.go +++ b/modules/test/logchecker.go @@ -11,7 +11,7 @@ import ( "sync/atomic" "time" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) type LogChecker struct { diff --git a/modules/test/logchecker_test.go b/modules/test/logchecker_test.go index 0f410fed12..d81142bf1c 100644 --- a/modules/test/logchecker_test.go +++ b/modules/test/logchecker_test.go @@ -7,7 +7,7 @@ import ( "testing" "time" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" "github.com/stretchr/testify/assert" ) diff --git a/modules/test/utils.go b/modules/test/utils.go index 3d884b6cbe..f60bad022e 100644 --- a/modules/test/utils.go +++ b/modules/test/utils.go @@ -8,7 +8,7 @@ import ( "net/http/httptest" "strings" - "code.gitea.io/gitea/modules/json" + "forgejo.org/modules/json" ) // RedirectURL returns the redirect URL of a http response. diff --git a/modules/testlogger/testlogger.go b/modules/testlogger/testlogger.go index 95cbb86591..b5f196ad4b 100644 --- a/modules/testlogger/testlogger.go +++ b/modules/testlogger/testlogger.go @@ -16,8 +16,9 @@ import ( "testing" "time" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/queue" + "forgejo.org/modules/log" + "forgejo.org/modules/queue" + "forgejo.org/modules/util" ) var ( @@ -131,6 +132,8 @@ var ignoredErrorMessage = []string{ `:SSHLog() [E] ssh: Not allowed to push to protected branch protected. HookPreReceive(last) failed: internal API error response, status=403`, // TestGit/HTTP/BranchProtectMerge `:SSHLog() [E] ssh: branch protected is protected from force push. HookPreReceive(last) failed: internal API error response, status=403`, + // TestGit/HTTP/BranchProtect + `:SSHLog() [E] ssh: branch before-create-2 is protected from changing file protected-file-data-`, // TestGit/HTTP/MergeFork/CreatePRAndMerge `:DeleteBranchPost() [E] DeleteBranch: GetBranch: branch does not exist [repo_id: 1099 name: user2:master]`, // sqlite "s/web/repo/branch.go:108:DeleteBranchPost() [E] DeleteBranch: GetBranch: branch does not exist [repo_id: 10000 name: user2:master]", // mysql @@ -443,10 +446,7 @@ func (w *testLoggerWriterCloser) Reset() error { func PrintCurrentTest(t testing.TB, skip ...int) func() { t.Helper() start := time.Now() - actualSkip := 1 - if len(skip) > 0 { - actualSkip = skip[0] + 1 - } + actualSkip := util.OptionalArg(skip) + 1 _, filename, line, _ := runtime.Caller(actualSkip) if log.CanColorStdout { @@ -471,7 +471,7 @@ func PrintCurrentTest(t testing.TB, skip ...int) func() { _, _ = fmt.Fprintf(os.Stdout, "+++ %s ... still flushing after %v ...\n", t.Name(), SlowFlush) } }) - if err := queue.GetManager().FlushAll(context.Background(), time.Minute); err != nil { + if err := queue.GetManager().FlushAll(t.Context(), time.Minute); err != nil { t.Errorf("Flushing queues failed with error %v", err) } timer.Stop() @@ -486,7 +486,7 @@ func PrintCurrentTest(t testing.TB, skip ...int) func() { if err := WriterCloser.popT(); err != nil { // disable test failure for now (too flacky) - _, _ = fmt.Fprintf(os.Stdout, "testlogger.go:recordError() FATAL ERROR: log.Error has been called: %v", err) + _, _ = fmt.Fprintf(os.Stdout, "testlogger.go:recordError() FATAL ERROR: log.Error has been called: %v\n", err) // t.Errorf("testlogger.go:recordError() FATAL ERROR: log.Error has been called: %v", err) } } diff --git a/modules/timeutil/datetime.go b/modules/timeutil/datetime.go deleted file mode 100644 index c089173560..0000000000 --- a/modules/timeutil/datetime.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2023 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package timeutil - -import ( - "fmt" - "html" - "html/template" - "strings" - "time" -) - -// DateTime renders an absolute time HTML element by datetime. -func DateTime(format string, datetime any, extraAttrs ...string) template.HTML { - // TODO: remove the extraAttrs argument, it's not used in any call to DateTime - - if p, ok := datetime.(*time.Time); ok { - datetime = *p - } - if p, ok := datetime.(*TimeStamp); ok { - datetime = *p - } - switch v := datetime.(type) { - case TimeStamp: - datetime = v.AsTime() - case int: - datetime = TimeStamp(v).AsTime() - case int64: - datetime = TimeStamp(v).AsTime() - } - - var datetimeEscaped, textEscaped string - switch v := datetime.(type) { - case nil: - return "-" - case string: - datetimeEscaped = html.EscapeString(v) - textEscaped = datetimeEscaped - case time.Time: - if v.IsZero() || v.Unix() == 0 { - return "-" - } - datetimeEscaped = html.EscapeString(v.Format(time.RFC3339)) - if format == "full" { - textEscaped = html.EscapeString(v.Format("2006-01-02 15:04:05 -07:00")) - } else { - textEscaped = html.EscapeString(v.Format("2006-01-02")) - } - default: - panic(fmt.Sprintf("Unsupported time type %T", datetime)) - } - - attrs := make([]string, 0, 10+len(extraAttrs)) - attrs = append(attrs, extraAttrs...) - attrs = append(attrs, `weekday=""`, `year="numeric"`) - - switch format { - case "short", "long": // date only - attrs = append(attrs, `month="`+format+`"`, `day="numeric"`) - return template.HTML(fmt.Sprintf(`%s`, strings.Join(attrs, " "), datetimeEscaped, textEscaped)) - case "full": // full date including time - attrs = append(attrs, `format="datetime"`, `month="short"`, `day="numeric"`, `hour="numeric"`, `minute="numeric"`, `second="numeric"`, `data-tooltip-content`, `data-tooltip-interactive="true"`) - return template.HTML(fmt.Sprintf(`%s`, strings.Join(attrs, " "), datetimeEscaped, textEscaped)) - default: - panic(fmt.Sprintf("Unsupported format %s", format)) - } -} diff --git a/modules/timeutil/datetime_test.go b/modules/timeutil/datetime_test.go deleted file mode 100644 index ac2ce35ba2..0000000000 --- a/modules/timeutil/datetime_test.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2023 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package timeutil - -import ( - "testing" - "time" - - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/test" - - "github.com/stretchr/testify/assert" -) - -func TestDateTime(t *testing.T) { - testTz, _ := time.LoadLocation("America/New_York") - defer test.MockVariableValue(&setting.DefaultUILocation, testTz)() - - refTimeStr := "2018-01-01T00:00:00Z" - refDateStr := "2018-01-01" - refTime, _ := time.Parse(time.RFC3339, refTimeStr) - refTimeStamp := TimeStamp(refTime.Unix()) - - assert.EqualValues(t, "-", DateTime("short", nil)) - assert.EqualValues(t, "-", DateTime("short", 0)) - assert.EqualValues(t, "-", DateTime("short", time.Time{})) - assert.EqualValues(t, "-", DateTime("short", TimeStamp(0))) - - actual := DateTime("short", "invalid") - assert.EqualValues(t, `invalid`, actual) - - actual = DateTime("short", refTimeStr) - assert.EqualValues(t, `2018-01-01T00:00:00Z`, actual) - - actual = DateTime("short", refTime) - assert.EqualValues(t, `2018-01-01`, actual) - - actual = DateTime("short", refDateStr) - assert.EqualValues(t, `2018-01-01`, actual) - - actual = DateTime("short", refTimeStamp) - assert.EqualValues(t, `2017-12-31`, actual) - - actual = DateTime("full", refTimeStamp) - assert.EqualValues(t, `2017-12-31 19:00:00 -05:00`, actual) -} diff --git a/modules/timeutil/executable.go b/modules/timeutil/executable.go index 57ae8b2a9d..7b30176df0 100644 --- a/modules/timeutil/executable.go +++ b/modules/timeutil/executable.go @@ -9,7 +9,7 @@ import ( "sync" "time" - "code.gitea.io/gitea/modules/log" + "forgejo.org/modules/log" ) var ( diff --git a/modules/timeutil/since.go b/modules/timeutil/since.go index dba42c793a..b0bbe25f98 100644 --- a/modules/timeutil/since.go +++ b/modules/timeutil/since.go @@ -4,13 +4,10 @@ package timeutil import ( - "fmt" - "html/template" "strings" "time" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/translation" + "forgejo.org/modules/translation" ) // Seconds-based time units @@ -81,16 +78,11 @@ func computeTimeDiffFloor(diff int64, lang translation.Locale) (int64, string) { return diff, diffStr } -// MinutesToFriendly returns a user friendly string with number of minutes +// MinutesToFriendly returns a user-friendly string with number of minutes // converted to hours and minutes. func MinutesToFriendly(minutes int, lang translation.Locale) string { duration := time.Duration(minutes) * time.Minute - return TimeSincePro(time.Now().Add(-duration), lang) -} - -// TimeSincePro calculates the time interval and generate full user-friendly string. -func TimeSincePro(then time.Time, lang translation.Locale) string { - return timeSincePro(then, time.Now(), lang) + return timeSincePro(time.Now().Add(-duration), time.Now(), lang) } func timeSincePro(then, now time.Time, lang translation.Locale) string { @@ -114,32 +106,3 @@ func timeSincePro(then, now time.Time, lang translation.Locale) string { } return strings.TrimPrefix(timeStr, ", ") } - -func timeSinceUnix(then, now time.Time, _ translation.Locale) template.HTML { - friendlyText := then.Format("2006-01-02 15:04:05 -07:00") - - // document: https://github.com/github/relative-time-element - attrs := `tense="past"` - isFuture := now.Before(then) - if isFuture { - attrs = `tense="future"` - } - - // declare data-tooltip-content attribute to switch from "title" tooltip to "tippy" tooltip - htm := fmt.Sprintf(`%s`, - attrs, then.Format(time.RFC3339), friendlyText) - return template.HTML(htm) -} - -// TimeSince renders relative time HTML given a time.Time -func TimeSince(then time.Time, lang translation.Locale) template.HTML { - if setting.UI.PreferredTimestampTense == "absolute" { - return DateTime("full", then) - } - return timeSinceUnix(then, time.Now(), lang) -} - -// TimeSinceUnix renders relative time HTML given a TimeStamp -func TimeSinceUnix(then TimeStamp, lang translation.Locale) template.HTML { - return TimeSince(then.AsLocalTime(), lang) -} diff --git a/modules/timeutil/since_test.go b/modules/timeutil/since_test.go index 40fefe8700..b47b2c76dd 100644 --- a/modules/timeutil/since_test.go +++ b/modules/timeutil/since_test.go @@ -9,8 +9,8 @@ import ( "testing" "time" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/translation" + "forgejo.org/modules/setting" + "forgejo.org/modules/translation" "github.com/stretchr/testify/assert" ) diff --git a/modules/timeutil/timestamp.go b/modules/timeutil/timestamp.go index 27a80b6682..783ccba30b 100644 --- a/modules/timeutil/timestamp.go +++ b/modules/timeutil/timestamp.go @@ -6,7 +6,7 @@ package timeutil import ( "time" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" ) // TimeStamp defines a timestamp diff --git a/modules/timeutil/timestampnano.go b/modules/timeutil/timestampnano.go index 4a9f7955b9..e2e86b863f 100644 --- a/modules/timeutil/timestampnano.go +++ b/modules/timeutil/timestampnano.go @@ -6,7 +6,7 @@ package timeutil import ( "time" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" ) // TimeStampNano is for nano time in database, do not use it unless there is a real requirement. diff --git a/modules/translation/i18n/dummy.go b/modules/translation/i18n/dummy.go new file mode 100644 index 0000000000..861672c619 --- /dev/null +++ b/modules/translation/i18n/dummy.go @@ -0,0 +1,58 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package i18n + +import ( + "fmt" + "html/template" + "reflect" + "slices" + "strings" +) + +type KeyLocale struct{} + +var _ Locale = (*KeyLocale)(nil) + +// HasKey implements Locale. +func (k *KeyLocale) HasKey(trKey string) bool { + return true +} + +// TrHTML implements Locale. +func (k *KeyLocale) TrHTML(trKey string, trArgs ...any) template.HTML { + return template.HTML(k.TrString(trKey, PrepareArgsForHTML(trArgs...)...)) +} + +// TrString implements Locale. +func (k *KeyLocale) TrString(trKey string, trArgs ...any) string { + return FormatDummy(trKey, trArgs...) +} + +// TrPluralString implements Locale. +func (k *KeyLocale) TrPluralString(count any, trKey string, trArgs ...any) template.HTML { + return template.HTML(FormatDummy(trKey, PrepareArgsForHTML(trArgs...)...)) +} + +func FormatDummy(trKey string, args ...any) string { + if len(args) == 0 { + return fmt.Sprintf("(%s)", trKey) + } + + fmtArgs := make([]any, 0, len(args)+1) + fmtArgs = append(fmtArgs, trKey) + for _, arg := range args { + val := reflect.ValueOf(arg) + if val.Kind() == reflect.Slice { + for i := 0; i < val.Len(); i++ { + fmtArgs = append(fmtArgs, val.Index(i).Interface()) + } + } else { + fmtArgs = append(fmtArgs, arg) + } + } + + template := fmt.Sprintf("(%%s: %s)", strings.Join(slices.Repeat([]string{"%v"}, len(fmtArgs)-1), ", ")) + return fmt.Sprintf(template, fmtArgs...) +} diff --git a/modules/translation/i18n/dummy_test.go b/modules/translation/i18n/dummy_test.go new file mode 100644 index 0000000000..1df3d0c348 --- /dev/null +++ b/modules/translation/i18n/dummy_test.go @@ -0,0 +1,19 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package i18n_test + +import ( + "testing" + + "forgejo.org/modules/translation/i18n" + + "github.com/stretchr/testify/assert" +) + +func TestFormatDummy(t *testing.T) { + assert.Equal(t, "(admin.config.git_max_diff_lines)", i18n.FormatDummy("admin.config.git_max_diff_lines")) + assert.Equal(t, "(dashboard)", i18n.FormatDummy("dashboard")) + assert.Equal(t, "(branch.create_branch: main)", i18n.FormatDummy("branch.create_branch", "main")) + assert.Equal(t, "(test.test: a, 1, true)", i18n.FormatDummy("test.test", "a", 1, true)) +} diff --git a/modules/translation/i18n/errors.go b/modules/translation/i18n/errors.go index 7f64ccf908..63a5f48dfa 100644 --- a/modules/translation/i18n/errors.go +++ b/modules/translation/i18n/errors.go @@ -4,10 +4,12 @@ package i18n import ( - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/util" ) var ( - ErrLocaleAlreadyExist = util.SilentWrap{Message: "lang already exists", Err: util.ErrAlreadyExist} - ErrUncertainArguments = util.SilentWrap{Message: "arguments to i18n should not contain uncertain slices", Err: util.ErrInvalidArgument} + ErrLocaleAlreadyExist = util.SilentWrap{Message: "lang already exists", Err: util.ErrAlreadyExist} + ErrLocaleDoesNotExist = util.SilentWrap{Message: "lang does not exist", Err: util.ErrNotExist} + ErrTranslationDoesNotExist = util.SilentWrap{Message: "translation does not exist", Err: util.ErrNotExist} + ErrUncertainArguments = util.SilentWrap{Message: "arguments to i18n should not contain uncertain slices", Err: util.ErrInvalidArgument} ) diff --git a/modules/translation/i18n/i18n.go b/modules/translation/i18n/i18n.go index 1555cd961e..e447502a3b 100644 --- a/modules/translation/i18n/i18n.go +++ b/modules/translation/i18n/i18n.go @@ -8,11 +8,28 @@ import ( "io" ) +type ( + PluralFormIndex uint8 + PluralFormRule func(int64) PluralFormIndex +) + +const ( + PluralFormZero PluralFormIndex = iota + PluralFormOne + PluralFormTwo + PluralFormFew + PluralFormMany + PluralFormOther +) + var DefaultLocales = NewLocaleStore() type Locale interface { // TrString translates a given key and arguments for a language TrString(trKey string, trArgs ...any) string + // TrPluralString translates a given pluralized key and arguments for a language. + // This function returns an error if new-style support for the given key is not available. + TrPluralString(count any, trKey string, trArgs ...any) template.HTML // TrHTML translates a given key and arguments for a language, string arguments are escaped to HTML TrHTML(trKey string, trArgs ...any) template.HTML // HasKey reports if a locale has a translation for a given key @@ -31,8 +48,10 @@ type LocaleStore interface { Locale(langName string) (Locale, bool) // HasLang returns whether a given language is present in the store HasLang(langName string) bool - // AddLocaleByIni adds a new language to the store - AddLocaleByIni(langName, langDesc string, source, moreSource []byte) error + // AddLocaleByIni adds a new old-style language to the store + AddLocaleByIni(langName, langDesc string, pluralRule PluralFormRule, source, moreSource []byte) error + // AddLocaleByJSON adds new-style content to an existing language to the store + AddToLocaleFromJSON(langName string, source []byte) error } // ResetDefaultLocales resets the current default locales diff --git a/modules/translation/i18n/i18n_test.go b/modules/translation/i18n/i18n_test.go index 244f6ffbb3..a0458f0b8e 100644 --- a/modules/translation/i18n/i18n_test.go +++ b/modules/translation/i18n/i18n_test.go @@ -12,6 +12,26 @@ import ( "github.com/stretchr/testify/require" ) +var MockPluralRule PluralFormRule = func(n int64) PluralFormIndex { + if n == 0 { + return PluralFormZero + } + if n == 1 { + return PluralFormOne + } + if n >= 2 && n <= 4 { + return PluralFormFew + } + return PluralFormOther +} + +var MockPluralRuleEnglish PluralFormRule = func(n int64) PluralFormIndex { + if n == 1 { + return PluralFormOne + } + return PluralFormOther +} + func TestLocaleStore(t *testing.T) { testData1 := []byte(` .dot.name = Dot Name @@ -27,11 +47,48 @@ fmt = %[2]s %[1]s [section] sub = Changed Sub String +commits = fallback value for commits +`) + + testDataJSON2 := []byte(` +{ + "section.json": "the JSON is %s", + "section.commits": { + "one": "one %d commit", + "few": "some %d commits", + "other": "lots of %d commits" + }, + "section.incomplete": { + "few": "some %d objects (translated)" + }, + "nested": { + "outer": { + "inner": { + "json": "Hello World", + "issue": { + "one": "one %d issue", + "few": "some %d issues", + "other": "lots of %d issues" + } + } + } + } +} +`) + testDataJSON1 := []byte(` +{ + "section.incomplete": { + "one": "[untranslated] some %d object", + "other": "[untranslated] some %d objects" + } +} `) ls := NewLocaleStore() - require.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", testData1, nil)) - require.NoError(t, ls.AddLocaleByIni("lang2", "Lang2", testData2, nil)) + require.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", MockPluralRuleEnglish, testData1, nil)) + require.NoError(t, ls.AddLocaleByIni("lang2", "Lang2", MockPluralRule, testData2, nil)) + require.NoError(t, ls.AddToLocaleFromJSON("lang1", testDataJSON1)) + require.NoError(t, ls.AddToLocaleFromJSON("lang2", testDataJSON2)) ls.SetDefaultLang("lang1") lang1, _ := ls.Locale("lang1") @@ -56,12 +113,60 @@ sub = Changed Sub String result2 := lang2.TrHTML("section.mixed", "a&b") assert.EqualValues(t, `test value; a&b`, result2) + result = lang2.TrString("section.json", "valid") + assert.Equal(t, "the JSON is valid", result) + + result = lang2.TrString("nested.outer.inner.json") + assert.Equal(t, "Hello World", result) + + result = lang2.TrString("section.commits") + assert.Equal(t, "lots of %d commits", result) + + result2 = lang2.TrPluralString(1, "section.commits", 1) + assert.EqualValues(t, "one 1 commit", result2) + + result2 = lang2.TrPluralString(3, "section.commits", 3) + assert.EqualValues(t, "some 3 commits", result2) + + result2 = lang2.TrPluralString(8, "section.commits", 8) + assert.EqualValues(t, "lots of 8 commits", result2) + + result2 = lang2.TrPluralString(0, "section.commits") + assert.EqualValues(t, "section.commits", result2) + + result2 = lang2.TrPluralString(1, "nested.outer.inner.issue", 1) + assert.EqualValues(t, "one 1 issue", result2) + + result2 = lang2.TrPluralString(3, "nested.outer.inner.issue", 3) + assert.EqualValues(t, "some 3 issues", result2) + + result2 = lang2.TrPluralString(9, "nested.outer.inner.issue", 9) + assert.EqualValues(t, "lots of 9 issues", result2) + + result2 = lang2.TrPluralString(3, "section.incomplete", 3) + assert.EqualValues(t, "some 3 objects (translated)", result2) + + result2 = lang2.TrPluralString(1, "section.incomplete", 1) + assert.EqualValues(t, "[untranslated] some 1 object", result2) + + result2 = lang2.TrPluralString(7, "section.incomplete", 7) + assert.EqualValues(t, "[untranslated] some 7 objects", result2) + langs, descs := ls.ListLangNameDesc() assert.ElementsMatch(t, []string{"lang1", "lang2"}, langs) assert.ElementsMatch(t, []string{"Lang1", "Lang2"}, descs) - found := lang1.HasKey("no-such") + // Test HasKey for JSON + found := lang2.HasKey("section.json") + assert.True(t, found) + + // Test HasKey for INI + found = lang2.HasKey("section.sub") + assert.True(t, found) + + found = lang1.HasKey("no-such") assert.False(t, found) + assert.EqualValues(t, "no-such", lang1.TrString("no-such")) require.NoError(t, ls.Close()) } @@ -77,7 +182,7 @@ c=22 `) ls := NewLocaleStore() - require.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", testData1, testData2)) + require.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", MockPluralRule, testData1, testData2)) lang1, _ := ls.Locale("lang1") assert.Equal(t, "11", lang1.TrString("a")) assert.Equal(t, "21", lang1.TrString("b")) @@ -118,7 +223,7 @@ func (e *errorPointerReceiver) Error() string { func TestLocaleWithTemplate(t *testing.T) { ls := NewLocaleStore() - require.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", []byte(`key=%s`), nil)) + require.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", MockPluralRule, []byte(`key=%s`), nil)) lang1, _ := ls.Locale("lang1") tmpl := template.New("test").Funcs(template.FuncMap{"tr": lang1.TrHTML}) @@ -181,7 +286,7 @@ func TestLocaleStoreQuirks(t *testing.T) { for _, testData := range testDataList { ls := NewLocaleStore() - err := ls.AddLocaleByIni("lang1", "Lang1", []byte("a="+testData.in), nil) + err := ls.AddLocaleByIni("lang1", "Lang1", nil, []byte("a="+testData.in), nil) lang1, _ := ls.Locale("lang1") require.NoError(t, err, testData.hint) assert.Equal(t, testData.out, lang1.TrString("a"), testData.hint) diff --git a/modules/translation/i18n/localestore.go b/modules/translation/i18n/localestore.go index 0e6ddab401..1b64139690 100644 --- a/modules/translation/i18n/localestore.go +++ b/modules/translation/i18n/localestore.go @@ -1,4 +1,5 @@ // Copyright 2022 The Gitea Authors. All rights reserved. +// Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package i18n @@ -8,8 +9,10 @@ import ( "html/template" "slices" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/json" + "forgejo.org/modules/log" + "forgejo.org/modules/setting" + "forgejo.org/modules/util" ) // This file implements the static LocaleStore that will not watch for changes @@ -18,6 +21,9 @@ type locale struct { store *localeStore langName string idxToMsgMap map[int]string // the map idx is generated by store's trKeyToIdxMap + + newStyleMessages map[string]string + pluralRule PluralFormRule } var _ Locale = (*locale)(nil) @@ -38,8 +44,19 @@ func NewLocaleStore() LocaleStore { return &localeStore{localeMap: make(map[string]*locale), trKeyToIdxMap: make(map[string]int)} } +const ( + PluralFormSeparator string = "\036" +) + +// A note about pluralization rules. +// go-i18n supports plural rules in theory. +// In practice, it relies on another library that hardcodes a list of common languages +// and their plural rules, and does not support languages not hardcoded there. +// So we pretend that all languages are English and use our own function to extract +// the correct plural form for a given count and language. + // AddLocaleByIni adds locale by ini into the store -func (store *localeStore) AddLocaleByIni(langName, langDesc string, source, moreSource []byte) error { +func (store *localeStore) AddLocaleByIni(langName, langDesc string, pluralRule PluralFormRule, source, moreSource []byte) error { if _, ok := store.localeMap[langName]; ok { return ErrLocaleAlreadyExist } @@ -47,7 +64,7 @@ func (store *localeStore) AddLocaleByIni(langName, langDesc string, source, more store.langNames = append(store.langNames, langName) store.langDescs = append(store.langDescs, langDesc) - l := &locale{store: store, langName: langName, idxToMsgMap: make(map[int]string)} + l := &locale{store: store, langName: langName, idxToMsgMap: make(map[int]string), pluralRule: pluralRule, newStyleMessages: make(map[string]string)} store.localeMap[l.langName] = l iniFile, err := setting.NewConfigProviderForLocale(source, moreSource) @@ -78,6 +95,98 @@ func (store *localeStore) AddLocaleByIni(langName, langDesc string, source, more return nil } +func RecursivelyAddTranslationsFromJSON(locale *locale, object map[string]any, prefix string) error { + for key, value := range object { + var fullkey string + if prefix != "" { + fullkey = prefix + "." + key + } else { + fullkey = key + } + + switch v := value.(type) { + case string: + // Check whether we are adding a plural form to the parent object, or a new nested JSON object. + + if key == "zero" || key == "one" || key == "two" || key == "few" || key == "many" { + locale.newStyleMessages[prefix+PluralFormSeparator+key] = v + } else if key == "other" { + locale.newStyleMessages[prefix] = v + } else { + locale.newStyleMessages[fullkey] = v + } + + case map[string]any: + err := RecursivelyAddTranslationsFromJSON(locale, v, fullkey) + if err != nil { + return err + } + + case nil: + default: + return fmt.Errorf("Unrecognized JSON value '%s'", value) + } + } + + return nil +} + +func (store *localeStore) AddToLocaleFromJSON(langName string, source []byte) error { + locale, ok := store.localeMap[langName] + if !ok { + return ErrLocaleDoesNotExist + } + + var result map[string]any + if err := json.Unmarshal(source, &result); err != nil { + return err + } + + return RecursivelyAddTranslationsFromJSON(locale, result, "") +} + +func (l *locale) LookupNewStyleMessage(trKey string) string { + if msg, ok := l.newStyleMessages[trKey]; ok { + return msg + } + return "" +} + +func (l *locale) LookupPlural(trKey string, count any) string { + n, err := util.ToInt64(count) + if err != nil { + log.Error("Invalid plural count '%s'", count) + return "" + } + + pluralForm := l.pluralRule(n) + suffix := "" + switch pluralForm { + case PluralFormZero: + suffix = PluralFormSeparator + "zero" + case PluralFormOne: + suffix = PluralFormSeparator + "one" + case PluralFormTwo: + suffix = PluralFormSeparator + "two" + case PluralFormFew: + suffix = PluralFormSeparator + "few" + case PluralFormMany: + suffix = PluralFormSeparator + "many" + case PluralFormOther: + // No suffix for the "other" string. + default: + log.Error("Invalid plural form index %d for count %d", pluralForm, count) + return "" + } + + if result, ok := l.newStyleMessages[trKey+suffix]; ok { + return result + } + + log.Error("Missing translation for plural form index %d for count %d", pluralForm, count) + return "" +} + func (store *localeStore) HasLang(langName string) bool { _, ok := store.localeMap[langName] return ok @@ -113,22 +222,38 @@ func (store *localeStore) Close() error { func (l *locale) TrString(trKey string, trArgs ...any) string { format := trKey - idx, ok := l.store.trKeyToIdxMap[trKey] - found := false - if ok { - if msg, ok := l.idxToMsgMap[idx]; ok { - format = msg // use the found translation - found = true - } else if def, ok := l.store.localeMap[l.store.defaultLang]; ok { - // try to use default locale's translation - if msg, ok := def.idxToMsgMap[idx]; ok { - format = msg + if msg := l.LookupNewStyleMessage(trKey); msg != "" { + format = msg + } else { + // First fallback: old-style translation + idx, foundIndex := l.store.trKeyToIdxMap[trKey] + found := false + if foundIndex { + if msg, ok := l.idxToMsgMap[idx]; ok { + format = msg // use the found translation found = true } } - } - if !found { - log.Error("Missing translation %q", trKey) + + if !found { + // Second fallback: new-style default language + if defaultLang, ok := l.store.localeMap[l.store.defaultLang]; ok { + if msg := defaultLang.LookupNewStyleMessage(trKey); msg != "" { + format = msg + found = true + } else if foundIndex { + // Third fallback: old-style default language + if msg, ok := defaultLang.idxToMsgMap[idx]; ok { + format = msg + found = true + } + } + } + + if !found { + log.Error("Missing translation %q", trKey) + } + } } msg, err := Format(format, trArgs...) @@ -138,7 +263,7 @@ func (l *locale) TrString(trKey string, trArgs ...any) string { return msg } -func (l *locale) TrHTML(trKey string, trArgs ...any) template.HTML { +func PrepareArgsForHTML(trArgs ...any) []any { args := slices.Clone(trArgs) for i, v := range args { switch v := v.(type) { @@ -152,11 +277,38 @@ func (l *locale) TrHTML(trKey string, trArgs ...any) template.HTML { args[i] = template.HTMLEscapeString(fmt.Sprint(v)) } } - return template.HTML(l.TrString(trKey, args...)) + return args +} + +func (l *locale) TrHTML(trKey string, trArgs ...any) template.HTML { + return template.HTML(l.TrString(trKey, PrepareArgsForHTML(trArgs...)...)) +} + +func (l *locale) TrPluralString(count any, trKey string, trArgs ...any) template.HTML { + message := l.LookupPlural(trKey, count) + + if message == "" { + if defaultLang, ok := l.store.localeMap[l.store.defaultLang]; ok { + message = defaultLang.LookupPlural(trKey, count) + } + if message == "" { + message = trKey + } + } + + message, err := Format(message, PrepareArgsForHTML(trArgs...)...) + if err != nil { + log.Error("Error whilst formatting %q in %s: %v", trKey, l.langName, err) + } + return template.HTML(message) } // HasKey returns whether a key is present in this locale or not func (l *locale) HasKey(trKey string) bool { + _, ok := l.newStyleMessages[trKey] + if ok { + return true + } idx, ok := l.store.trKeyToIdxMap[trKey] if !ok { return false diff --git a/modules/translation/mock.go b/modules/translation/mock.go index fe3a1502ea..72a15b7438 100644 --- a/modules/translation/mock.go +++ b/modules/translation/mock.go @@ -31,10 +31,18 @@ func (l MockLocale) TrN(cnt any, key1, keyN string, args ...any) template.HTML { return template.HTML(key1) } +func (l MockLocale) TrPluralString(count any, trKey string, trArgs ...any) template.HTML { + return template.HTML(trKey) +} + func (l MockLocale) TrSize(s int64) ReadableSize { return ReadableSize{fmt.Sprint(s), ""} } +func (l MockLocale) HasKey(key string) bool { + return true +} + func (l MockLocale) PrettyNumber(v any) string { return fmt.Sprint(v) } diff --git a/modules/translation/plural_rules.go b/modules/translation/plural_rules.go new file mode 100644 index 0000000000..7e9ae39111 --- /dev/null +++ b/modules/translation/plural_rules.go @@ -0,0 +1,253 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +// Some useful links: +// https://www.unicode.org/cldr/charts/46/supplemental/language_plural_rules.html +// https://translate.codeberg.org/languages/$LANGUAGE_CODE/#information +// https://github.com/WeblateOrg/language-data/blob/main/languages.csv +// Note that in some cases there is ambiguity about the correct form for a given language. In this case, ask the locale's translators. + +package translation + +import ( + "strings" + + "forgejo.org/modules/log" + "forgejo.org/modules/translation/i18n" +) + +// The constants refer to indices below in `PluralRules` and also in i18n.js, keep them in sync! +const ( + PluralRuleDefault = 0 + PluralRuleBengali = 1 + PluralRuleIcelandic = 2 + PluralRuleFilipino = 3 + PluralRuleOneForm = 4 + PluralRuleCzech = 5 + PluralRuleRussian = 6 + PluralRulePolish = 7 + PluralRuleLatvian = 8 + PluralRuleLithuanian = 9 + PluralRuleFrench = 10 + PluralRuleCatalan = 11 + PluralRuleSlovenian = 12 + PluralRuleArabic = 13 +) + +func GetPluralRuleImpl(langName string) int { + // First, check for languages with country-specific plural rules. + switch langName { + case "pt-BR": + return PluralRuleFrench + + case "pt-PT": + return PluralRuleCatalan + + default: + break + } + + // Remove the country portion of the locale name. + langName = strings.Split(strings.Split(langName, "_")[0], "-")[0] + + // When adding a new language not in the list, add its plural rule definition here. + switch langName { + case "en", "aa", "ab", "abr", "ada", "ae", "aeb", "af", "afh", "aii", "ain", "akk", "ale", "aln", "alt", "ami", "an", "ang", "anp", "apc", "arc", "arp", "arq", "arw", "arz", "asa", "ast", "av", "avk", "awa", "ayc", "az", "azb", "ba", "bal", "ban", "bar", "bas", "bbc", "bci", "bej", "bem", "ber", "bew", "bez", "bg", "bgc", "bgn", "bhb", "bhi", "bi", "bik", "bin", "bjj", "bjn", "bla", "bnt", "bqi", "bra", "brb", "brh", "brx", "bua", "bug", "bum", "byn", "cad", "cak", "car", "ce", "cgg", "ch", "chb", "chg", "chk", "chm", "chn", "cho", "chp", "chr", "chy", "ckb", "co", "cop", "cpe", "cpf", "cr", "crp", "cu", "cv", "da", "dak", "dar", "dcc", "de", "del", "den", "dgr", "din", "dje", "dnj", "dnk", "dru", "dry", "dua", "dum", "dv", "dyu", "ee", "efi", "egl", "egy", "eka", "el", "elx", "enm", "eo", "et", "eu", "ewo", "ext", "fan", "fat", "fbl", "ffm", "fi", "fj", "fo", "fon", "frk", "frm", "fro", "frr", "frs", "fuq", "fur", "fuv", "fvr", "fy", "gaa", "gay", "gba", "gbm", "gez", "gil", "gl", "glk", "gmh", "gn", "goh", "gom", "gon", "gor", "got", "grb", "gsw", "guc", "gum", "gur", "guz", "gwi", "ha", "hai", "haw", "haz", "hil", "hit", "hmn", "hnd", "hne", "hno", "ho", "hoc", "hoj", "hrx", "ht", "hu", "hup", "hus", "hz", "ia", "iba", "ibb", "ie", "ik", "ilo", "inh", "io", "jam", "jgo", "jmc", "jpr", "jrb", "ka", "kaa", "kac", "kaj", "kam", "kaw", "kbd", "kcg", "kfr", "kfy", "kg", "kha", "khn", "kho", "ki", "kj", "kk", "kkj", "kl", "kln", "kmb", "kmr", "kok", "kpe", "kr", "krc", "kri", "krl", "kru", "ks", "ksb", "ku", "kum", "kut", "kv", "kxm", "ky", "la", "lad", "laj", "lam", "lb", "lez", "lfn", "lg", "li", "lij", "ljp", "lki", "lmn", "lmo", "lol", "loz", "lrc", "lu", "lua", "lui", "lun", "luo", "lus", "luy", "luz", "mad", "mag", "mai", "mak", "man", "mas", "mdf", "mdh", "mdr", "men", "mer", "mfa", "mga", "mgh", "mgo", "mh", "mhr", "mic", "min", "mjw", "ml", "mn", "mnc", "mni", "mnw", "moe", "moh", "mos", "mr", "mrh", "mtr", "mus", "mwk", "mwl", "mwr", "mxc", "myv", "myx", "mzn", "na", "nah", "nap", "nb", "nd", "ndc", "nds", "ne", "new", "ng", "ngl", "nia", "nij", "niu", "nl", "nn", "nnh", "nod", "noe", "nog", "non", "nr", "nuk", "nv", "nwc", "ny", "nym", "nyn", "nyo", "nzi", "oj", "om", "or", "os", "ota", "otk", "ovd", "pag", "pal", "pam", "pap", "pau", "pbb", "pdt", "peo", "phn", "pi", "pms", "pon", "pro", "ps", "pwn", "qu", "quc", "qug", "qya", "raj", "rap", "rar", "rcf", "rej", "rhg", "rif", "rkt", "rm", "rmt", "rn", "rng", "rof", "rom", "rue", "rup", "rw", "rwk", "sad", "sai", "sam", "saq", "sas", "sc", "sck", "sco", "sd", "sdh", "sef", "seh", "sel", "sga", "sgn", "sgs", "shn", "sid", "sjd", "skr", "sm", "sml", "sn", "snk", "so", "sog", "sou", "sq", "srn", "srr", "ss", "ssy", "st", "suk", "sus", "sux", "sv", "sw", "swg", "swv", "sxu", "syc", "syl", "syr", "szy", "ta", "tay", "tcy", "te", "tem", "teo", "ter", "tet", "tig", "tiv", "tk", "tkl", "tli", "tly", "tmh", "tn", "tog", "tr", "trv", "ts", "tsg", "tsi", "tsj", "tts", "tum", "tvl", "tw", "ty", "tyv", "tzj", "tzl", "udm", "ug", "uga", "umb", "und", "unr", "ur", "uz", "vai", "ve", "vls", "vmf", "vmw", "vo", "vot", "vro", "vun", "wae", "wal", "war", "was", "wbq", "wbr", "wep", "wtm", "xal", "xh", "xnr", "xog", "yao", "yap", "yi", "yua", "za", "zap", "zbl", "zen", "zgh", "zun", "zza": + return PluralRuleDefault + + case "ach", "ady", "ak", "am", "arn", "as", "bh", "bho", "bn", "csw", "doi", "fa", "ff", "frc", "frp", "gu", "gug", "gun", "guw", "hi", "hy", "kab", "kn", "ln", "mfe", "mg", "mi", "mia", "nso", "oc", "pa", "pcm", "pt", "qdt", "qtp", "si", "tg", "ti", "wa", "zu": + return PluralRuleBengali + + case "is": + return PluralRuleIcelandic + + case "fil": + return PluralRuleFilipino + + case "ace", "ay", "bm", "bo", "cdo", "cpx", "crh", "dz", "gan", "hak", "hnj", "hsn", "id", "ig", "ii", "ja", "jbo", "jv", "kde", "kea", "km", "ko", "kos", "lkt", "lo", "lzh", "ms", "my", "nan", "nqo", "osa", "sah", "ses", "sg", "son", "su", "th", "tlh", "to", "tok", "tpi", "tt", "vi", "wo", "wuu", "yo", "yue", "zh": + return PluralRuleOneForm + + case "cpp", "cs", "sk": + return PluralRuleCzech + + case "be", "bs", "cnr", "hr", "ru", "sr", "uk", "wen": + return PluralRuleRussian + + case "csb", "pl", "szl": + return PluralRulePolish + + case "lv", "prg": + return PluralRuleLatvian + + case "lt": + return PluralRuleLithuanian + + case "fr": + return PluralRuleFrench + + case "ca", "es", "it": + return PluralRuleCatalan + + case "sl": + return PluralRuleSlovenian + + case "ar": + return PluralRuleArabic + + default: + break + } + + log.Error("No plural rule defined for language %s", langName) + return PluralRuleDefault +} + +var PluralRules = []i18n.PluralFormRule{ + // [ 0] Common 2-form, e.g. English, German + func(n int64) i18n.PluralFormIndex { + if n != 1 { + return i18n.PluralFormOther + } + return i18n.PluralFormOne + }, + + // [ 1] Bengali + func(n int64) i18n.PluralFormIndex { + if n > 1 { + return i18n.PluralFormOther + } + return i18n.PluralFormOne + }, + + // [ 2] Icelandic + func(n int64) i18n.PluralFormIndex { + if n%10 != 1 || n%100 == 11 { + return i18n.PluralFormOther + } + return i18n.PluralFormOne + }, + + // [ 3] Filipino + func(n int64) i18n.PluralFormIndex { + if n != 1 && n != 2 && n != 3 && (n%10 == 4 || n%10 == 6 || n%10 == 9) { + return i18n.PluralFormOther + } + return i18n.PluralFormOne + }, + + // [ 4] OneForm + func(n int64) i18n.PluralFormIndex { + return i18n.PluralFormOther + }, + + // [ 5] Czech + func(n int64) i18n.PluralFormIndex { + if n == 1 { + return i18n.PluralFormOne + } + if n >= 2 && n <= 4 { + return i18n.PluralFormFew + } + return i18n.PluralFormOther + }, + + // [ 6] Russian + func(n int64) i18n.PluralFormIndex { + if n%10 == 1 && n%100 != 11 { + return i18n.PluralFormOne + } + if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) { + return i18n.PluralFormFew + } + return i18n.PluralFormMany + }, + + // [ 7] Polish + func(n int64) i18n.PluralFormIndex { + if n == 1 { + return i18n.PluralFormOne + } + if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) { + return i18n.PluralFormFew + } + return i18n.PluralFormMany + }, + + // [ 8] Latvian + func(n int64) i18n.PluralFormIndex { + if n%10 == 0 || n%100 >= 11 && n%100 <= 19 { + return i18n.PluralFormZero + } + if n%10 == 1 && n%100 != 11 { + return i18n.PluralFormOne + } + return i18n.PluralFormOther + }, + + // [ 9] Lithuanian + func(n int64) i18n.PluralFormIndex { + if n%10 == 1 && (n%100 < 11 || n%100 > 19) { + return i18n.PluralFormOne + } + if n%10 >= 2 && n%10 <= 9 && (n%100 < 11 || n%100 > 19) { + return i18n.PluralFormFew + } + return i18n.PluralFormMany + }, + + // [10] French + func(n int64) i18n.PluralFormIndex { + if n == 0 || n == 1 { + return i18n.PluralFormOne + } + if n != 0 && n%1000000 == 0 { + return i18n.PluralFormMany + } + return i18n.PluralFormOther + }, + + // [11] Catalan + func(n int64) i18n.PluralFormIndex { + if n == 1 { + return i18n.PluralFormOne + } + if n != 0 && n%1000000 == 0 { + return i18n.PluralFormMany + } + return i18n.PluralFormOther + }, + + // [12] Slovenian + func(n int64) i18n.PluralFormIndex { + if n%100 == 1 { + return i18n.PluralFormOne + } + if n%100 == 2 { + return i18n.PluralFormTwo + } + if n%100 == 3 || n%100 == 4 { + return i18n.PluralFormFew + } + return i18n.PluralFormOther + }, + + // [13] Arabic + func(n int64) i18n.PluralFormIndex { + if n == 0 { + return i18n.PluralFormZero + } + if n == 1 { + return i18n.PluralFormOne + } + if n == 2 { + return i18n.PluralFormTwo + } + if n%100 >= 3 && n%100 <= 10 { + return i18n.PluralFormFew + } + if n%100 >= 11 { + return i18n.PluralFormMany + } + return i18n.PluralFormOther + }, +} diff --git a/modules/translation/translation.go b/modules/translation/translation.go index 16eb55e28e..1b763764f1 100644 --- a/modules/translation/translation.go +++ b/modules/translation/translation.go @@ -10,11 +10,11 @@ import ( "strings" "sync" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/options" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/translation/i18n" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/log" + "forgejo.org/modules/options" + "forgejo.org/modules/setting" + "forgejo.org/modules/translation/i18n" + "forgejo.org/modules/util" "github.com/dustin/go-humanize" "golang.org/x/text/language" @@ -32,10 +32,15 @@ type Locale interface { TrString(string, ...any) string Tr(key string, args ...any) template.HTML + // New-style pluralized strings + TrPluralString(count any, trKey string, trArgs ...any) template.HTML + // Old-style pseudo-pluralized strings, deprecated TrN(cnt any, key1, keyN string, args ...any) template.HTML TrSize(size int64) ReadableSize + HasKey(trKey string) bool + PrettyNumber(v any) string } @@ -100,8 +105,17 @@ func InitLocales(ctx context.Context) { } key := "locale_" + setting.Langs[i] + ".ini" - if err = i18n.DefaultLocales.AddLocaleByIni(setting.Langs[i], setting.Names[i], localeDataBase, localeData[key]); err != nil { - log.Error("Failed to set messages to %s: %v", setting.Langs[i], err) + if err = i18n.DefaultLocales.AddLocaleByIni(setting.Langs[i], setting.Names[i], PluralRules[GetPluralRuleImpl(setting.Langs[i])], localeDataBase, localeData[key]); err != nil { + log.Error("Failed to set old-style messages to %s: %v", setting.Langs[i], err) + } + + key = "locale_next/locale_" + setting.Langs[i] + ".json" + if bytes, err := options.AssetFS().ReadFile(key); err == nil { + if err = i18n.DefaultLocales.AddToLocaleFromJSON(setting.Langs[i], bytes); err != nil { + log.Error("Failed to add new-style messages to %s: %v", setting.Langs[i], err) + } + } else { + log.Error("Failed to open new-style messages for %s: %v", setting.Langs[i], err) } } if len(setting.Langs) != 0 { @@ -160,6 +174,16 @@ func NewLocale(lang string) Locale { defer lock.RUnlock() } + if lang == "dummy" { + l := &locale{ + Locale: &i18n.KeyLocale{}, + Lang: lang, + LangName: lang, + msgPrinter: message.NewPrinter(language.English), + } + return l + } + langName := "unknown" if l, ok := allLangMap[lang]; ok { langName = l.Name diff --git a/modules/translation/translation_test.go b/modules/translation/translation_test.go index bffbb155ca..356b85f946 100644 --- a/modules/translation/translation_test.go +++ b/modules/translation/translation_test.go @@ -8,7 +8,7 @@ package translation import ( "testing" - "code.gitea.io/gitea/modules/translation/i18n" + "forgejo.org/modules/translation/i18n" "github.com/stretchr/testify/assert" ) @@ -48,3 +48,111 @@ func TestPrettyNumber(t *testing.T) { assert.EqualValues(t, "1,000,000", l.PrettyNumber(1000000)) assert.EqualValues(t, "1,000,000.1", l.PrettyNumber(1000000.1)) } + +func TestGetPluralRule(t *testing.T) { + assert.Equal(t, PluralRuleDefault, GetPluralRuleImpl("en")) + assert.Equal(t, PluralRuleDefault, GetPluralRuleImpl("en-US")) + assert.Equal(t, PluralRuleDefault, GetPluralRuleImpl("en_UK")) + assert.Equal(t, PluralRuleDefault, GetPluralRuleImpl("nds")) + assert.Equal(t, PluralRuleDefault, GetPluralRuleImpl("de-DE")) + + assert.Equal(t, PluralRuleOneForm, GetPluralRuleImpl("zh")) + assert.Equal(t, PluralRuleOneForm, GetPluralRuleImpl("ja")) + + assert.Equal(t, PluralRuleBengali, GetPluralRuleImpl("bn")) + + assert.Equal(t, PluralRuleIcelandic, GetPluralRuleImpl("is")) + + assert.Equal(t, PluralRuleFilipino, GetPluralRuleImpl("fil")) + + assert.Equal(t, PluralRuleCzech, GetPluralRuleImpl("cs")) + + assert.Equal(t, PluralRuleRussian, GetPluralRuleImpl("ru")) + + assert.Equal(t, PluralRulePolish, GetPluralRuleImpl("pl")) + + assert.Equal(t, PluralRuleLatvian, GetPluralRuleImpl("lv")) + + assert.Equal(t, PluralRuleLithuanian, GetPluralRuleImpl("lt")) + + assert.Equal(t, PluralRuleFrench, GetPluralRuleImpl("fr")) + + assert.Equal(t, PluralRuleCatalan, GetPluralRuleImpl("ca")) + + assert.Equal(t, PluralRuleSlovenian, GetPluralRuleImpl("sl")) + + assert.Equal(t, PluralRuleArabic, GetPluralRuleImpl("ar")) + + assert.Equal(t, PluralRuleCatalan, GetPluralRuleImpl("pt-PT")) + assert.Equal(t, PluralRuleFrench, GetPluralRuleImpl("pt-BR")) + + assert.Equal(t, PluralRuleDefault, GetPluralRuleImpl("invalid")) +} + +func TestApplyPluralRule(t *testing.T) { + testCases := []struct { + expect i18n.PluralFormIndex + pluralRule int + values []int64 + }{ + {i18n.PluralFormOne, PluralRuleDefault, []int64{1}}, + {i18n.PluralFormOther, PluralRuleDefault, []int64{0, 2, 10, 256}}, + + {i18n.PluralFormOther, PluralRuleOneForm, []int64{0, 1, 2}}, + + {i18n.PluralFormOne, PluralRuleBengali, []int64{0, 1}}, + {i18n.PluralFormOther, PluralRuleBengali, []int64{2, 10, 256}}, + + {i18n.PluralFormOne, PluralRuleIcelandic, []int64{1, 21, 31}}, + {i18n.PluralFormOther, PluralRuleIcelandic, []int64{0, 2, 11, 15, 256}}, + + {i18n.PluralFormOne, PluralRuleFilipino, []int64{0, 1, 2, 3, 5, 7, 8, 10, 11, 12, 257}}, + {i18n.PluralFormOther, PluralRuleFilipino, []int64{4, 6, 9, 14, 16, 19, 256}}, + + {i18n.PluralFormOne, PluralRuleCzech, []int64{1}}, + {i18n.PluralFormFew, PluralRuleCzech, []int64{2, 3, 4}}, + {i18n.PluralFormOther, PluralRuleCzech, []int64{5, 0, 12, 78, 254}}, + + {i18n.PluralFormOne, PluralRuleRussian, []int64{1, 21, 31}}, + {i18n.PluralFormFew, PluralRuleRussian, []int64{2, 23, 34}}, + {i18n.PluralFormMany, PluralRuleRussian, []int64{0, 5, 11, 37, 111, 256}}, + + {i18n.PluralFormOne, PluralRulePolish, []int64{1}}, + {i18n.PluralFormFew, PluralRulePolish, []int64{2, 23, 34}}, + {i18n.PluralFormMany, PluralRulePolish, []int64{0, 5, 11, 21, 37, 256}}, + + {i18n.PluralFormZero, PluralRuleLatvian, []int64{0, 10, 11, 17}}, + {i18n.PluralFormOne, PluralRuleLatvian, []int64{1, 21, 71}}, + {i18n.PluralFormOther, PluralRuleLatvian, []int64{2, 7, 22, 23, 256}}, + + {i18n.PluralFormOne, PluralRuleLithuanian, []int64{1, 21, 31}}, + {i18n.PluralFormFew, PluralRuleLithuanian, []int64{2, 5, 9, 23, 34, 256}}, + {i18n.PluralFormMany, PluralRuleLithuanian, []int64{0, 10, 11, 18}}, + + {i18n.PluralFormOne, PluralRuleFrench, []int64{0, 1}}, + {i18n.PluralFormMany, PluralRuleFrench, []int64{1000000, 2000000}}, + {i18n.PluralFormOther, PluralRuleFrench, []int64{2, 4, 10, 256}}, + + {i18n.PluralFormOne, PluralRuleCatalan, []int64{1}}, + {i18n.PluralFormMany, PluralRuleCatalan, []int64{1000000, 2000000}}, + {i18n.PluralFormOther, PluralRuleCatalan, []int64{0, 2, 4, 10, 256}}, + + {i18n.PluralFormOne, PluralRuleSlovenian, []int64{1, 101, 201, 501}}, + {i18n.PluralFormTwo, PluralRuleSlovenian, []int64{2, 102, 202, 502}}, + {i18n.PluralFormFew, PluralRuleSlovenian, []int64{3, 103, 203, 503, 4, 104, 204, 504}}, + {i18n.PluralFormOther, PluralRuleSlovenian, []int64{0, 5, 11, 12, 20, 256}}, + + {i18n.PluralFormZero, PluralRuleArabic, []int64{0}}, + {i18n.PluralFormOne, PluralRuleArabic, []int64{1}}, + {i18n.PluralFormTwo, PluralRuleArabic, []int64{2}}, + {i18n.PluralFormFew, PluralRuleArabic, []int64{3, 4, 9, 10, 103, 104}}, + {i18n.PluralFormMany, PluralRuleArabic, []int64{11, 12, 13, 14, 17, 111, 256}}, + {i18n.PluralFormOther, PluralRuleArabic, []int64{100, 101, 102}}, + } + + for _, tc := range testCases { + for _, n := range tc.values { + assert.Equal(t, tc.expect, PluralRules[tc.pluralRule](n), "Testcase for plural rule %d, value %d", tc.pluralRule, n) + } + } +} diff --git a/modules/turnstile/turnstile.go b/modules/turnstile/turnstile.go index 38d0233446..31ba256195 100644 --- a/modules/turnstile/turnstile.go +++ b/modules/turnstile/turnstile.go @@ -11,8 +11,8 @@ import ( "net/url" "strings" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/json" + "forgejo.org/modules/setting" ) // Response is the structure of JSON returned from API diff --git a/modules/typesniffer/typesniffer.go b/modules/typesniffer/typesniffer.go index 6aec5c285e..a8fc70e54c 100644 --- a/modules/typesniffer/typesniffer.go +++ b/modules/typesniffer/typesniffer.go @@ -11,7 +11,7 @@ import ( "regexp" "strings" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/util" ) // Use at most this many bytes to determine Content Type. @@ -20,6 +20,8 @@ const sniffLen = 1024 const ( // SvgMimeType MIME type of SVG images. SvgMimeType = "image/svg+xml" + // AvifMimeType MIME type of AVIF images + AvifMimeType = "image/avif" // ApplicationOctetStream MIME type of binary files. ApplicationOctetStream = "application/octet-stream" ) @@ -106,6 +108,12 @@ func DetectContentType(data []byte) SniffedType { } } + // AVIF is unsupported by http.DetectContentType + // Signature taken from https://stackoverflow.com/a/68322450 + if bytes.Index(data, []byte("ftypavif")) == 4 { + ct = AvifMimeType + } + if strings.HasPrefix(ct, "audio/") && bytes.HasPrefix(data, []byte("ID3")) { // The MP3 detection is quite inaccurate, any content with "ID3" prefix will result in "audio/mpeg". // So remove the "ID3" prefix and detect again, if result is text, then it must be text content. diff --git a/modules/typesniffer/typesniffer_test.go b/modules/typesniffer/typesniffer_test.go index f6fa07ee7f..8d80b4ddb4 100644 --- a/modules/typesniffer/typesniffer_test.go +++ b/modules/typesniffer/typesniffer_test.go @@ -135,3 +135,13 @@ func TestDetectContentTypeOgg(t *testing.T) { require.NoError(t, err) assert.True(t, st.IsVideo()) } + +func TestDetectContentTypeAvif(t *testing.T) { + avifImage, err := hex.DecodeString("000000206674797061766966") + require.NoError(t, err) + + st, err := DetectContentTypeFromReader(bytes.NewReader(avifImage)) + require.NoError(t, err) + + assert.True(t, st.IsImage()) +} diff --git a/modules/updatechecker/update_checker.go b/modules/updatechecker/update_checker.go index 0c93f08d21..b0932ba663 100644 --- a/modules/updatechecker/update_checker.go +++ b/modules/updatechecker/update_checker.go @@ -11,10 +11,10 @@ import ( "net/http" "strings" - "code.gitea.io/gitea/modules/json" - "code.gitea.io/gitea/modules/proxy" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/system" + "forgejo.org/modules/json" + "forgejo.org/modules/proxy" + "forgejo.org/modules/setting" + "forgejo.org/modules/system" "github.com/hashicorp/go-version" ) diff --git a/modules/user/user.go b/modules/user/user.go index eee401a23f..d153413c70 100644 --- a/modules/user/user.go +++ b/modules/user/user.go @@ -6,8 +6,6 @@ package user import ( "os" "os/user" - "runtime" - "strings" ) // CurrentUsername return current login OS user name @@ -16,12 +14,7 @@ func CurrentUsername() string { if err != nil { return fallbackCurrentUsername() } - username := userinfo.Username - if runtime.GOOS == "windows" { - parts := strings.Split(username, "\\") - username = parts[len(parts)-1] - } - return username + return userinfo.Username } // Old method, used if new method doesn't work on your OS for some reason diff --git a/modules/user/user_test.go b/modules/user/user_test.go index 372a675d34..c7eff85c90 100644 --- a/modules/user/user_test.go +++ b/modules/user/user_test.go @@ -5,7 +5,6 @@ package user import ( "os/exec" - "runtime" "strings" "testing" ) @@ -23,10 +22,6 @@ func TestCurrentUsername(t *testing.T) { if len(user) == 0 { t.Errorf("expected non-empty user, got: %s", user) } - // Windows whoami is weird, so just skip remaining tests - if runtime.GOOS == "windows" { - t.Skip("skipped test because of weird whoami on Windows") - } whoami, err := getWhoamiOutput() if err != nil { t.Errorf("failed to run whoami to test current user: %f", err) diff --git a/modules/util/file_unix.go b/modules/util/file_unix.go index 79a29c8b3b..b722eee97d 100644 --- a/modules/util/file_unix.go +++ b/modules/util/file_unix.go @@ -1,8 +1,6 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -//go:build !windows - package util import ( diff --git a/modules/util/file_unix_test.go b/modules/util/file_unix_test.go index d60082a034..228c64f980 100644 --- a/modules/util/file_unix_test.go +++ b/modules/util/file_unix_test.go @@ -1,8 +1,6 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -//go:build !windows - package util import ( diff --git a/modules/util/file_windows.go b/modules/util/file_windows.go deleted file mode 100644 index 77a33d3c49..0000000000 --- a/modules/util/file_windows.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2022 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -//go:build windows - -package util - -import ( - "os" -) - -func ApplyUmask(f string, newMode os.FileMode) error { - // do nothing for Windows, because Windows doesn't use umask - return nil -} diff --git a/modules/util/keypair_test.go b/modules/util/keypair_test.go index ec9bca7efa..6c05db779a 100644 --- a/modules/util/keypair_test.go +++ b/modules/util/keypair_test.go @@ -10,7 +10,6 @@ import ( "crypto/sha256" "crypto/x509" "encoding/pem" - "regexp" "testing" "github.com/stretchr/testify/assert" @@ -24,8 +23,8 @@ func TestKeygen(t *testing.T) { assert.NotEmpty(t, priv) assert.NotEmpty(t, pub) - assert.Regexp(t, regexp.MustCompile("^-----BEGIN RSA PRIVATE KEY-----.*"), priv) - assert.Regexp(t, regexp.MustCompile("^-----BEGIN PUBLIC KEY-----.*"), pub) + assert.Regexp(t, "^-----BEGIN RSA PRIVATE KEY-----.*", priv) + assert.Regexp(t, "^-----BEGIN PUBLIC KEY-----.*", pub) } func TestSignUsingKeys(t *testing.T) { diff --git a/modules/util/path.go b/modules/util/path.go index 185e7cf882..9039f27cbf 100644 --- a/modules/util/path.go +++ b/modules/util/path.go @@ -10,8 +10,6 @@ import ( "os" "path" "path/filepath" - "regexp" - "runtime" "strings" ) @@ -78,11 +76,7 @@ func FilePathJoinAbs(base string, sub ...string) string { // POSIX filesystem can have `\` in file names. Windows: `\` and `/` are both used for path separators // to keep the behavior consistent, we do not allow `\` in file names, replace all `\` with `/` - if isOSWindows() { - elems[0] = filepath.Clean(base) - } else { - elems[0] = filepath.Clean(strings.ReplaceAll(base, "\\", pathSeparator)) - } + elems[0] = filepath.Clean(strings.ReplaceAll(base, "\\", pathSeparator)) if !filepath.IsAbs(elems[0]) { // This shouldn't happen. If there is really necessary to pass in relative path, return the full path with filepath.Abs() instead panic(fmt.Sprintf("FilePathJoinAbs: %q (for path %v) is not absolute, do not guess a relative path based on current working directory", elems[0], elems)) @@ -91,11 +85,7 @@ func FilePathJoinAbs(base string, sub ...string) string { if s == "" { continue } - if isOSWindows() { - elems = append(elems, filepath.Clean(pathSeparator+s)) - } else { - elems = append(elems, filepath.Clean(pathSeparator+strings.ReplaceAll(s, "\\", pathSeparator))) - } + elems = append(elems, filepath.Clean(pathSeparator+strings.ReplaceAll(s, "\\", pathSeparator))) } // the elems[0] must be an absolute path, just join them together return filepath.Join(elems...) @@ -217,12 +207,6 @@ func StatDir(rootPath string, includeDir ...bool) ([]string, error) { return statDir(rootPath, "", isIncludeDir, false, false) } -func isOSWindows() bool { - return runtime.GOOS == "windows" -} - -var driveLetterRegexp = regexp.MustCompile("/[A-Za-z]:/") - // FileURLToPath extracts the path information from a file://... url. // It returns an error only if the URL is not a file URL. func FileURLToPath(u *url.URL) (string, error) { @@ -230,17 +214,7 @@ func FileURLToPath(u *url.URL) (string, error) { return "", errors.New("URL scheme is not 'file': " + u.String()) } - path := u.Path - - if !isOSWindows() { - return path, nil - } - - // If it looks like there's a Windows drive letter at the beginning, strip off the leading slash. - if driveLetterRegexp.MatchString(path) { - return path[1:], nil - } - return path, nil + return u.Path, nil } // HomeDir returns path of '~'(in Linux) on Windows, @@ -249,14 +223,7 @@ func HomeDir() (home string, err error) { // TODO: some users run Gitea with mismatched uid and "HOME=xxx" (they set HOME=xxx by environment manually) // TODO: when running gitea as a sub command inside git, the HOME directory is not the user's home directory // so at the moment we can not use `user.Current().HomeDir` - if isOSWindows() { - home = os.Getenv("USERPROFILE") - if home == "" { - home = os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") - } - } else { - home = os.Getenv("HOME") - } + home = os.Getenv("HOME") if home == "" { return "", errors.New("cannot get home directory") diff --git a/modules/util/path_test.go b/modules/util/path_test.go index 3699f052d1..b912b76f6e 100644 --- a/modules/util/path_test.go +++ b/modules/util/path_test.go @@ -5,7 +5,6 @@ package util import ( "net/url" - "runtime" "testing" "github.com/stretchr/testify/assert" @@ -17,7 +16,6 @@ func TestFileURLToPath(t *testing.T) { url string expected string haserror bool - windows bool }{ // case 0 { @@ -34,18 +32,9 @@ func TestFileURLToPath(t *testing.T) { url: "file:///path", expected: "/path", }, - // case 3 - { - url: "file:///C:/path", - expected: "C:/path", - windows: true, - }, } for n, c := range cases { - if c.windows && runtime.GOOS != "windows" { - continue - } u, _ := url.Parse(c.url) p, err := FileURLToPath(u) if c.haserror { @@ -177,35 +166,18 @@ func TestCleanPath(t *testing.T) { assert.Equal(t, c.expected, PathJoinRelX(c.elems...), "case: %v", c.elems) } - // for POSIX only, but the result is similar on Windows, because the first element must be an absolute path - if isOSWindows() { - cases = []struct { - elems []string - expected string - }{ - {[]string{`C:\..`}, `C:\`}, - {[]string{`C:\a`}, `C:\a`}, - {[]string{`C:\a/`}, `C:\a`}, - {[]string{`C:\..\a\`, `../b`, `c\..`, `d`}, `C:\a\b\d`}, - {[]string{`C:\a/..\b`}, `C:\b`}, - {[]string{`C:\a`, ``, `b`}, `C:\a\b`}, - {[]string{`C:\a`, `..`, `b`}, `C:\a\b`}, - {[]string{`C:\lfs`, `repo/..`, `user/../path`}, `C:\lfs\path`}, - } - } else { - cases = []struct { - elems []string - expected string - }{ - {[]string{`/..`}, `/`}, - {[]string{`/a`}, `/a`}, - {[]string{`/a/`}, `/a`}, - {[]string{`/../a/`, `../b`, `c/..`, `d`}, `/a/b/d`}, - {[]string{`/a\..\b`}, `/b`}, - {[]string{`/a`, ``, `b`}, `/a/b`}, - {[]string{`/a`, `..`, `b`}, `/a/b`}, - {[]string{`/lfs`, `repo/..`, `user/../path`}, `/lfs/path`}, - } + cases = []struct { + elems []string + expected string + }{ + {[]string{`/..`}, `/`}, + {[]string{`/a`}, `/a`}, + {[]string{`/a/`}, `/a`}, + {[]string{`/../a/`, `../b`, `c/..`, `d`}, `/a/b/d`}, + {[]string{`/a\..\b`}, `/b`}, + {[]string{`/a`, ``, `b`}, `/a/b`}, + {[]string{`/a`, `..`, `b`}, `/a/b`}, + {[]string{`/lfs`, `repo/..`, `user/../path`}, `/lfs/path`}, } for _, c := range cases { assert.Equal(t, c.expected, FilePathJoinAbs(c.elems[0], c.elems[1:]...), "case: %v", c.elems) diff --git a/modules/util/remove.go b/modules/util/remove.go index d1e38faf5f..b07a48bee4 100644 --- a/modules/util/remove.go +++ b/modules/util/remove.go @@ -4,14 +4,13 @@ package util import ( + "io/fs" "os" - "runtime" + "path/filepath" "syscall" "time" ) -const windowsSharingViolationError syscall.Errno = 32 - // Remove removes the named file or (empty) directory with at most 5 attempts. func Remove(name string) error { var err error @@ -27,12 +26,6 @@ func Remove(name string) error { continue } - if unwrapped == windowsSharingViolationError && runtime.GOOS == "windows" { - // try again - <-time.After(100 * time.Millisecond) - continue - } - if unwrapped == syscall.ENOENT { // it's already gone return nil @@ -41,10 +34,48 @@ func Remove(name string) error { return err } -// RemoveAll removes the named file or (empty) directory with at most 5 attempts. +// MakeWritable recursively makes the named directory writable. +func MakeWritable(name string) error { + return filepath.WalkDir(name, func(path string, d fs.DirEntry, err error) error { + // NB: this is called WalkDir but it works on a single file too + if err == nil { + info, err := d.Info() + if err != nil { + return err + } + + // Don't try chmod'ing symlinks (will fail with broken symlinks) + if info.Mode()&os.ModeSymlink != os.ModeSymlink { + // 0200 == u+w, in octal unix permission notation + err = os.Chmod(path, info.Mode()|0o200) + if err != nil { + return err + } + } + } + return nil + }) +} + +// RemoveAll removes the named file or directory with at most 5 attempts. func RemoveAll(name string) error { var err error + for i := 0; i < 5; i++ { + // Do chmod -R +w to help ensure the removal succeeds. + // In particular, in the git-annex case, this handles + // https://git-annex.branchable.com/internals/lockdown/ : + // + // > (The only bad consequence of this is that rm -rf .git + // > doesn't work unless you first run chmod -R +w .git) + + err = MakeWritable(name) + if err != nil { + // try again + <-time.After(100 * time.Millisecond) + continue + } + err = os.RemoveAll(name) if err == nil { break @@ -56,12 +87,6 @@ func RemoveAll(name string) error { continue } - if unwrapped == windowsSharingViolationError && runtime.GOOS == "windows" { - // try again - <-time.After(100 * time.Millisecond) - continue - } - if unwrapped == syscall.ENOENT { // it's already gone return nil @@ -85,12 +110,6 @@ func Rename(oldpath, newpath string) error { continue } - if unwrapped == windowsSharingViolationError && runtime.GOOS == "windows" { - // try again - <-time.After(100 * time.Millisecond) - continue - } - if i == 0 && os.IsNotExist(err) { return err } diff --git a/modules/util/rotatingfilewriter/writer.go b/modules/util/rotatingfilewriter/writer.go index c595f49c49..ff234eea93 100644 --- a/modules/util/rotatingfilewriter/writer.go +++ b/modules/util/rotatingfilewriter/writer.go @@ -14,8 +14,8 @@ import ( "sync" "time" - "code.gitea.io/gitea/modules/graceful/releasereopen" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/graceful/releasereopen" + "forgejo.org/modules/util" ) type Options struct { diff --git a/modules/util/slice.go b/modules/util/slice.go index 9c878c24be..80c8e62f6f 100644 --- a/modules/util/slice.go +++ b/modules/util/slice.go @@ -4,7 +4,6 @@ package util import ( - "cmp" "slices" "strings" ) @@ -47,13 +46,6 @@ func SliceRemoveAll[T comparable](slice []T, target T) []T { return slices.DeleteFunc(slice, func(t T) bool { return t == target }) } -// Sorted returns the sorted slice -// Note: The parameter is sorted inline. -func Sorted[S ~[]E, E cmp.Ordered](values S) S { - slices.Sort(values) - return values -} - // TODO: Replace with "maps.Values" once available, current it only in golang.org/x/exp/maps but not in standard library func ValuesOfMap[K comparable, V any](m map[K]V) []V { values := make([]V, 0, len(m)) diff --git a/modules/util/truncate.go b/modules/util/truncate.go index 77b116eeff..f2edbdc673 100644 --- a/modules/util/truncate.go +++ b/modules/util/truncate.go @@ -41,6 +41,8 @@ func SplitStringAtByteN(input string, n int) (left, right string) { // SplitTrimSpace splits the string at given separator and trims leading and trailing space func SplitTrimSpace(input, sep string) []string { + // Trim initial leading & trailing space + input = strings.TrimSpace(input) // replace CRLF with LF input = strings.ReplaceAll(input, "\r\n", "\n") diff --git a/modules/util/util.go b/modules/util/util.go index 0444680228..da405c9c4b 100644 --- a/modules/util/util.go +++ b/modules/util/util.go @@ -14,7 +14,7 @@ import ( "strconv" "strings" - "code.gitea.io/gitea/modules/optional" + "forgejo.org/modules/optional" "golang.org/x/crypto/ssh" "golang.org/x/text/cases" @@ -225,6 +225,34 @@ func Iif[T any](condition bool, trueVal, falseVal T) T { return falseVal } +// IfZero returns "def" if "v" is a zero value, otherwise "v" +func IfZero[T comparable](v, def T) T { + var zero T + if v == zero { + return def + } + return v +} + +// OptionalArg helps the "optional argument" in Golang: +// +// func foo(optArg ...int) { return OptionalArg(optArg) } +// calling `foo()` gets zero value 0, calling `foo(100)` gets 100 +// func bar(optArg ...int) { return OptionalArg(optArg, 42) } +// calling `bar()` gets default value 42, calling `bar(100)` gets 100 +// +// Passing more than 1 item to `optArg` or `defaultValue` is undefined behavior. +// At the moment only the first item is used. +func OptionalArg[T any](optArg []T, defaultValue ...T) (ret T) { + if len(optArg) >= 1 { + return optArg[0] + } + if len(defaultValue) >= 1 { + return defaultValue[0] + } + return ret +} + func ReserveLineBreakForTextarea(input string) string { // Since the content is from a form which is a textarea, the line endings are \r\n. // It's a standard behavior of HTML. diff --git a/modules/util/util_test.go b/modules/util/util_test.go index 549b53f5a7..5e0c4a9a0b 100644 --- a/modules/util/util_test.go +++ b/modules/util/util_test.go @@ -11,9 +11,9 @@ import ( "strings" "testing" - "code.gitea.io/gitea/modules/optional" - "code.gitea.io/gitea/modules/test" - "code.gitea.io/gitea/modules/util" + "forgejo.org/modules/optional" + "forgejo.org/modules/test" + "forgejo.org/modules/util" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -275,3 +275,16 @@ func TestGeneratingEd25519Keypair(t *testing.T) { assert.EqualValues(t, testPublicKey, string(publicKey)) assert.EqualValues(t, testPrivateKey, string(privateKey)) } + +func TestOptionalArg(t *testing.T) { + foo := func(other any, optArg ...int) int { + return util.OptionalArg(optArg) + } + bar := func(other any, optArg ...int) int { + return util.OptionalArg(optArg, 42) + } + assert.Equal(t, 0, foo(nil)) + assert.Equal(t, 100, foo(nil, 100)) + assert.Equal(t, 42, bar(nil)) + assert.Equal(t, 100, bar(nil, 100)) +} diff --git a/modules/validation/binding.go b/modules/validation/binding.go index cb0a5063e5..f4f82278bd 100644 --- a/modules/validation/binding.go +++ b/modules/validation/binding.go @@ -8,10 +8,11 @@ import ( "regexp" "strings" - "code.gitea.io/gitea/modules/auth" - "code.gitea.io/gitea/modules/git" + "forgejo.org/modules/auth" + "forgejo.org/modules/git" + "forgejo.org/modules/util" - "gitea.com/go-chi/binding" + "code.forgejo.org/go-chi/binding" "github.com/gobwas/glob" ) @@ -26,11 +27,14 @@ const ( ErrUsername = "UsernameError" // ErrInvalidGroupTeamMap is returned when a group team mapping is invalid ErrInvalidGroupTeamMap = "InvalidGroupTeamMap" + // ErrEmail is returned when an email address is invalid + ErrEmail = "Email" ) // AddBindingRules adds additional binding rules func AddBindingRules() { addGitRefNameBindingRule() + addValidURLListBindingRule() addValidURLBindingRule() addValidSiteURLBindingRule() addGlobPatternRule() @@ -38,13 +42,14 @@ func AddBindingRules() { addGlobOrRegexPatternRule() addUsernamePatternRule() addValidGroupTeamMapRule() + addEmailBindingRules() } func addGitRefNameBindingRule() { // Git refname validation rule binding.AddRule(&binding.Rule{ IsMatch: func(rule string) bool { - return strings.HasPrefix(rule, "GitRefName") + return rule == "GitRefName" }, IsValid: func(errs binding.Errors, name string, val any) (bool, binding.Errors) { str := fmt.Sprintf("%v", val) @@ -58,11 +63,38 @@ func addGitRefNameBindingRule() { }) } +func addValidURLListBindingRule() { + // URL validation rule + binding.AddRule(&binding.Rule{ + IsMatch: func(rule string) bool { + return rule == "ValidUrlList" + }, + IsValid: func(errs binding.Errors, name string, val any) (bool, binding.Errors) { + str := fmt.Sprintf("%v", val) + if len(str) == 0 { + errs.Add([]string{name}, binding.ERR_URL, "Url") + return false, errs + } + + ok := true + urls := util.SplitTrimSpace(str, "\n") + for _, u := range urls { + if !IsValidURL(u) { + ok = false + errs.Add([]string{name}, binding.ERR_URL, u) + } + } + + return ok, errs + }, + }) +} + func addValidURLBindingRule() { // URL validation rule binding.AddRule(&binding.Rule{ IsMatch: func(rule string) bool { - return strings.HasPrefix(rule, "ValidUrl") + return rule == "ValidUrl" }, IsValid: func(errs binding.Errors, name string, val any) (bool, binding.Errors) { str := fmt.Sprintf("%v", val) @@ -80,7 +112,7 @@ func addValidSiteURLBindingRule() { // URL validation rule binding.AddRule(&binding.Rule{ IsMatch: func(rule string) bool { - return strings.HasPrefix(rule, "ValidSiteUrl") + return rule == "ValidSiteUrl" }, IsValid: func(errs binding.Errors, name string, val any) (bool, binding.Errors) { str := fmt.Sprintf("%v", val) @@ -171,7 +203,7 @@ func addUsernamePatternRule() { func addValidGroupTeamMapRule() { binding.AddRule(&binding.Rule{ IsMatch: func(rule string) bool { - return strings.HasPrefix(rule, "ValidGroupTeamMap") + return rule == "ValidGroupTeamMap" }, IsValid: func(errs binding.Errors, name string, val any) (bool, binding.Errors) { _, err := auth.UnmarshalGroupTeamMapping(fmt.Sprintf("%v", val)) @@ -185,6 +217,34 @@ func addValidGroupTeamMapRule() { }) } +func addEmailBindingRules() { + binding.AddRule(&binding.Rule{ + IsMatch: func(rule string) bool { + return strings.HasPrefix(rule, "EmailWithAllowedDomain") + }, + IsValid: func(errs binding.Errors, name string, val any) (bool, binding.Errors) { + if err := ValidateEmail(fmt.Sprintf("%v", val)); err != nil { + errs.Add([]string{name}, ErrEmail, err.Error()) + return false, errs + } + return true, errs + }, + }) + + binding.AddRule(&binding.Rule{ + IsMatch: func(rule string) bool { + return strings.HasPrefix(rule, "EmailForAdmin") + }, + IsValid: func(errs binding.Errors, name string, val any) (bool, binding.Errors) { + if err := ValidateEmailForAdmin(fmt.Sprintf("%v", val)); err != nil { + errs.Add([]string{name}, ErrEmail, err.Error()) + return false, errs + } + return true, errs + }, + }) +} + func portOnly(hostport string) string { colon := strings.IndexByte(hostport, ':') if colon == -1 { diff --git a/modules/validation/binding_test.go b/modules/validation/binding_test.go index 01ff4e3435..5adcdf0289 100644 --- a/modules/validation/binding_test.go +++ b/modules/validation/binding_test.go @@ -8,7 +8,7 @@ import ( "net/http/httptest" "testing" - "gitea.com/go-chi/binding" + "code.forgejo.org/go-chi/binding" chi "github.com/go-chi/chi/v5" "github.com/stretchr/testify/assert" ) @@ -27,6 +27,7 @@ type ( TestForm struct { BranchName string `form:"BranchName" binding:"GitRefName"` URL string `form:"ValidUrl" binding:"ValidUrl"` + URLs string `form:"ValidUrls" binding:"ValidUrlList"` GlobPattern string `form:"GlobPattern" binding:"GlobPattern"` RegexPattern string `form:"RegexPattern" binding:"RegexPattern"` } diff --git a/modules/validation/email.go b/modules/validation/email.go new file mode 100644 index 0000000000..fb563c2b81 --- /dev/null +++ b/modules/validation/email.go @@ -0,0 +1,146 @@ +// Copyright 2016 The Gogs Authors. All rights reserved. +// Copyright 2020 The Gitea Authors. All rights reserved. +// Copyright 2024 The Forgejo Authors. All rights reserved +// SPDX-License-Identifier: MIT + +package validation + +import ( + "fmt" + "net/mail" + "regexp" + "strings" + + "forgejo.org/modules/setting" + "forgejo.org/modules/util" + + "github.com/gobwas/glob" +) + +// ErrEmailNotActivated e-mail address has not been activated error +var ErrEmailNotActivated = util.NewInvalidArgumentErrorf("e-mail address has not been activated") + +// ErrEmailCharIsNotSupported e-mail address contains unsupported character +type ErrEmailCharIsNotSupported struct { + Email string +} + +// IsErrEmailCharIsNotSupported checks if an error is an ErrEmailCharIsNotSupported +func IsErrEmailCharIsNotSupported(err error) bool { + _, ok := err.(ErrEmailCharIsNotSupported) + return ok +} + +func (err ErrEmailCharIsNotSupported) Error() string { + return fmt.Sprintf("e-mail address contains unsupported character [email: %s]", err.Email) +} + +// ErrEmailInvalid represents an error where the email address does not comply with RFC 5322 +// or has a leading '-' character +type ErrEmailInvalid struct { + Email string +} + +// IsErrEmailInvalid checks if an error is an ErrEmailInvalid +func IsErrEmailInvalid(err error) bool { + _, ok := err.(ErrEmailInvalid) + return ok +} + +func (err ErrEmailInvalid) Error() string { + return fmt.Sprintf("e-mail invalid [email: %s]", err.Email) +} + +func (err ErrEmailInvalid) Unwrap() error { + return util.ErrInvalidArgument +} + +var emailRegexp = regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$") + +// check if email is a valid address with allowed domain +func ValidateEmail(email string) error { + if err := validateEmailBasic(email); err != nil { + return err + } + return validateEmailDomain(email) +} + +// check if email is a valid address when admins manually add or edit users +func ValidateEmailForAdmin(email string) error { + return validateEmailBasic(email) + // In this case we do not need to check the email domain +} + +// validateEmailBasic checks whether the email complies with the rules +func validateEmailBasic(email string) error { + if len(email) == 0 { + return ErrEmailInvalid{email} + } + + if !emailRegexp.MatchString(email) { + return ErrEmailCharIsNotSupported{email} + } + + if email[0] == '-' { + return ErrEmailInvalid{email} + } + + if _, err := mail.ParseAddress(email); err != nil { + return ErrEmailInvalid{email} + } + + return nil +} + +func validateEmailDomain(email string) error { + if !IsEmailDomainAllowed(email) { + return ErrEmailInvalid{email} + } + + return nil +} + +func IsEmailDomainAllowed(email string) bool { + return isEmailDomainAllowedInternal( + email, + setting.Service.EmailDomainAllowList, + setting.Service.EmailDomainBlockList) +} + +func isEmailDomainAllowedInternal( + email string, + emailDomainAllowList []glob.Glob, + emailDomainBlockList []glob.Glob, +) bool { + var result bool + + if len(emailDomainAllowList) == 0 { + result = !isEmailDomainListed(emailDomainBlockList, email) + } else { + result = isEmailDomainListed(emailDomainAllowList, email) + } + return result +} + +// isEmailDomainListed checks whether the domain of an email address +// matches a list of domains +func isEmailDomainListed(globs []glob.Glob, email string) bool { + if len(globs) == 0 { + return false + } + + n := strings.LastIndex(email, "@") + if n <= 0 { + return false + } + + domain := strings.ToLower(email[n+1:]) + + for _, g := range globs { + if g.Match(domain) { + return true + } + } + + return false +} diff --git a/modules/validation/email_test.go b/modules/validation/email_test.go new file mode 100644 index 0000000000..ffdc6fd4ee --- /dev/null +++ b/modules/validation/email_test.go @@ -0,0 +1,73 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Copyright 2024 The Forgejo Authors. All rights reserved +// SPDX-License-Identifier: MIT + +package validation + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestEmailAddressValidate(t *testing.T) { + kases := map[string]error{ + "abc@gmail.com": nil, + "132@hotmail.com": nil, + "1-3-2@test.org": nil, + "1.3.2@test.org": nil, + "a_123@test.org.cn": nil, + `first.last@iana.org`: nil, + `first!last@iana.org`: nil, + `first#last@iana.org`: nil, + `first$last@iana.org`: nil, + `first%last@iana.org`: nil, + `first&last@iana.org`: nil, + `first'last@iana.org`: nil, + `first*last@iana.org`: nil, + `first+last@iana.org`: nil, + `first/last@iana.org`: nil, + `first=last@iana.org`: nil, + `first?last@iana.org`: nil, + `first^last@iana.org`: nil, + "first`last@iana.org": nil, + `first{last@iana.org`: nil, + `first|last@iana.org`: nil, + `first}last@iana.org`: nil, + `first~last@iana.org`: nil, + `first;last@iana.org`: ErrEmailCharIsNotSupported{`first;last@iana.org`}, + ".233@qq.com": ErrEmailInvalid{".233@qq.com"}, + "!233@qq.com": nil, + "#233@qq.com": nil, + "$233@qq.com": nil, + "%233@qq.com": nil, + "&233@qq.com": nil, + "'233@qq.com": nil, + "*233@qq.com": nil, + "+233@qq.com": nil, + "-233@qq.com": ErrEmailInvalid{"-233@qq.com"}, + "/233@qq.com": nil, + "=233@qq.com": nil, + "?233@qq.com": nil, + "^233@qq.com": nil, + "_233@qq.com": nil, + "`233@qq.com": nil, + "{233@qq.com": nil, + "|233@qq.com": nil, + "}233@qq.com": nil, + "~233@qq.com": nil, + ";233@qq.com": ErrEmailCharIsNotSupported{";233@qq.com"}, + "Foo ": ErrEmailCharIsNotSupported{"Foo "}, + string([]byte{0xE2, 0x84, 0xAA}): ErrEmailCharIsNotSupported{string([]byte{0xE2, 0x84, 0xAA})}, + } + for kase, err := range kases { + t.Run(kase, func(t *testing.T) { + assert.EqualValues(t, err, ValidateEmail(kase)) + }) + } +} + +func TestEmailDomainAllowList(t *testing.T) { + res := IsEmailDomainAllowed("someuser@localhost.localdomain") + assert.True(t, res) +} diff --git a/modules/validation/glob_pattern_test.go b/modules/validation/glob_pattern_test.go index 1bf622e61d..42d86754e1 100644 --- a/modules/validation/glob_pattern_test.go +++ b/modules/validation/glob_pattern_test.go @@ -6,7 +6,7 @@ package validation import ( "testing" - "gitea.com/go-chi/binding" + "code.forgejo.org/go-chi/binding" "github.com/gobwas/glob" ) diff --git a/modules/validation/helpers.go b/modules/validation/helpers.go index 567ad867fe..1f573564e6 100644 --- a/modules/validation/helpers.go +++ b/modules/validation/helpers.go @@ -9,9 +9,7 @@ import ( "regexp" "strings" - "code.gitea.io/gitea/modules/setting" - - "github.com/gobwas/glob" + "forgejo.org/modules/setting" ) var externalTrackerRegex = regexp.MustCompile(`({?)(?:user|repo|index)+?(}?)`) @@ -50,29 +48,6 @@ func IsValidSiteURL(uri string) bool { return false } -// IsEmailDomainListed checks whether the domain of an email address -// matches a list of domains -func IsEmailDomainListed(globs []glob.Glob, email string) bool { - if len(globs) == 0 { - return false - } - - n := strings.LastIndex(email, "@") - if n <= 0 { - return false - } - - domain := strings.ToLower(email[n+1:]) - - for _, g := range globs { - if g.Match(domain) { - return true - } - } - - return false -} - // IsAPIURL checks if URL is current Gitea instance API URL func IsAPIURL(uri string) bool { return strings.HasPrefix(strings.ToLower(uri), strings.ToLower(setting.AppURL+"api")) diff --git a/modules/validation/helpers_test.go b/modules/validation/helpers_test.go index a1bdf2a29c..01a17f0d6b 100644 --- a/modules/validation/helpers_test.go +++ b/modules/validation/helpers_test.go @@ -6,7 +6,7 @@ package validation import ( "testing" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" ) diff --git a/modules/validation/refname_test.go b/modules/validation/refname_test.go index 3af7387c47..bb64cab51e 100644 --- a/modules/validation/refname_test.go +++ b/modules/validation/refname_test.go @@ -6,7 +6,7 @@ package validation import ( "testing" - "gitea.com/go-chi/binding" + "code.forgejo.org/go-chi/binding" ) var gitRefNameValidationTestCases = []validationTestCase{ diff --git a/modules/validation/regex_pattern_test.go b/modules/validation/regex_pattern_test.go index efcb276734..90bd969c4f 100644 --- a/modules/validation/regex_pattern_test.go +++ b/modules/validation/regex_pattern_test.go @@ -7,7 +7,7 @@ import ( "regexp" "testing" - "gitea.com/go-chi/binding" + "code.forgejo.org/go-chi/binding" ) func getRegexPatternErrorString(pattern string) string { diff --git a/modules/validation/validatable.go b/modules/validation/validatable.go index 94b5cc135c..bc565bd194 100644 --- a/modules/validation/validatable.go +++ b/modules/validation/validatable.go @@ -10,7 +10,7 @@ import ( "strings" "unicode/utf8" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" ) // ErrNotValid represents an validation error diff --git a/modules/validation/validatable_test.go b/modules/validation/validatable_test.go index 919f5a3183..0802d5cc92 100644 --- a/modules/validation/validatable_test.go +++ b/modules/validation/validatable_test.go @@ -6,7 +6,7 @@ package validation import ( "testing" - "code.gitea.io/gitea/modules/timeutil" + "forgejo.org/modules/timeutil" ) type Sut struct { diff --git a/modules/validation/validurl_test.go b/modules/validation/validurl_test.go index 39f7fa5d65..77fa7aa097 100644 --- a/modules/validation/validurl_test.go +++ b/modules/validation/validurl_test.go @@ -6,7 +6,7 @@ package validation import ( "testing" - "gitea.com/go-chi/binding" + "code.forgejo.org/go-chi/binding" ) var urlValidationTestCases = []validationTestCase{ diff --git a/modules/validation/validurllist_test.go b/modules/validation/validurllist_test.go new file mode 100644 index 0000000000..506f96da69 --- /dev/null +++ b/modules/validation/validurllist_test.go @@ -0,0 +1,157 @@ +// Copyright 2024 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package validation + +import ( + "testing" + + "code.forgejo.org/go-chi/binding" +) + +// This is a copy of all the URL tests cases, plus additional ones to +// account for multiple URLs +var urlListValidationTestCases = []validationTestCase{ + { + description: "Empty URL", + data: TestForm{ + URLs: "", + }, + expectedErrors: binding.Errors{}, + }, + { + description: "URL without port", + data: TestForm{ + URLs: "http://test.lan/", + }, + expectedErrors: binding.Errors{}, + }, + { + description: "URL with port", + data: TestForm{ + URLs: "http://test.lan:3000/", + }, + expectedErrors: binding.Errors{}, + }, + { + description: "URL with IPv6 address without port", + data: TestForm{ + URLs: "http://[::1]/", + }, + expectedErrors: binding.Errors{}, + }, + { + description: "URL with IPv6 address with port", + data: TestForm{ + URLs: "http://[::1]:3000/", + }, + expectedErrors: binding.Errors{}, + }, + { + description: "Invalid URL", + data: TestForm{ + URLs: "http//test.lan/", + }, + expectedErrors: binding.Errors{ + binding.Error{ + FieldNames: []string{"URLs"}, + Classification: binding.ERR_URL, + Message: "http//test.lan/", + }, + }, + }, + { + description: "Invalid schema", + data: TestForm{ + URLs: "ftp://test.lan/", + }, + expectedErrors: binding.Errors{ + binding.Error{ + FieldNames: []string{"URLs"}, + Classification: binding.ERR_URL, + Message: "ftp://test.lan/", + }, + }, + }, + { + description: "Invalid port", + data: TestForm{ + URLs: "http://test.lan:3x4/", + }, + expectedErrors: binding.Errors{ + binding.Error{ + FieldNames: []string{"URLs"}, + Classification: binding.ERR_URL, + Message: "http://test.lan:3x4/", + }, + }, + }, + { + description: "Invalid port with IPv6 address", + data: TestForm{ + URLs: "http://[::1]:3x4/", + }, + expectedErrors: binding.Errors{ + binding.Error{ + FieldNames: []string{"URLs"}, + Classification: binding.ERR_URL, + Message: "http://[::1]:3x4/", + }, + }, + }, + { + description: "Multi URLs", + data: TestForm{ + URLs: "http://test.lan:3000/\nhttp://test.local/", + }, + expectedErrors: binding.Errors{}, + }, + { + description: "Multi URLs with newline", + data: TestForm{ + URLs: "http://test.lan:3000/\nhttp://test.local/\n", + }, + expectedErrors: binding.Errors{}, + }, + { + description: "List with invalid entry", + data: TestForm{ + URLs: "http://test.lan:3000/\nhttp://[::1]:3x4/", + }, + expectedErrors: binding.Errors{ + binding.Error{ + FieldNames: []string{"URLs"}, + Classification: binding.ERR_URL, + Message: "http://[::1]:3x4/", + }, + }, + }, + { + description: "List with two invalid entries", + data: TestForm{ + URLs: "ftp://test.lan:3000/\nhttp://[::1]:3x4/\n", + }, + expectedErrors: binding.Errors{ + binding.Error{ + FieldNames: []string{"URLs"}, + Classification: binding.ERR_URL, + Message: "ftp://test.lan:3000/", + }, + binding.Error{ + FieldNames: []string{"URLs"}, + Classification: binding.ERR_URL, + Message: "http://[::1]:3x4/", + }, + }, + }, +} + +func Test_ValidURLListValidation(t *testing.T) { + AddBindingRules() + + for _, testCase := range urlListValidationTestCases { + t.Run(testCase.description, func(t *testing.T) { + performValidationTest(t, testCase) + }) + } +} diff --git a/modules/web/handler.go b/modules/web/handler.go index 728cc5a160..4a7f28b1fa 100644 --- a/modules/web/handler.go +++ b/modules/web/handler.go @@ -9,9 +9,9 @@ import ( "net/http" "reflect" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/web/routing" - "code.gitea.io/gitea/modules/web/types" + "forgejo.org/modules/log" + "forgejo.org/modules/web/routing" + "forgejo.org/modules/web/types" ) var responseStatusProviders = map[reflect.Type]func(req *http.Request) types.ResponseStatusProvider{} diff --git a/modules/web/middleware/binding.go b/modules/web/middleware/binding.go index 8fa71a81bd..9083e9b485 100644 --- a/modules/web/middleware/binding.go +++ b/modules/web/middleware/binding.go @@ -8,12 +8,12 @@ import ( "reflect" "strings" - "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/translation" - "code.gitea.io/gitea/modules/util" - "code.gitea.io/gitea/modules/validation" + "forgejo.org/modules/setting" + "forgejo.org/modules/translation" + "forgejo.org/modules/util" + "forgejo.org/modules/validation" - "gitea.com/go-chi/binding" + "code.forgejo.org/go-chi/binding" ) // Form form binding interface @@ -143,6 +143,8 @@ func Validate(errs binding.Errors, data map[string]any, f any, l translation.Loc } case validation.ErrInvalidGroupTeamMap: data["ErrorMsg"] = trName + l.TrString("form.invalid_group_team_map_error", errs[0].Message) + case validation.ErrEmail: + data["ErrorMsg"] = trName + l.TrString("form.email_error") default: msg := errs[0].Classification if msg != "" && errs[0].Message != "" { diff --git a/modules/web/middleware/cookie.go b/modules/web/middleware/cookie.go index f2d25f5b1c..3bfaeabe69 100644 --- a/modules/web/middleware/cookie.go +++ b/modules/web/middleware/cookie.go @@ -9,8 +9,8 @@ import ( "net/url" "strings" - "code.gitea.io/gitea/modules/session" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/session" + "forgejo.org/modules/setting" ) // SetRedirectToCookie convenience function to set the RedirectTo cookie consistently diff --git a/modules/web/middleware/data.go b/modules/web/middleware/data.go index 08d83f94be..4603e64052 100644 --- a/modules/web/middleware/data.go +++ b/modules/web/middleware/data.go @@ -7,7 +7,7 @@ import ( "context" "time" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" ) // ContextDataStore represents a data store diff --git a/modules/web/middleware/locale.go b/modules/web/middleware/locale.go index 34a16f04e7..565fb2f502 100644 --- a/modules/web/middleware/locale.go +++ b/modules/web/middleware/locale.go @@ -6,8 +6,8 @@ package middleware import ( "net/http" - "code.gitea.io/gitea/modules/translation" - "code.gitea.io/gitea/modules/translation/i18n" + "forgejo.org/modules/translation" + "forgejo.org/modules/translation/i18n" "golang.org/x/text/language" ) @@ -26,8 +26,10 @@ func Locale(resp http.ResponseWriter, req *http.Request) translation.Locale { } } - // Check again in case someone changes the supported language list. - if lang != "" && !i18n.DefaultLocales.HasLang(lang) { + if lang == "dummy" { + changeLang = false + } else if lang != "" && !i18n.DefaultLocales.HasLang(lang) { + // Check again in case someone changes the supported language list. lang = "" changeLang = false } @@ -51,9 +53,3 @@ func Locale(resp http.ResponseWriter, req *http.Request) translation.Locale { func SetLocaleCookie(resp http.ResponseWriter, lang string, maxAge int) { SetSiteCookie(resp, "lang", lang, maxAge) } - -// DeleteLocaleCookie convenience function to delete the locale cookie consistently -// Setting the lang cookie will trigger the middleware to reset the language to previous state. -func DeleteLocaleCookie(resp http.ResponseWriter) { - SetSiteCookie(resp, "lang", "", -1) -} diff --git a/modules/web/route.go b/modules/web/route.go index 805fcb4411..046c9f4ba7 100644 --- a/modules/web/route.go +++ b/modules/web/route.go @@ -7,9 +7,9 @@ import ( "net/http" "strings" - "code.gitea.io/gitea/modules/web/middleware" + "forgejo.org/modules/web/middleware" - "gitea.com/go-chi/binding" + "code.forgejo.org/go-chi/binding" "github.com/go-chi/chi/v5" ) diff --git a/modules/web/routemock.go b/modules/web/routemock.go index cb41f63b91..33d2ad06eb 100644 --- a/modules/web/routemock.go +++ b/modules/web/routemock.go @@ -6,7 +6,7 @@ package web import ( "net/http" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" ) // MockAfterMiddlewares is a general mock point, it's between middlewares and the handler diff --git a/modules/web/routemock_test.go b/modules/web/routemock_test.go index cd99b99323..43d4b28830 100644 --- a/modules/web/routemock_test.go +++ b/modules/web/routemock_test.go @@ -8,7 +8,7 @@ import ( "net/http/httptest" "testing" - "code.gitea.io/gitea/modules/setting" + "forgejo.org/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/web/routing/logger.go b/modules/web/routing/logger.go index 5f3a7592af..8fd24c9733 100644 --- a/modules/web/routing/logger.go +++ b/modules/web/routing/logger.go @@ -8,8 +8,8 @@ import ( "strings" "time" - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/web/types" + "forgejo.org/modules/log" + "forgejo.org/modules/web/types" ) // NewLoggerHandler is a handler that will log routing to the router log taking account of @@ -90,7 +90,7 @@ func logPrinter(logger log.Logger) func(trigger Event, record *requestRecord) { status = v.WrittenStatus() } logf := logger.Info - if strings.HasPrefix(req.RequestURI, "/assets/") { + if strings.HasPrefix(req.RequestURI, "/assets/") || req.RequestURI == "/api/actions/runner.v1.RunnerService/FetchTask" || req.RequestURI == "/api/actions/runner.v1.RunnerService/UpdateLog" { logf = logger.Trace } message := completedMessage diff --git a/modules/web/routing/logger_manager.go b/modules/web/routing/logger_manager.go index aa25ec3a27..4b12419b44 100644 --- a/modules/web/routing/logger_manager.go +++ b/modules/web/routing/logger_manager.go @@ -9,8 +9,8 @@ import ( "sync" "time" - "code.gitea.io/gitea/modules/graceful" - "code.gitea.io/gitea/modules/process" + "forgejo.org/modules/graceful" + "forgejo.org/modules/process" ) // Event indicates when the printer is triggered diff --git a/options/gitignore/Flutter b/options/gitignore/Flutter new file mode 100644 index 0000000000..39b8814aec --- /dev/null +++ b/options/gitignore/Flutter @@ -0,0 +1,119 @@ +# Miscellaneous +*.class +*.lock +*.log +*.pyc +*.swp +.buildlog/ +.history + + + +# Flutter repo-specific +/bin/cache/ +/bin/internal/bootstrap.bat +/bin/internal/bootstrap.sh +/bin/mingit/ +/dev/benchmarks/mega_gallery/ +/dev/bots/.recipe_deps +/dev/bots/android_tools/ +/dev/devicelab/ABresults*.json +/dev/docs/doc/ +/dev/docs/flutter.docs.zip +/dev/docs/lib/ +/dev/docs/pubspec.yaml +/dev/integration_tests/**/xcuserdata +/dev/integration_tests/**/Pods +/packages/flutter/coverage/ +version +analysis_benchmark.json + +# packages file containing multi-root paths +.packages.generated + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +**/generated_plugin_registrant.dart +.packages +.pub-preload-cache/ +.pub/ +build/ +flutter_*.png +linked_*.ds +unlinked.ds +unlinked_spec.ds + +# Android related +**/android/**/gradle-wrapper.jar +.gradle/ +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java +**/android/key.properties +*.jks + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/.last_build_id +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Flutter.podspec +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/ephemeral +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/Flutter/flutter_export_environment.sh +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# macOS +**/Flutter/ephemeral/ +**/Pods/ +**/macos/Flutter/GeneratedPluginRegistrant.swift +**/macos/Flutter/ephemeral +**/xcuserdata/ + +# Windows +**/windows/flutter/generated_plugin_registrant.cc +**/windows/flutter/generated_plugin_registrant.h +**/windows/flutter/generated_plugins.cmake + +# Linux +**/linux/flutter/generated_plugin_registrant.cc +**/linux/flutter/generated_plugin_registrant.h +**/linux/flutter/generated_plugins.cmake + +# Coverage +coverage/ + +# Symbols +app.*.symbols + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages +!/dev/ci/**/Gemfile.lock \ No newline at end of file diff --git a/options/gitignore/Nix b/options/gitignore/Nix index 1fd04ef1f6..912e6700f4 100644 --- a/options/gitignore/Nix +++ b/options/gitignore/Nix @@ -1,3 +1,6 @@ # Ignore build outputs from performing a nix-build or `nix build` command result result-* + +# Ignore automatically generated direnv output +.direnv diff --git a/options/gitignore/NotesAndCoreConfiguration b/options/gitignore/NotesAndCoreConfiguration new file mode 100644 index 0000000000..4eff01dae1 --- /dev/null +++ b/options/gitignore/NotesAndCoreConfiguration @@ -0,0 +1,16 @@ +# Excludes Obsidian workspace cache and plugins. All notes and core obsidian +# configuration files are tracked by Git. + +# The current application UI state (DOM layout, recently-opened files, etc.) is +# stored in these files (separate for desktop and mobile) so you can resume +# your session seamlessly after a restart. If you want to track UI state, use +# the Workspaces core plugin instead of relying on these files. +.obsidian/workspace.json +.obsidian/workspace-mobile.json + +# Obsidian plugins are stored under .obsidian/plugins/$plugin_name. They +# contain metadata (manifest.json), application code (main.js), stylesheets +# (styles.css), and user-configuration data (data.json). +# We want to exclude all plugin-related files, so we can exclude everything +# under this directory. +.obsidian/plugins/**/* diff --git a/options/gitignore/NotesAndExtendedConfiguration b/options/gitignore/NotesAndExtendedConfiguration new file mode 100644 index 0000000000..3e0804f299 --- /dev/null +++ b/options/gitignore/NotesAndExtendedConfiguration @@ -0,0 +1,38 @@ +# Excludes Obsidian workspace cache and plugin code, but retains plugin +# configuration. All notes and user-controlled configuration files are tracked +# by Git. +# +# !!! WARNING !!! +# +# Community plugins may store sensitive secrets in their data.json files. By +# including these files, those secrets may be tracked in your Git repository. +# +# To ignore configurations for specific plugins, add a line like this after the +# contents of this file (order is important): +# .obsidian/plugins/{{plugin_name}}/data.json +# +# Alternatively, ensure that you are treating your entire Git repository as +# sensitive data, since it may contain secrets, or may have contained them in +# past commits. Understand your threat profile, and make the decision +# appropriate for yourself. If in doubt, err on the side of not including +# plugin configuration. Use one of the alternative gitignore files instead: +# * NotesOnly.gitignore +# * NotesAndCoreConfiguration.gitignore + +# The current application UI state (DOM layout, recently-opened files, etc.) is +# stored in these files (separate for desktop and mobile) so you can resume +# your session seamlessly after a restart. If you want to track UI state, use +# the Workspaces core plugin instead of relying on these files. +.obsidian/workspace.json +.obsidian/workspace-mobile.json + +# Obsidian plugins are stored under .obsidian/plugins/$plugin_name. They +# contain metadata (manifest.json), application code (main.js), stylesheets +# (styles.css), and user-configuration data (data.json). +# We only want to track data.json, so we: +# 1. exclude everything under the plugins directory recursively, +# 2. unignore the plugin directories themselves, which then allows us to +# 3. unignore the data.json files +.obsidian/plugins/**/* +!.obsidian/plugins/*/ +!.obsidian/plugins/*/data.json diff --git a/options/gitignore/NotesOnly b/options/gitignore/NotesOnly new file mode 100644 index 0000000000..2b3b76ee0e --- /dev/null +++ b/options/gitignore/NotesOnly @@ -0,0 +1,4 @@ +# Excludes all Obsidian-related configuration. All notes are tracked by Git. + +# All Obsidian configuration and runtime state is stored here +.obsidian/**/* diff --git a/options/gitignore/Zig b/options/gitignore/Zig index 236ae6be8c..748837a058 100644 --- a/options/gitignore/Zig +++ b/options/gitignore/Zig @@ -1,4 +1,4 @@ -zig-cache/ +.zig-cache/ zig-out/ build/ build-*/ diff --git a/options/locale/locale_ar.ini b/options/locale/locale_ar.ini index 00d7b9486e..b7b3a0c883 100644 --- a/options/locale/locale_ar.ini +++ b/options/locale/locale_ar.ini @@ -1,6 +1,3 @@ - - - [common] language = لغة passcode = رمز المرور @@ -142,6 +139,11 @@ filter.not_fork = ليست اشتقاقات filter.not_archived = ليس مؤرش٠filter.public = علني filter.private = خاص +new_repo.title = مستودع جديد +new_migrate.title = انتقال جديد +new_org.title = منظمة جديدة +new_repo.link = مستودع جديد +new_migrate.link = انتقال جديد [install] db_name = اسم قاعدة البيانات @@ -955,7 +957,7 @@ settings.recent_deliveries = التوصيل الأخيرة projects.new = مشروع جديد file_history = تاريخ editor.directory_is_a_file = اسم المجلد "%s" مستخدم ÙØ¹Ù„ا لاسم مل٠ÙÙŠ هذا المستودع. -editor.commit_directly_to_this_branch = أودع مباشرةً إلى ÙØ±Ø¹ %s. +editor.commit_directly_to_this_branch = أودع مباشرةً إلى ÙØ±Ø¹ %[1]s. editor.unable_to_upload_files = تعذر Ø±ÙØ¹ Ø§Ù„Ù…Ù„ÙØ§Øª إلى "%s" برسالة الخطأ: %v settings.webhook.payload = المحتوى invisible_runes_header = `يحتوي هذا المل٠على محار٠يونيكود غير مرئية` @@ -1015,7 +1017,7 @@ commit.revert-header = إرجاع: %s editor.file_already_exists = يوجد ÙØ¹Ù„ا ÙÙŠ هذا المستودع مل٠باسم "%s". settings.web_hook_name_matrix = متركس editor.filename_cannot_be_empty = لا يمكن ترك اسم Ø§Ù„Ù…Ù„Ù ÙØ§Ø±ØºØ§. -editor.add_tmpl = أض٠'' +editor.add_tmpl = أض٠'<%s>' editor.new_branch_name_desc = اسم Ø§Ù„ÙØ±Ø¹ الجديد… release = إصدار editor.delete_this_file = احذ٠المل٠@@ -1100,7 +1102,7 @@ activity.git_stats_pushed_1 = Ø¯ÙØ¹ activity.git_stats_pushed_n = Ø¯ÙØ¹ÙˆØ§ activity.git_stats_commit_1 = %d إيداع activity.git_stats_commit_n = %d إيداعا -activity.git_stats_push_to_branch = إلى %s Ùˆ  +activity.git_stats_push_to_branch = `إلى %s Ùˆ"` activity.git_stats_push_to_all_branches = إلى كل Ø§Ù„ÙØ±ÙˆØ¹. activity.git_stats_on_default_branch = ÙÙŠ %sØŒ activity.git_stats_file_1 = %d مل٠@@ -1110,7 +1112,7 @@ activity.git_stats_files_changed_n = تغيّروا activity.git_stats_additions = وحدثت activity.git_stats_addition_1 = %d Ø¥Ø¶Ø§ÙØ© activity.git_stats_addition_n = %d Ø¥Ø¶Ø§ÙØ© -activity.git_stats_and_deletions = Ùˆ  +activity.git_stats_and_deletions = `Ùˆ"` activity.git_stats_deletion_1 = %d إزالة activity.git_stats_deletion_n = %d إزالة settings.mirror_settings.direction = الاتجاه @@ -1982,4 +1984,10 @@ match_tooltip = قم بتضمين النتائج التي تطابق مصطلح repo_kind = بحث ÙÙŠ المستودعات... user_kind = بحث عن المستخدمين... team_kind = بحث عن Ø§Ù„ÙØ±Ù‚ ... -code_kind = بحث ÙÙŠ الكود... \ No newline at end of file +code_kind = بحث ÙÙŠ الكود... +project_kind = البحث ضمن المشاريع... +branch_kind = البحث ضمن Ø§Ù„ÙØ±ÙˆØ¹... +no_results = لا توجد نتائج مطابقة. +issue_kind = البحث ضمن الأعطال... +pull_kind = البحث ضمن طلبات السحب... +keyword_search_unavailable = البحث من خلال الكلمات Ø§Ù„Ù…ÙØªØ§Ø­ÙŠØ© ليس Ù…ØªÙˆÙØ± حالياً. رجاءاً تواصل مع مشر٠الموقع. diff --git a/options/locale/locale_be.ini b/options/locale/locale_be.ini index f9d8e738c3..fe04dadc3e 100644 --- a/options/locale/locale_be.ini +++ b/options/locale/locale_be.ini @@ -1,6 +1,3 @@ - - - [common] dashboard = ПанÑль ÐºÑ–Ñ€Ð°Ð²Ð°Ð½Ð½Ñ explore = ÐглÑд diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini index 01fb84c3c6..6fc4b55eae 100644 --- a/options/locale/locale_bg.ini +++ b/options/locale/locale_bg.ini @@ -1,194 +1,3 @@ - - - -[settings] -ui = Тема -delete_key = Премахване -applications = ÐŸÑ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ -visibility = ВидимоÑÑ‚ на Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ -location = МеÑтоположение -password = Парола -appearance = Облик -new_password = Ðова парола -oauth2_application_edit = Редактиране -repos = Хранилища -can_write_info = ПиÑане -delete = Изтриване на акаунта -social = Социални акаунти -twofa = Двуфакторно удоÑтоверÑване (TOTP) -update_theme = ПромÑна на темата -can_read_info = Четене -access_token_deletion_confirm_action = Изтриване -website = УебÑайт -cancel = Отказ -delete_token = Изтриване -uid = UID -language = Език -save_application = Запазване -privacy = ПоверителноÑÑ‚ -avatar = Профилна Ñнимка -add_key = ДобавÑне на ключ -account_link = Свързани акаунти -delete_email = Премахване -update_language = ПромÑна на езика -organization = Организации -link_account = Свързване на акаунт -add_new_gpg_key = ДобавÑне на GPG ключ -manage_gpg_keys = Управление на GPG ключовете -manage_ssh_keys = Управление на SSH ключовете -old_password = Текуща парола -public_profile = Публичен профил -full_name = Пълно име -security = СигурноÑÑ‚ -add_new_key = ДобавÑне на SSH ключ -account = Ðкаунт -update_avatar = ОбновÑване на профилната Ñнимка -ssh_gpg_keys = SSH / GPG ключове -comment_type_group_milestone = Етап -manage_emails = Управление на адреÑите на ел. поща -permission_read = Четене -update_password = ОбновÑване на паролата -biography_placeholder = Разкажете ни малко за Ñебе Ñи! (Можете да използвате Markdown) -orgs = Организации -continue = Продължаване -blocked_users = Блокирани потребители -emails = ÐдреÑи на ел. поща -update_profile = ОбновÑване на профила -profile = Профил -change_password = ПромÑна на паролата -retype_new_password = Потвърдете новата парола -choose_new_avatar = Изберете нова профилна Ñнимка -delete_current_avatar = Изтриване на текущата профилна Ñнимка -gpg_key_deletion_success = GPG ключът е премахнат. -permission_no_access = Без доÑтъп -ssh_key_deletion_success = SSH ключът е премахнат. -comment_type_group_project = Проект -update_language_success = Езикът е обновен. -add_key_success = SSH ключът „%s“ е добавен. -add_gpg_key_success = GPG ключът „%s“ е добавен. -user_unblock_success = ПотребителÑÑ‚ е отблокиран уÑпешно. -user_block_success = ПотребителÑÑ‚ е блокиран уÑпешно. -update_profile_success = Профилът ви е обновен. -update_user_avatar_success = Профилната Ñнимка на Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ðµ обновена. -remove_oauth2_application_success = Приложението е изтрито. -email_deletion_success = ÐдреÑÑŠÑ‚ на ел. поща е премахнат. -update_avatar_success = Профилната ви Ñнимка е обновена. -change_username = ПотребителÑкото ви име е променено. -comment_type_group_assignee = Изпълнител -enable_custom_avatar = Използване на перÑонализирана профилна Ñнимка -requires_activation = ИзиÑква активиране -activated = Ðктивиран -primary = ОÑновен -email_deletion = Премахване на адреÑа на ел. поща -add_new_email = ДобавÑне на нов Ð°Ð´Ñ€ÐµÑ Ð½Ð° ел. поща -add_email = ДобавÑне на Ð°Ð´Ñ€ÐµÑ Ð½Ð° ел. поща -key_content_gpg_placeholder = Започва Ñ â€ž-----BEGIN PGP PUBLIC KEY BLOCK-----“ -comment_type_group_title = Заглавие -comment_type_group_label = Етикет -change_username_prompt = Забележка: ПромÑната на потребителÑкото ви име Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ñ Ñъщо URL на Ð²Ð°ÑˆÐ¸Ñ Ð°ÐºÐ°ÑƒÐ½Ñ‚. -update_language_not_found = Езикът „%s“ не е наличен. -keep_activity_private_popup = Вашата дейноÑÑ‚ ще бъде видима Ñамо за Ð²Ð°Ñ Ð¸ админиÑтраторите на Ñайта -uploaded_avatar_not_a_image = КачениÑÑ‚ файл не е изображение. -uploaded_avatar_is_too_big = Размерът на ÐºÐ°Ñ‡ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð» (%d KiB) надвишава макÑÐ¸Ð¼Ð°Ð»Ð½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€ (%d KiB). -change_password_success = Паролата ви е обновена. Влизайте Ñ Ð½Ð¾Ð²Ð°Ñ‚Ð° Ñи парола от Ñега нататък. -manage_themes = Тема по подразбиране -manage_openid = OpenID адреÑи -primary_email = Да е оÑновен -keep_email_private = Скриване на адреÑа на ел. поща -theme_update_error = Избраната тема не ÑъщеÑтвува. -theme_update_success = Темата ви е обновена. -key_content_ssh_placeholder = Започва Ñ â€žssh-ed25519“, „ssh-rsa“, „ecdsa-sha2-nistp256“, „ecdsa-sha2-nistp384“, „ecdsa-sha2-nistp521“, „sk-ecdsa-sha2-nistp256@openssh.com“, или „sk-ssh-ed25519@openssh.com“ -hide_openid = Скриване от профила -key_content = Съдържание -ssh_key_deletion = Премахване на SSH ключ -gpg_key_deletion = Премахване на GPG ключ -key_name = Име на ключа -key_id = ID на ключа -show_openid = Показване в профила -visibility.public = Публична -visibility.limited = Ограничена -visibility.private = ЧаÑтна -location_placeholder = Споделете приблизителното Ñи меÑтоположение Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ‚Ðµ -key_signature_gpg_placeholder = Започва Ñ â€ž-----BEGIN PGP SIGNATURE-----“ -key_signature_ssh_placeholder = Започва Ñ â€ž-----BEGIN SSH SIGNATURE-----“ -saved_successfully = ÐаÑтройките бÑха запазени уÑпешно. -no_activity = ÐÑма Ñкорошна дейноÑÑ‚ -theme_desc = Това ще бъде вашата тема по подразбиране в Ñ†ÐµÐ»Ð¸Ñ Ñайт. -keep_activity_private = Скриване на дейноÑтта от профилната Ñтраница -lookup_avatar_by_mail = ТърÑене на профилна Ñнимка по адреÑа на ел. поща -password_incorrect = Текущата парола е неправилна. -change_username_redirect_prompt = Старото потребителÑко име ще Ñе пренаÑочва, докато нÑкой не го вземе. -principal_content = Съдържание -manage_ssh_principals = Управление на SSH Certificate Principals -twofa_disabled = Двуфакторното удоÑтоверÑване е изключено. -orgs_none = Ðе Ñте учаÑтник в никакви организации. -repos_none = Ðе притежавате никакви хранилища. -blocked_users_none = ÐÑма блокирани потребители. -profile_desc = Контролирайте как вашиÑÑ‚ профил Ñе показва на другите потребители. ВашиÑÑ‚ оÑновен Ð°Ð´Ñ€ÐµÑ Ð½Ð° ел. поща ще Ñе използва за извеÑтиÑ, възÑтановÑване на паролата и уеб базирани Git операции. -permission_write = Четене и пиÑане -twofa_disable = Изключване на двуфакторното удоÑтоверÑване -twofa_enroll = Включване на двуфакторно удоÑтоверÑване -ssh_key_name_used = Вече ÑъщеÑтвува SSH ключ ÑÑŠÑ Ñъщото име във Ð²Ð°ÑˆÐ¸Ñ Ð°ÐºÐ°ÑƒÐ½Ñ‚. -email_notifications.enable = Включване на извеÑтиÑта по ел. поща -delete_prompt = Тази Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ‰Ðµ изтрие перманентно потребителÑÐºÐ¸Ñ Ð²Ð¸ акаунт. Това ÐЕ МОЖЕ да бъде отменено. -email_notifications.disable = Изключване на извеÑтиÑта по ел. поща -delete_account = Изтриване на акаунта ви -confirm_delete_account = Потвърждаване на изтриването -email_notifications.onmention = Ел. поща Ñамо при Ñпоменаване -pronouns_unspecified = ÐепоÑочени -pronouns = МеÑÑ‚Ð¾Ð¸Ð¼ÐµÐ½Ð¸Ñ -gpg_token_code = echo "%s" | gpg -a --default-key %s --detach-sig -language.title = Език по подразбиране -language.localization_project = Помогнете ни да преведем Forgejo на Ð²Ð°ÑˆÐ¸Ñ ÐµÐ·Ð¸Ðº! Ðаучете повече. -language.description = Този език ще бъде запазен във Ð²Ð°ÑˆÐ¸Ñ Ð°ÐºÐ°ÑƒÐ½Ñ‚ и ще Ñе използва като език по подразбиране, Ñлед като влезете. - -[packages] -container.labels.value = СтойноÑÑ‚ -alpine.repository.repositories = Хранилища -dependency.version = ВерÑÐ¸Ñ -title = Пакети -empty = Ð’Ñе още нÑма пакети. -empty.documentation = За повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð½Ð¾Ñно региÑтъра на пакетите вижте документациÑта. -container.labels.key = Ключ -requirements = ИзиÑÐºÐ²Ð°Ð½Ð¸Ñ -details = ПодробноÑти -details.license = Лиценз -container.labels = Етикети -versions = ВерÑии -empty.repo = Качихте ли пакет, но той не Ñе показва тук? Отидете в наÑтройките за пакети и го Ñвържете към това хранилище. -keywords = Ключови думи -details.author = Ðвтор -about = ОтноÑно този пакет -settings.delete.success = Пакетът е изтрит. -settings.delete = Изтриване на пакета -container.details.platform = Платформа -settings.delete.error = ÐеуÑпешно изтриване на пакет. -installation = ИнÑÑ‚Ð°Ð»Ð°Ñ†Ð¸Ñ -versions.view_all = Вижте вÑички -dependencies = ЗавиÑимоÑти -published_by_in = Публикуван %[1]s от %[3]s в %[5]s -published_by = Публикуван %[1]s от %[3]s - -[tool] -hours = %d чаÑа -now = Ñега -raw_seconds = Ñекунди -1m = 1 минута -1s = 1 Ñекунда -months = %d меÑеца -weeks = %d Ñедмици -1w = 1 Ñедмица -years = %d години -seconds = %d Ñекунди -days = %d дни -1d = 1 ден -minutes = %d минути -1mon = 1 меÑец -1h = 1 Ñ‡Ð°Ñ -1y = 1 година -future = бъдеще -raw_minutes = минути - [common] language = Език cancel = Отказ @@ -302,6 +111,202 @@ new_migrate.link = Ðова Ð¼Ð¸Ð³Ñ€Ð°Ñ†Ð¸Ñ new_org.link = Ðова Ð¾Ñ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ copy_generic = Копиране в клипборда copy_error = ÐеуÑпешно копиране +copy_path = Копиране на Ð¿ÑŠÑ‚Ñ + +[settings] +ui = Тема +delete_key = Премахване +applications = ÐŸÑ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ +visibility = ВидимоÑÑ‚ на Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ +location = МеÑтоположение +password = Парола +appearance = Облик +new_password = Ðова парола +oauth2_application_edit = Редактиране +repos = Хранилища +can_write_info = ПиÑане +delete = Изтриване на акаунта +social = Социални акаунти +twofa = Двуфакторно удоÑтоверÑване (TOTP) +update_theme = ПромÑна на темата +can_read_info = Четене +access_token_deletion_confirm_action = Изтриване +website = УебÑайт +cancel = Отказ +delete_token = Изтриване +uid = UID +language = Език +save_application = Запазване +privacy = ПоверителноÑÑ‚ +avatar = Профилна Ñнимка +add_key = ДобавÑне на ключ +account_link = Свързани акаунти +delete_email = Премахване +update_language = ПромÑна на езика +organization = Организации +link_account = Свързване на акаунт +add_new_gpg_key = ДобавÑне на GPG ключ +manage_gpg_keys = Управление на GPG ключовете +manage_ssh_keys = Управление на SSH ключовете +old_password = Текуща парола +public_profile = Публичен профил +full_name = Пълно име +security = СигурноÑÑ‚ +add_new_key = ДобавÑне на SSH ключ +account = Ðкаунт +update_avatar = ОбновÑване на профилната Ñнимка +ssh_gpg_keys = SSH / GPG ключове +comment_type_group_milestone = Етап +manage_emails = Управление на адреÑите на ел. поща +permission_read = Четене +update_password = ОбновÑване на паролата +biography_placeholder = Разкажете на другите малко за Ñебе Ñи! (Можете да използвате Маркдаун) +orgs = Организации +continue = Продължаване +blocked_users = Блокирани потребители +emails = ÐдреÑи на ел. поща +update_profile = ОбновÑване на профила +profile = Профил +change_password = ПромÑна на паролата +retype_new_password = Потвърдете новата парола +choose_new_avatar = Изберете нова профилна Ñнимка +delete_current_avatar = Изтриване на текущата профилна Ñнимка +gpg_key_deletion_success = GPG ключът е премахнат. +permission_no_access = Без доÑтъп +ssh_key_deletion_success = SSH ключът е премахнат. +comment_type_group_project = Проект +update_language_success = Езикът е обновен. +add_key_success = SSH ключът „%s“ е добавен. +add_gpg_key_success = GPG ключът „%s“ е добавен. +user_unblock_success = ПотребителÑÑ‚ е отблокиран уÑпешно. +user_block_success = ПотребителÑÑ‚ е блокиран уÑпешно. +update_profile_success = Профилът ви е обновен. +update_user_avatar_success = Профилната Ñнимка на Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ðµ обновена. +remove_oauth2_application_success = Приложението е изтрито. +email_deletion_success = ÐдреÑÑŠÑ‚ на ел. поща е премахнат. +update_avatar_success = Профилната ви Ñнимка е обновена. +change_username = ПотребителÑкото ви име е променено. +comment_type_group_assignee = Изпълнител +enable_custom_avatar = Използване на перÑонализирана профилна Ñнимка +requires_activation = ИзиÑква активиране +activated = Ðктивиран +primary = ОÑновен +email_deletion = Премахване на адреÑа на ел. поща +add_new_email = ДобавÑне на нов Ð°Ð´Ñ€ÐµÑ Ð½Ð° ел. поща +add_email = ДобавÑне на Ð°Ð´Ñ€ÐµÑ Ð½Ð° ел. поща +key_content_gpg_placeholder = Започва Ñ â€ž-----BEGIN PGP PUBLIC KEY BLOCK-----“ +comment_type_group_title = Заглавие +comment_type_group_label = Етикет +change_username_prompt = Забележка: ПромÑната на потребителÑкото ви име Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ñ Ñъщо URL на Ð²Ð°ÑˆÐ¸Ñ Ð°ÐºÐ°ÑƒÐ½Ñ‚. +update_language_not_found = Езикът „%s“ не е наличен. +keep_activity_private_popup = Вашата дейноÑÑ‚ ще бъде видима Ñамо за Ð²Ð°Ñ Ð¸ админиÑтраторите на Ñайта +uploaded_avatar_not_a_image = КачениÑÑ‚ файл не е изображение. +uploaded_avatar_is_too_big = Размерът на ÐºÐ°Ñ‡ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð» (%d KiB) надвишава макÑÐ¸Ð¼Ð°Ð»Ð½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€ (%d KiB). +change_password_success = Паролата ви е обновена. Влизайте Ñ Ð½Ð¾Ð²Ð°Ñ‚Ð° Ñи парола от Ñега нататък. +manage_themes = Тема по подразбиране +manage_openid = OpenID адреÑи +primary_email = Да е оÑновен +keep_email_private = Скриване на адреÑа на ел. поща +theme_update_error = Избраната тема не ÑъщеÑтвува. +theme_update_success = Темата ви е обновена. +key_content_ssh_placeholder = Започва Ñ â€žssh-ed25519“, „ssh-rsa“, „ecdsa-sha2-nistp256“, „ecdsa-sha2-nistp384“, „ecdsa-sha2-nistp521“, „sk-ecdsa-sha2-nistp256@openssh.com“, или „sk-ssh-ed25519@openssh.com“ +hide_openid = Скриване от профила +key_content = Съдържание +ssh_key_deletion = Премахване на SSH ключ +gpg_key_deletion = Премахване на GPG ключ +key_name = Име на ключа +key_id = ID на ключа +show_openid = Показване в профила +visibility.public = Публична +visibility.limited = Ограничена +visibility.private = ЧаÑтна +location_placeholder = Споделете приблизителното Ñи меÑтоположение Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ‚Ðµ +key_signature_gpg_placeholder = Започва Ñ â€ž-----BEGIN PGP SIGNATURE-----“ +key_signature_ssh_placeholder = Започва Ñ â€ž-----BEGIN SSH SIGNATURE-----“ +saved_successfully = ÐаÑтройките бÑха запазени уÑпешно. +no_activity = ÐÑма Ñкорошна дейноÑÑ‚ +theme_desc = Тази тема ще Ñе използва за уеб интерфейÑа, когато Ñте влезли. +keep_activity_private = Скриване на дейноÑтта от профилната Ñтраница +lookup_avatar_by_mail = ТърÑене на профилна Ñнимка по адреÑа на ел. поща +password_incorrect = Текущата парола е неправилна. +change_username_redirect_prompt = Старото потребителÑко име ще Ñе пренаÑочва, докато нÑкой не го вземе. +principal_content = Съдържание +manage_ssh_principals = Управление на SSH Certificate Principals +twofa_disabled = Двуфакторното удоÑтоверÑване е изключено. +orgs_none = Ðе Ñте учаÑтник в никакви организации. +repos_none = Ðе притежавате никакви хранилища. +blocked_users_none = ÐÑма блокирани потребители. +profile_desc = ВашиÑÑ‚ профил +permission_write = Четене и пиÑане +twofa_disable = Изключване на двуфакторното удоÑтоверÑване +twofa_enroll = Включване на двуфакторно удоÑтоверÑване +ssh_key_name_used = Вече ÑъщеÑтвува SSH ключ ÑÑŠÑ Ñъщото име във Ð²Ð°ÑˆÐ¸Ñ Ð°ÐºÐ°ÑƒÐ½Ñ‚. +email_notifications.enable = Включване на извеÑтиÑта по ел. поща +delete_prompt = Тази Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ‰Ðµ изтрие перманентно потребителÑÐºÐ¸Ñ Ð²Ð¸ акаунт. Това ÐЕ МОЖЕ да бъде отменено. +email_notifications.disable = Изключване на извеÑтиÑта по ел. поща +delete_account = Изтриване на акаунта ви +confirm_delete_account = Потвърждаване на изтриването +email_notifications.onmention = Ел. поща Ñамо при Ñпоменаване +pronouns_unspecified = ÐепоÑочени +pronouns = МеÑÑ‚Ð¾Ð¸Ð¼ÐµÐ½Ð¸Ñ +gpg_token_code = echo "%s" | gpg -a --default-key %s --detach-sig +language.title = Език по подразбиране +language.localization_project = Помогнете ни да преведем Forgejo на Ð²Ð°ÑˆÐ¸Ñ ÐµÐ·Ð¸Ðº! Ðаучете повече. +language.description = Този език ще бъде запазен във Ð²Ð°ÑˆÐ¸Ñ Ð°ÐºÐ°ÑƒÐ½Ñ‚ и ще Ñе използва като език по подразбиране, Ñлед като влезете. +pronouns_custom = ПерÑонализирани +visibility.limited_tooltip = Видимо Ñамо за влезли потребители +pronouns_custom_label = ПерÑонализирани меÑÑ‚Ð¾Ð¸Ð¼ÐµÐ½Ð¸Ñ + +[packages] +container.labels.value = СтойноÑÑ‚ +alpine.repository.repositories = Хранилища +dependency.version = ВерÑÐ¸Ñ +title = Пакети +empty = Ð’Ñе още нÑма пакети. +empty.documentation = За повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð½Ð¾Ñно региÑтъра на пакетите вижте документациÑта. +container.labels.key = Ключ +requirements = ИзиÑÐºÐ²Ð°Ð½Ð¸Ñ +details = ПодробноÑти +details.license = Лиценз +container.labels = Етикети +versions = ВерÑии +empty.repo = Качихте ли пакет, но той не Ñе показва тук? Отидете в наÑтройките за пакети и го Ñвържете към това хранилище. +keywords = Ключови думи +details.author = Ðвтор +about = ОтноÑно този пакет +settings.delete.success = Пакетът е изтрит. +settings.delete = Изтриване на пакета +container.details.platform = Платформа +settings.delete.error = ÐеуÑпешно изтриване на пакет. +installation = ИнÑÑ‚Ð°Ð»Ð°Ñ†Ð¸Ñ +versions.view_all = Вижте вÑички +dependencies = ЗавиÑимоÑти +published_by_in = Публикуван %[1]s от %[3]s в %[5]s +published_by = Публикуван %[1]s от %[3]s +generic.download = Изтеглете пакета от ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¸Ñ Ñ€ÐµÐ´: +container.details.type = Тип образ +alpine.repository = За хранилището +container.images.title = Образи + +[tool] +hours = %d чаÑа +now = Ñега +raw_seconds = Ñекунди +1m = 1 минута +1s = 1 Ñекунда +months = %d меÑеца +weeks = %d Ñедмици +1w = 1 Ñедмица +years = %d години +seconds = %d Ñекунди +days = %d дни +1d = 1 ден +minutes = %d минути +1mon = 1 меÑец +1h = 1 Ñ‡Ð°Ñ +1y = 1 година +future = бъдеще +raw_minutes = минути [repo] issues.context.edit = Редактиране @@ -399,7 +404,7 @@ issues.keyword_search_unavailable = Ð’ момента търÑенето по к repo_desc_helper = Въведете кратко опиÑание (опционално) mirror_address = Клониране от URL owner_helper = ÐÑкои организации може да не Ñе показват в падащото меню поради ограничение за макÑимален брой хранилища. -new_repo_helper = Хранилището Ñъдържа вÑички файлове на проекта, включително хронологиÑта на ревизиите. Вече хоÑтвате хранилище другаде? Мигрирайте хранилище. +new_repo_helper = Хранилището Ñъдържа вÑички файлове на проекта, включително хронологиÑта на ревизиите. Вече хоÑтвате хранилище другаде? Мигрирайте хранилище. repo_name_helper = Добрите имена на хранилища използват кратки, запомнÑщи Ñе и уникални ключови думи. migrated_from = Мигрирано от %[2]s visibility_description = Само притежателÑÑ‚ или учаÑтниците в организациÑта, ако имат права, ще могат да го видÑÑ‚. @@ -426,14 +431,14 @@ settings.add_webhook = ДобавÑне на уеб-кука template.webhooks = Уеб-куки issues.label_templates.info = Ð’Ñе още нÑма етикети. Създайте етикет Ñ â€žÐов етикет“ или използвайте предварително зададен набор от етикети: labels = Етикети -license_helper_desc = Лицензът Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ ÐºÐ°ÐºÐ²Ð¾ могат и какво не могат да правÑÑ‚ другите Ñ Ð²Ð°ÑˆÐ¸Ñ ÐºÐ¾Ð´. Ðе Ñте Ñигурни кой е подходÑщ за Ð²Ð°ÑˆÐ¸Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚? Вижте Избиране на лиценз. +license_helper_desc = Лицензът Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ ÐºÐ°ÐºÐ²Ð¾ могат и какво не могат да правÑÑ‚ другите Ñ Ð²Ð°ÑˆÐ¸Ñ ÐºÐ¾Ð´. Ðе Ñте Ñигурни кой е подходÑщ за Ð²Ð°ÑˆÐ¸Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚? Вижте Избиране на лиценз. issues.choose.blank = По подразбиране settings.hooks = Уеб-куки issue_labels = Етикети issue_labels_helper = Изберете набор от етикети readme_helper_desc = Това е мÑÑтото, където можете да напишете пълно опиÑание на Ð²Ð°ÑˆÐ¸Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚. repo_gitignore_helper = Изберете .gitignore шаблони -auto_init = Да Ñе инициализира хранилище (Ð”Ð¾Ð±Ð°Ð²Ñ .gitignore, License и README) +auto_init = Да Ñе инициализира хранилище template.issue_labels = Етикети за задачите migrate_items_labels = Етикети issues.label_templates.title = Зареждане на предв. зададен набор от етикети @@ -632,9 +637,9 @@ editor.file_delete_success = Файлът „%s“ е изтрит. projects.type.uncategorized = Ðекатегоризирано projects.column.set_default = Задаване по подразбиране projects.column.assigned_to = Възложено на -issues.reopen_comment_issue = Коментиране и отварÑне +issues.reopen_comment_issue = ОтварÑне наново Ñ ÐºÐ¾Ð¼ÐµÐ½Ñ‚Ð°Ñ€ issues.reopen_issue = ОтварÑне наново -issues.close_comment_issue = Коментиране и ЗатварÑне +issues.close_comment_issue = ЗатварÑне Ñ ÐºÐ¾Ð¼ÐµÐ½Ñ‚Ð°Ñ€ milestones.filter_sort.latest_due_date = Ðай-далечен краен Ñрок diff.view_file = Преглед на файла release.deletion_success = Изданието е изтрито. @@ -817,7 +822,7 @@ diff.browse_source = Разглеждане на Ð¸Ð·Ñ…Ð¾Ð´Ð½Ð¸Ñ ÐºÐ¾Ð´ file_view_rendered = Преглед на Ð²Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ issues.lock_with_reason = заключи като %s и ограничи обÑъждането до Ñътрудници %s milestones.new_subheader = Етапите ви помагат да управлÑвате задачите и да проÑледÑвате напредъка им. -release.edit = редактиране +release.edit = Редактиране activity.published_release_label = Издание activity.navbar.contributors = ДопринеÑли pulls.recently_pushed_new_branches = ИзтлаÑкахте в клона %[1]s %[2]s @@ -833,7 +838,8 @@ file_too_large = Файлът е твърде голÑм, за да бъде п commits = ÐŸÐ¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ commit = Подаване editor.commit_changes = Подаване на промените -editor.add_tmpl = ДобавÑне на "<име на файла>" +editor.add_tmpl = ДобавÑне на "<%s>" +editor.add_tmpl.filename = име на файла editor.add = ДобавÑне на %s editor.delete = Изтриване на %s editor.update = ОбновÑване на %s @@ -845,7 +851,7 @@ editor.propose_file_change = Предлагане на промÑна на фа editor.create_new_branch = Създаване на нов клон за това подаване и започване на заÑвка за Ñливане. editor.create_new_branch_np = Създаване на нов клон за това подаване. editor.filename_is_invalid = Името на файла е невалидно: „%s“. -editor.commit_directly_to_this_branch = Подаване директно към клона %s. +editor.commit_directly_to_this_branch = Подаване директно към клона %[1]s. editor.branch_already_exists = Клонът „%s“ вече ÑъщеÑтвува в това хранилище. editor.file_already_exists = Файл Ñ Ð¸Ð¼Ðµ „%s“ вече ÑъщеÑтвува в това хранилище. editor.commit_empty_file_header = Подаване на празен файл @@ -940,7 +946,7 @@ pulls.approve_count_1 = %d одобрение pulls.can_auto_merge_desc = Тази заÑвка за Ñливане може да бъде ÑлÑта автоматично. pulls.num_conflicting_files_1 = %d конфликтен файл activity.git_stats_commit_n = %d Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ -settings.event_issues = Задачи +settings.event_issues = Изменение branch.delete_head = Изтриване branch.delete = Изтриване на клона „%s“ branch.delete_html = Изтриване на клона @@ -996,7 +1002,7 @@ pulls.cmd_instruction_hint = Вижте инÑтрукциите за коман pulls.showing_only_single_commit = Показани Ñа Ñамо промените в подаване %[1]s issues.lock_no_reason = заключи и ограничи обÑъждането до Ñътрудници %s pulls.expand_files = Разгъване на вÑички файлове -pulls.title_desc_few = иÑка да Ñлее %[1]d Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ð¾Ñ‚ %[2]s в %[3]s +pulls.title_desc_few = иÑка да Ñлее %[1]d Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ð¾Ñ‚ %[2]s в %[3]s issues.content_history.deleted = изтрито activity.git_stats_exclude_merges = С изключение на ÑливаниÑта, activity.navbar.pulse = ПоÑледна дейноÑÑ‚ @@ -1016,11 +1022,11 @@ pulls.collapse_files = Свиване на вÑички файлове pulls.show_all_commits = Показване на вÑички Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ diff.whitespace_button = Празни знаци issues.content_history.edited = редактирано -pulls.title_desc_one = иÑка да Ñлее %[1]d подаване от %[2]s в %[3]s +pulls.title_desc_one = иÑка да Ñлее %[1]d подаване от %[2]s в %[3]s pulls.showing_specified_commit_range = Показани Ñа Ñамо промените между %[1]s..%[2]s pulls.merged_title_desc_one = ÑÐ»Ñ %[1]d подаване от %[2]s в %[3]s %[4]s pulls.no_merge_access = Ðе Ñте упълномощени за Ñливане на тази заÑвка за Ñливане. -activity.navbar.code_frequency = ЧеÑтота на кода +activity.navbar.code_frequency = ЧеÑтота на промените activity.git_stats_pushed_1 = е изтлаÑкал activity.git_stats_push_to_branch = към %s и contributors.contribution_type.commits = ÐŸÐ¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ @@ -1081,11 +1087,11 @@ pulls.commit_ref_at = `Ñпомена тази заÑвка за Ñливане issues.change_ref_at = `промени препратката от %s на %s %s` diff.review.reject = ПоиÑкване на промени diff.bin_not_shown = ДвоичниÑÑ‚ файл не е показан. -settings.units.units = Елементи на хранилището +settings.units.units = Елементи settings.delete_notices_fork_1 = - РазклонениÑта на това хранилище ще Ñтанат незавиÑими Ñлед изтриване. settings.actions_desc = Включване на интегрираните CI/CD pipelines Ñ Forgejo Actions settings.packages_desc = Включване на региÑтъра на пакетите за хранилището -settings.units.add_more = ДобавÑне... +settings.units.add_more = Включване на повече settings.use_external_issue_tracker = Използване на външен тракер за задачи settings.releases_desc = Включване на изданиÑта за хранилището settings.projects_desc = Включване на проектите за хранилището @@ -1114,7 +1120,7 @@ pulls.reject_count_1 = %d поиÑкана промÑна issues.review.show_resolved = Показване на решено issues.review.hide_resolved = Скриване на решено issues.review.resolve_conversation = Решаване на обÑъждането -diff.comment.markdown_info = Поддържа Ñе Ñтилизиране Ñ markdown. +diff.comment.markdown_info = Поддържа Ñе Ñтилизиране Ñ ÐœÐ°Ñ€ÐºÐ´Ð°ÑƒÐ½. diff.file_suppressed = Разликите не Ñа показани, защото Ñа твърде много pulls.reject_count_n = %d поиÑкани промени settings.pulls.default_allow_edits_from_maintainers = ПозволÑване на редакции от поддържащите по подразбиране @@ -1183,6 +1189,107 @@ diff.hide_file_tree = Скриване на файловото дърво tag.ahead.target = в %s Ñлед този маркер diff.file_image_width = Широчина activity.unresolved_conv_label = Отворено +invisible_runes_line = `Този ред Ñъдържа невидими Уникод знаци` +code.desc = ДоÑтъп до Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð½Ð¸Ñ ÐºÐ¾Ð´, файловете, подаваниÑта и клоновете. +settings.branches.update_default_branch = ОбновÑване на ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ ÐºÐ»Ð¾Ð½ +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]` +invisible_runes_header = `Този файл Ñъдържа невидими Уникод знаци` +issues.all_title = Общо +issues.new.assign_to_me = Възлагане на мен +ext_wiki = Външно уики +ext_issues = Външни задачи +readme_helper = Изберете шаблон за файл README +settings.event_pull_request_review_desc = ЗаÑвка за Ñливане е одобрена, отхвърлена или Ñа добавени рецензионни коментари. +settings.event_pull_request_review = Рецензии +issues.filter_sort.relevance = СъответÑтвие +settings.confirm_wiki_branch_rename = Преименуване на клона на уикито +settings.webhook.request = ЗаÑвка +settings.webhook.response = Отговор +settings.event_create = Създаване +settings.event_push_only = Ð¡ÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ð¿Ñ€Ð¸ изтлаÑкване +settings.event_delete = Изтриване +settings.event_header_repository = Ð¡ÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ð·Ð° хранилището +settings.event_fork_desc = Хранилище е разклонено. +settings.event_fork = РазклонÑване +settings.event_wiki_desc = Уики Ñтраница е Ñъздадена, преименувана, редактирана или изтрита. +settings.event_issue_milestone = Етапи +settings.event_pull_request_milestone_desc = Етап е добавен, премахнат или изменен. +settings.event_pull_request_label_desc = Етикети на заÑвка за Ñливане Ñа добавени или премахнати. +settings.event_pull_request_merge = Сливане на заÑвка за Ñливане +settings.archive.tagsettings_unavailable = ÐаÑтройките за маркери не Ñа налични в архивирани хранилища. +settings.event_desc = ЗадейÑтване при: +settings.event_create_desc = Клон или маркер е Ñъздаден. +generate_from = Генериране от +settings.event_push_desc = Git изтлаÑкване към хранилище. +settings.event_package = Пакет +settings.event_pull_request_label = Етикети +settings.event_pull_request_assign_desc = ЗаÑвка за Ñливане е възложена или отвъзложена. +settings.event_choose = ПерÑонализирани ÑъбитиÑ… +settings.event_header_issue = Ð¡ÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ð¿Ñ€Ð¸ задачи +fork_no_valid_owners = Това хранилище не може да бъде разклонено, защото нÑма валидни притежатели. +settings.unarchive.text = Разархивирането на хранилище ще възÑтанови ÑпоÑобноÑтта му да получава Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ð¸ изтлаÑкваниÑ, както и нови задачи и заÑвки за Ñливане. +settings.archive.branchsettings_unavailable = ÐаÑтройките за клонове не Ñа налични в архивирани хранилища. +settings.event_send_everything = Ð’Ñички ÑÑŠÐ±Ð¸Ñ‚Ð¸Ñ +settings.event_pull_request_approvals = ÐžÐ´Ð¾Ð±Ñ€ÐµÐ½Ð¸Ñ Ð½Ð° заÑвка за Ñливане +release.invalid_external_url = Ðевалиден външен URL адреÑ: "%s" +settings.event_delete_desc = Клон или маркер е изтрит. +settings.discord_icon_url = URL Ð°Ð´Ñ€ÐµÑ Ð½Ð° иконка +settings.discord_icon_url.exceeds_max_length = URL адреÑÑŠÑ‚ на иконката трÑбва да е по-малък или равен на 2048 знака +settings.event_push = ИзтлаÑкване +settings.event_repository_desc = Хранилище е Ñъздадено или изтрито. +settings.slack_icon_url = URL Ð°Ð´Ñ€ÐµÑ Ð½Ð° иконка +settings.event_issue_comment = Коментари +settings.event_pull_request_desc = ЗаÑвка за Ñливане е отворена, затворена, отворена наново или редактирана. +settings.event_issue_comment_desc = Коментар на задача е Ñъздаден, редактиран или изтрит. +settings.event_release_desc = Издание е публикувано, обновено или изтрито в хранилище. +settings.event_pull_request_review_request = ИÑÐºÐ°Ð½Ð¸Ñ Ð·Ð° Ñ€ÐµÑ†ÐµÐ½Ð·Ð¸Ñ +settings.event_pull_request_enforcement = Принудително изпълнение +diff.git-notes.remove-header = Премахване на бележката +diff.git-notes.add = ДобавÑне на бележка +settings.event_pull_request_assign = Възлагане +new_advanced_expand = Щракнете за разгъване +new_advanced = Разширени наÑтройки +new_from_template = Използване на шаблон +new_from_template_description = Можете да изберете ÑъщеÑтвуващо шаблонно хранилище в тази инÑÑ‚Ð°Ð½Ñ†Ð¸Ñ Ð¸ да приложите неговите наÑтройки. +settings.event_pull_request_comment = Коментари +repo_gitignore_helper_desc = Изберете кои файлове да не Ñе проÑледÑват от ÑпиÑък Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¸ за обичайните езици. Типичните артефакти, генерирани от инÑтрументите за изграждане, Ñа включени в .gitignore по подразбиране. +object_format_helper = Формат на обектите на хранилището. Ðе може да Ñе Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ñ Ð¿Ð¾-къÑно. SHA1 е най-ÑъвмеÑтим. +issues.num_reviews_one = %d Ñ€ÐµÑ†ÐµÐ½Ð·Ð¸Ñ +settings.event_pull_request = Изменение +settings.event_issue_label = Етикети +settings.event_issue_assign = Възлагане +settings.event_header_pull_request = Ð¡ÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ð¿Ñ€Ð¸ заÑвка за Ñливане +settings.event_issue_milestone_desc = Етап е добавен, премахнат или изменен. +settings.event_issue_label_desc = Етикети на задача Ñа добавени или премахнати. +settings.event_issues_desc = Задача е отворена, затворена, отворена наново или редактирана. +settings.webhook.headers = Заглавки +settings.webhook.body = ТÑло +settings.event_pull_request_sync = Синхронизирано +settings.event_pull_request_sync_desc = Клонът е обновен автоматично Ñ Ñ†ÐµÐ»ÐµÐ²Ð¸Ñ ÐºÐ»Ð¾Ð½. +settings.event_package_desc = Пакет е Ñъздаден или изтрит в хранилище. +template_description = Шаблонните хранилища позволÑват на потребителите да генерират нови хранилища ÑÑŠÑ Ñъщата Ñтруктура на директориите, файлове и опционални наÑтройки. +auto_init_description = ПоÑтавете началото на Git иÑториÑта Ñ README и по избор добавете файлове License и .gitignore. +pulls.sign_in_require = Влезте, за да Ñъздадете нова заÑвка за Ñливане. +issues.num_reviews_few = %d рецензии +diff.git-notes.remove-body = Тази бележка ще бъде премахната. +issues.review.add_remove_review_requests = поиÑка рецензии от %[1]s и премахна заÑвки за Ñ€ÐµÑ†ÐµÐ½Ð·Ð¸Ñ Ð·Ð° %[2]s %[3]s +form.name_pattern_not_allowed = Шаблонът "%s" не е разрешен в име на хранилище. +settings.wiki_rename_branch_main_notices_2 = Това ще преименува перманентно Ð²ÑŠÑ‚Ñ€ÐµÑˆÐ½Ð¸Ñ ÐºÐ»Ð¾Ð½ на уикито на хранилището %s. СъщеÑтвуващите изтеглÑÐ½Ð¸Ñ Ñ‰Ðµ трÑбва да бъдат обновени. +settings.event_pull_request_milestone = Етапи +settings.event_pull_request_comment_desc = ЗаÑвка за Ñливане е Ñъздадена, редактирана или изтрита. +settings.event_issue_assign_desc = Задача е възложена или отвъзложена. +settings.event_pull_request_review_request_desc = Ð ÐµÑ†ÐµÐ½Ð·Ð¸Ñ Ð½Ð° заÑвка за Ñливане е поиÑкана или е премахната. +generate_repo = Генериране на хранилище +default_branch_helper = СтандартниÑÑ‚ клон е оÑÐ½Ð¾Ð²Ð½Ð¸Ñ ÐºÐ»Ð¾Ð½ за заÑвки за Ñливане и Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ð½Ð° код. +issues.reaction.add = ДобавÑне на Ñ€ÐµÐ°ÐºÑ†Ð¸Ñ +issues.reaction.alt_few = %[1]s реагира Ñ %[2]s. +issues.reaction.alt_many = %[1]s и още %[2]d реагираха Ñ %[3]s. +issues.reaction.alt_add = ДобавÑне на Ñ€ÐµÐ°ÐºÑ†Ð¸Ñ %[1]s към коментара. +issues.reaction.alt_remove = Премахване на Ñ€ÐµÐ°ÐºÑ†Ð¸Ñ %[1]s от коментара. [modal] confirm = Потвърждаване @@ -1206,6 +1313,12 @@ buttons.italic.tooltip = ДобавÑне на курÑив текÑÑ‚ buttons.link.tooltip = ДобавÑне на връзка buttons.disable_monospace_font = Изключване на Ñ€Ð°Ð²Ð½Ð¾ÑˆÐ¸Ñ€Ð¾ÐºÐ¸Ñ ÑˆÑ€Ð¸Ñ„Ñ‚ buttons.ref.tooltip = Препратка към задача или заÑвка за Ñливане +table_modal.label.columns = Колони +table_modal.label.rows = Редове +table_modal.placeholder.content = Съдържание +table_modal.placeholder.header = Заглавка +buttons.new_table.tooltip = ДобавÑне на таблица +table_modal.header = ДобавÑне на таблица [org] teams.write_access = ПиÑане @@ -1237,7 +1350,7 @@ settings.visibility.public = Публична settings.visibility.limited_shortname = Ограничена settings.visibility.private_shortname = ЧаÑтна settings.permission = Ð Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ -settings.visibility.limited = Ограничена (видима Ñамо за удоÑтоверени потребители) +settings.visibility.limited = Ограничена (видима Ñамо за влезли потребители) settings.visibility.private = ЧаÑтна (видима Ñамо за учаÑтниците в организациÑта) org_name_helper = Имената на организациите е добре да Ñа кратки и запомнÑщи Ñе. org_full_name_holder = Пълно име на организациÑта @@ -1279,6 +1392,7 @@ members.member = УчаÑтник members.private_helper = Да е видим teams.no_desc = Този екип нÑма опиÑание settings.delete_org_desc = Тази Ð¾Ñ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ‰Ðµ бъде изтрита перманентно. Продължаване? +open_dashboard = ОтварÑне на таблото [install] admin_password = Парола @@ -1317,6 +1431,9 @@ err_empty_admin_email = ÐдминиÑтраторÑкиÑÑ‚ Ð°Ð´Ñ€ÐµÑ Ð½Ð° е password_algorithm = Ðлгоритъм за хеш. на паролите default_keep_email_private = Скриване на адреÑите на ел. поща по подразбиране invalid_password_algorithm = Ðевалиден алгоритъм за хеш. на паролите +err_admin_name_is_reserved = ПотребителÑкото име на админиÑтратора е невалидно, потребителÑкото име е резервирано +err_admin_name_pattern_not_allowed = ПотребителÑкото име на админиÑтратора е невалидно, потребителÑкото име ÑъответÑтва Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð¸Ñ€Ð°Ð½ шаблон +err_admin_name_is_invalid = ПотребителÑкото име на админиÑтратора е невалидно [filter] string.asc = Ð - Я @@ -1348,6 +1465,14 @@ activate_account.text_1 = Здравейте, %[1]s, благодарим activate_email.text = МолÑ, щракнете върху Ñледната връзка, за да потвърдите ÑÐ²Ð¾Ñ Ð°Ð´Ñ€ÐµÑ Ð½Ð° ел. поща в рамките на %s: activate_email = Потвърдете ÑÐ²Ð¾Ñ Ð°Ð´Ñ€ÐµÑ Ð½Ð° ел. поща activate_account.text_2 = МолÑ, щракнете върху Ñледната връзка, за да активирате ÑÐ²Ð¾Ñ Ð°ÐºÐ°ÑƒÐ½Ñ‚ в рамките на %s: +issue_assigned.issue = @%[1]s ви възложи задача %[2]s в хранилище %[3]s. +issue.action.push_n = @%[1]s изтлаÑка %[3]d Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ ÐºÑŠÐ¼ %[2]s +issue.action.push_1 = @%[1]s изтлаÑка %[3]d подаване към %[2]s +repo.transfer.subject_to_you = %s иÑка да прехвърли хранилище "%s" към Ð²Ð°Ñ +issue.action.merge = @%[1]s ÑÐ»Ñ #%[2]d в %[3]s. +issue_assigned.pull = @%[1]s ви възложи заÑвката за Ñливане %[2]s в хранилище %[3]s. +issue.action.ready_for_review = @%[1]s отбелÑза тази заÑвка за Ñливане като готова за рецензиране. +repo.transfer.subject_to = %s иÑка да прехвърли хранилище "%s" към %s [user] joined_on = ПриÑъединени на %s @@ -1378,6 +1503,10 @@ followers.title.few = ПоÑледователи followers.title.one = ПоÑледовател following.title.one = Следван following.title.few = Следвани +public_activity.visibility_hint.self_public = Вашата дейноÑÑ‚ е видима за вÑички, Ñ Ð¸Ð·ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ðµ на взаимодейÑтвиÑта в чаÑтни проÑтранÑтва. Конфигуриране. +form.name_pattern_not_allowed = Шаблонът "%s" не е разрешен в потребителÑко име. +form.name_reserved = ПотребителÑкото име "%s" е резервирано. +public_activity.visibility_hint.self_private_profile = Вашата дейноÑÑ‚ е видима Ñамо за Ð²Ð°Ñ Ð¸ админиÑтраторите на инÑтанциÑта, тъй като вашиÑÑ‚ профил е чаÑтен. Конфигуриране. [home] filter = Други филтри @@ -1544,6 +1673,8 @@ push_tag = изтлаÑка маркер %[3]s към %[3]s#%[2]s` reject_pull_request = `предложи промени за %[3]s#%[2]s` compare_branch = СравнÑване +compare_commits_general = СравнÑване на Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ +compare_commits = Сравнете %d Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ [auth] tab_openid = OpenID @@ -1572,6 +1703,12 @@ tab_signin = Влизане tab_signup = РегиÑтриране password_pwned = Паролата, коÑто Ñте избрали, е в ÑпиÑък Ñ Ð¾Ñ‚ÐºÑ€Ð°Ð´Ð½Ð°Ñ‚Ð¸ пароли, разкрити преди това при публични пробиви на данни. МолÑ, опитайте отново Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ð° парола. confirmation_mail_sent_prompt = Ðово ел. пиÑмо за потвърждение е изпратено до %s. За да завършите процеÑа на региÑтрациÑ, молÑ, проверете входÑщата Ñи ÐºÑƒÑ‚Ð¸Ñ Ð¸ поÑледвайте предоÑтавената връзка в рамките на Ñледващите %s. Ðко адреÑÑŠÑ‚ за ел. поща е неправилен, можете да влезете и да поиÑкате друго ел. пиÑмо за потвърждение да бъде изпратено на различен адреÑ. +hint_login = Вече имате акаунт? Влезте! +hint_register = Ðуждаете Ñе от акаунт? РегиÑтрирайте Ñе. +sign_up_button = РегиÑтрирайте Ñе. +back_to_sign_in = Ðазад към Вход +sign_in_openid = Продължаване Ñ OpenID +send_reset_mail = Изпращане на ел. пиÑмо за възÑтановÑване [aria] footer.software = ОтноÑно този Ñофтуер @@ -1582,7 +1719,7 @@ footer = Долен колонтитул install = ЛеÑен за инÑталиране lightweight = Лек license = Отворен код -install_desc = ПроÑто Ñтартирайте Ð´Ð²Ð¾Ð¸Ñ‡Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð» за вашата платформа, използвайте Docker, или го получете пакетирано. +install_desc = ПроÑто Ñтартирайте Ð´Ð²Ð¾Ð¸Ñ‡Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð» за вашата платформа, използвайте Docker, или го получете пакетиран. app_desc = Безпроблемна Git уÑлуга ÑÑŠÑ ÑамоÑтоÑтелен хоÑтинг platform = Междуплатформен lightweight_desc = Forgejo има ниÑки минимални изиÑÐºÐ²Ð°Ð½Ð¸Ñ Ð¸ може да работи на икономичен Raspberry Pi. СпеÑтете енергиÑта на вашата машина! @@ -1639,6 +1776,10 @@ variables.creation = ДобавÑне на променлива variables.deletion.failed = ÐеуÑпешно премахване на променлива. runners.task_list.repository = Хранилище runners.description = ОпиÑание +runs.no_workflows.help_no_write_access = За да научите повече за Forgejo Actions, вижте документациÑта. +variables.management = Управление на променливи +variables.not_found = Променливата не е открита. +variables.id_not_exist = Променлива Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€ %d не ÑъщеÑтвува. [heatmap] less = По-малко @@ -1670,9 +1811,11 @@ contributors.what = приноÑи recent_commits.what = Ñкорошни Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ component_loading = Зареждане на %s... component_loading_info = Това може да отнеме извеÑтно време… +code_frequency.what = чеÑтота на промените [projects] type-1.display_name = Индивидуален проект +deleted.display_name = Изтрит проект [search] @@ -1707,4 +1850,4 @@ eib = ЕиБ [translation_meta] -test = окей \ No newline at end of file +test = окей diff --git a/options/locale/locale_bn.ini b/options/locale/locale_bn.ini index 8741fee98c..2155f9073c 100644 --- a/options/locale/locale_bn.ini +++ b/options/locale/locale_bn.ini @@ -1,6 +1,8 @@ - - - [common] help = সাহাযà§à¦¯ -dashboard = ডà§à¦¯à¦¾à¦¶à¦¬à§‹à¦°à§à¦¡ \ No newline at end of file +dashboard = ডà§à¦¯à¦¾à¦¶à¦¬à§‹à¦°à§à¦¡ +home = বাড়ি +explore = দেখোণ +logo = লোগো +sign_in = সাইণ ইণ +sign_in_or = বা \ No newline at end of file diff --git a/options/locale/locale_bs.ini b/options/locale/locale_bs.ini index bec7a65005..78eb7daa33 100644 --- a/options/locale/locale_bs.ini +++ b/options/locale/locale_bs.ini @@ -1,6 +1,3 @@ - - - [common] tracked_time_summary = Sažetak praćenog vremena bazirano na filterima liste problema language = Jezik diff --git a/options/locale/locale_ca.ini b/options/locale/locale_ca.ini index 8b2d944253..9cb7d5e50c 100644 --- a/options/locale/locale_ca.ini +++ b/options/locale/locale_ca.ini @@ -1,13 +1,10 @@ - - - [common] -home = inici +home = Inici dashboard = Panell de control explore = Explorar help = Ajuda logo = Logo -sign_in = Entrar +sign_in = Iniciar sessió sign_in_with_provider = Entra amb %s sign_in_or = o sign_out = Sortir @@ -18,7 +15,7 @@ page = Pàgina template = Plantilla language = Idioma notifications = Notificacions -active_stopwatch = Registre de Temps Actiu +active_stopwatch = Registre de temps actiu create_new = Crear… user_profile_and_more = Perfil i Configuració… signed_in_as = Entrat com @@ -118,7 +115,7 @@ write = Escriure preview = Previsualitzar loading = Carregant… error = Error -error404 = La pàgina a la que estàs intentant arribar no existeix o no estàs autoritzat a veure-la. +error404 = La pàgina a la qual estàs intentant arribar no existeix, ha sigut eliminada o no estàs autoritzat a veure-la. go_back = Tornar Enrere invalid_data = Dades invalides: %v unknown = Desconegut @@ -142,6 +139,13 @@ filter.is_archived = Arxivats filter.not_archived = No arxivats filter.not_fork = No és fork filter.is_fork = Són forks +copy_path = Copiar ruta +new_repo.title = Nou repositori +new_migrate.title = Nova migració +new_org.title = Nova organització +new_repo.link = Nou repositori +new_migrate.link = Nova migració +new_org.link = Nova organització [search] milestone_kind = Cerca fites... @@ -169,6 +173,8 @@ pull_kind = Cerca "pulls"... exact = Exacte exact_tooltip = Inclou només resultats que són exactament el terme de cerca issue_kind = Cerca problemes... +regexp = RegExp +regexp_tooltip = Interpreta el terme de cerca com una expressió regular [heatmap] number_of_contributions_in_the_last_12_months = %s contribucions en els últims 12 mesos @@ -207,7 +213,7 @@ reinstall_error = Estas intentant instaÅ€lar sobre una base de dades existent de reinstall_confirm_message = ReinstaÅ€lar amb una base de dades existent de Forgejo pot causar diferents problemes. En la majoria de casos, s'hauria d'utilitzar l'"app.ini" existent per executar Forgejo. Si saps el que estàs fent, confirma el seguent: no_admin_and_disable_registration = No pot deshabilitar l'autoregistre d'usuaris sense crear un compte d'administrador. err_admin_name_is_reserved = El nom d'usuari "Administrador" no es vàlid: està reservat -smtp_addr = Hoste SMPT +smtp_addr = Hoste SMTP smtp_port = Port SMPT smtp_from = Enviar correu com a mailer_user = Nom d'usuari SMTP @@ -339,6 +345,74 @@ disable_register_mail = Registre amb confirmació per correu deshabilitat. manual_activation_only = Contacti amb l'administrador de lloc per a completar l'activació. remember_me = Recordar aquest dispositiu create_new_account = Registrar compte +reset_password = Recuperació del compte +reset_password_wrong_user = Heu iniciat sessió com a %s, però l'enllaç de recuperació pertany a %s +allow_password_change = Requereix a l'usuari canviar la contrasenya (recomanat) +invalid_code_forgot_password = El codi de confirmació és invàlid o ha caducat. Feu click aquí per a iniciar una sessió nova. +twofa_scratch_used = Ja heu utilitzat el vostre codi de recuperació. Se us ha redirigit a la pàgina de configuració de l'autenticació de doble factor per tal d'eliminar el dispositiu o generar un codi de recuperació nou. +login_userpass = Entra +oauth.signin.error.temporarily_unavailable = Ha fallat l'autorització perquè el servidor d'autenticació no està disponible temporalment. Intenteu-ho de nou més tard. +authorization_failed_desc = Ha fallat l'autorització perquè s'ha detectat una sol·licitud invàlida. Si us plau, contacteu amb el responsable de l'aplicació que heu intentat autoritzar. +authorization_failed = Ha fallat l'autorització +last_admin = No podeu eliminar l'últim usuari administrador. Com a mínim n'hi ha d'haver un. +password_pwned_err = No s'ha pogut completar la sol·licitud a HaveIBeenPwned +forgot_password = Contrasenya oblidada? +reset_password_mail_sent_prompt = S'ha enviat un correu electrònic de confirmació a %s. Per tal de completar el procés de recuperació del compte, reviseu la safata d'entrada i seguiu l'enllaç que se us ha enviat en els següents %s. +prohibit_login = El compte està en suspensió +resent_limit_prompt = Fa poc que heu sol·licitat un correu electrònic d'activació. Si us plau, espereu 3 minuts i torneu a intentar-ho. +has_unconfirmed_mail = Hola %s, la vostra adreça de correu no s'ha confirmat (%s). Si no heu rebut un correu de confirmació o necessiteu que l'enviem de nou, feu clic al botó següent. +change_unconfirmed_email_summary = Canvieu l'adreça de correu on s'envia el correu d'activació. +invalid_code = El codi de confirmació no és vàlid o ha caducat. +invalid_password = La contrasenya no coincideix amb la que es va utilitzar per a crear el compte. +reset_password_helper = Recuperar compte +verify = Verificar +unauthorized_credentials = Les credencials són incorrectes o han caducat. Torneu a executar l'ordre o visiteu %s per a més informació +scratch_code = Codi de recuperació +use_scratch_code = Utilitzar un codi de recuperació +twofa_scratch_token_incorrect = El codi de recuperació és incorrecte. +oauth_signup_title = Completar compte nou +oauth_signup_submit = Completar compte +oauth.signin.error.access_denied = S'ha denegat la sol·licitud d'autorització. +openid_connect_submit = Connectar +openid_connect_title = Entreu a un compte existent +openid_register_title = Crear un compte nou +authorize_application = Autoritzar aplicació +authorize_redirect_notice = Sereu redirigits a %s si autoritzeu aquesta aplicació. +authorize_application_description = Si li concediu l'accés podrà accedir i escriure a tota la informació del vostre compte, inclòs repositoris privats i organitzacions. +authorize_title = Autoritzeu "%s" a accedir al vostre compte? +active_your_account = Activeu el compte +sign_up_successful = S'ha creat el compte correctament. Benvingut! +account_activated = El compte s'ha activat +send_reset_mail = Enviar correu electrònic de recuperació del compte +password_too_short = La longitud de la contrasenya no pot ser inferior a %d caràcters. +oauth_signin_title = Entreu per a autoritzar el compte vinculat +oauth_signin_submit = Vincular compte +disable_forgot_password_mail = La recuperació de comptes està deshabilitada perquè no hi ha configuració de correu electrònic. Si us plau, contacteu amb l'administrador del lloc. +email_domain_blacklisted = No podeu registrar-vos amb el correu electrònic. +hint_login = Ja tens compte? Entra ara! +hint_register = Necessites un compte? Registra't ara. +sign_up_button = Registra't ara. +must_change_password = Actualitza la contrasenya +change_unconfirmed_email_error = No s'ha pogut canviar l'adreça de correu: %v +oauth_signup_tab = Registrar compte nou +back_to_sign_in = Torneu a entrar +openid_signin_desc = Introduïu la URI OpenID. Per exemple: alice.openid.example.org o https://openid.example.org/alice. +authorize_application_created_by = Aquesta aplicació l'ha creat %s. +password_pwned = La contrasenya que heu introduït es troba en una llista de contrasenyes robades exposades en dades filtrades públicament. Si us plau, intenteu-ho de nou amb una contrasenya diferent i considereu modificar aquesta contrasenya a tot arreu on la utilitzeu. +use_onetime_code = Utilitzar un codi d'un sol ús +forgot_password_title = Contrasenya oblidada +confirmation_mail_sent_prompt = S'ha enviat un correu electrònic de confirmació a %s. Per tal de completar el registre, reviseu la safata d'entrada i seguiu l'enllaç que se us ha enviat en els següents %s. Si l'adreça de correu és incorrecta, podreu accedir al compte i demanar d'enviar un altre correu de confirmació a una altra adreça. +prohibit_login_desc = S'ha suspès la interacció del vostre compte amb la instància. Contacteu amb l'administrador per a recuperar-ne l'accés. +change_unconfirmed_email = Si heu proporcionat una direcció de correu incorrecta durant el registre, la podeu canviar aquí baix i se us enviarà una confirmació a l'adreça nova. +resend_mail = Feu clic aquí per tornar a enviar el correu electrònic d'activació +twofa_passcode_incorrect = El codi d'accés és incorrecte. Si heu perdut el dispositiu, useu el codi de recuperació per a entrar. +oauth_signin_tab = Vincular a un compte existent +oauth.signin.error = Hi ha hagut un error processant la sol·licitud d'autorització. Si persisteix, poseu-vos en contacte amb l'administrador del lloc. +disable_forgot_password_mail_admin = La recuperació de comptes només està disponible quan s'ha configurat el correu electrònic. Si us plau, configureu el correu electrònic per a habilitar la recuperació de comptes. +non_local_account = Els usuaris no locals no poden actualitzar la seva contrasenya mitjançant l'interfície web de Forgejo +openid_register_desc = No s'ha reconegut la URI OpenID. Vinculeu-la amb un compte nou aquí. +openid_connect_desc = No s'ha reconegut la URI OpenID. Vinculeu-la amb un compte nou aquí. +sign_in_openid = Accediu amb OpenID [editor] buttons.indent.tooltip = Aniua els elements un nivell @@ -357,6 +431,16 @@ buttons.list.unordered.tooltip = Afegir un llista de punts buttons.list.ordered.tooltip = Afegir una llista enumerada buttons.list.task.tooltip = Afegir una llista de tasques buttons.mention.tooltip = Mencionar un usuari o equip +buttons.new_table.tooltip = Afegir taula +table_modal.header = Afegir taula +table_modal.placeholder.header = Capçalera +table_modal.placeholder.content = Contingut +table_modal.label.rows = Files +table_modal.label.columns = Columnes +link_modal.header = Afegeix un enllaç +link_modal.url = URL +link_modal.description = Descripció +link_modal.paste_reminder = Pista: Amb un enllaç en el teu porta-retalls, pots enganxar-la directament a l'editor per a crear un enllaç. [home] my_orgs = Organitzacions @@ -384,4 +468,19 @@ filter = Altres filtres footer.software = Sobre aquest software footer.links = Enllaços navbar = Barra de navegació -footer = Peu de pàgina \ No newline at end of file +footer = Peu de pàgina + +[mail] +hi_user_x = Hola %s, +view_it_on = Veure a %s +link_not_working_do_paste = No funciona l'enllaç? Proveu a copiar-lo i enganxar-lo al navegador web. +activate_account = Si us plau, activeu el compte +reply = o responeu directament a aquest correu +activate_account.text_1 = Hola %[1]s, gràcies per registrar-te a %[2]s! +register_notify = Benvinguts a %s +admin.new_user.text = Si us plau, cliqueu aui per administrar aquest usuari des del panell d'administració. +admin.new_user.user_info = Informació d'usuari +admin.new_user.subject = Nou usuari %s s'acaba d'enregistrar +activate_email.text = Si us plau, cliqueu el següent enllaç per verificar la vostra adreça de correu electrònic en %s +activate_email = Verifica la teva adreça de correu electrònic +activate_account.text_2 = Si us plau, cliqueu l'enllaç següent per activar el vostre compte en %s: \ No newline at end of file diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index 9ca8c6b387..cd28012f94 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -4,8 +4,8 @@ dashboard=PÅ™ehled explore=Procházet help=NápovÄ›da logo=Logo -sign_in=PÅ™ihlášení -sign_in_with_provider=PÅ™ihlásit se pomocí %s +sign_in=PÅ™ihlásit se +sign_in_with_provider = PÅ™ihlásit se pÅ™es %s sign_in_or=nebo sign_out=Odhlásit se sign_up=Registrace @@ -23,7 +23,7 @@ create_new=VytvoÅ™it… user_profile_and_more=Profil a nastavení… signed_in_as=PÅ™ihlášen/a jako enable_javascript=Tato stránka vyžaduje JavaScript. -toc=Obsah +toc=Tabulka obsahu licenses=Licence return_to_forgejo=Vrátit se do Forgejo @@ -33,7 +33,7 @@ password=Heslo access_token=Přístupový token re_type=Potvrzení hesla captcha=CAPTCHA -twofa=Dvoufaktorové ověřování +twofa=Dvoufázové ověření twofa_scratch=Dvoufaktorový kód passcode=Přístupový kód @@ -112,7 +112,7 @@ preview=Náhled loading=NaÄítání… error=Chyba -error404=Stránka, kterou se snažíte zobrazit, buÄ neexistuje, nebo nemáte oprávnÄ›ní ji zobrazit. +error404=Stránka, kterou se snažíte zobrazit, buÄ neexistuje, byla odstranÄ›na nebo nemáte oprávnÄ›ní ji zobrazit. go_back=ZpÄ›t never=Nikdy @@ -124,8 +124,7 @@ pin=PÅ™ipnout unpin=Odepnout artifacts=Artefakty -confirm_delete_artifact=Jste si jisti, že chcete odstranit artefakt „%s“? - +confirm_delete_artifact = Opravdu chcete odstranit artefakt „%s“? archived=Archivováno concept_system_global=Globální @@ -142,8 +141,6 @@ confirm_delete_selected=Potvrdit odstranÄ›ní vÅ¡ech vybraných položek? name=Název value=Hodnota -sign_in_with_provider = PÅ™ihlásit se pÅ™es %s -confirm_delete_artifact = Opravdu chcete odstranit artefakt „%s“? toggle_menu = PÅ™epnout nabídku filter = Filtr filter.is_fork = Forky @@ -168,6 +165,7 @@ new_org.title = Nová organizace new_repo.link = Nový repozitář new_migrate.link = Nová migrace new_org.link = Nová organizace +copy_path = Kopírovat cestu [aria] navbar=NavigaÄní liÅ¡ta @@ -201,6 +199,16 @@ buttons.enable_monospace_font=Zapnout neproporcionální písmo buttons.disable_monospace_font=Vypnout neproporcionální písmo buttons.unindent.tooltip = ZruÅ¡it vnoÅ™ení položek pod jednu úroveň buttons.indent.tooltip = VnoÅ™it položky pod jednu úroveň +buttons.new_table.tooltip = PÅ™idat tabulku +table_modal.header = PÅ™idat tabulku +table_modal.placeholder.header = Záhlaví +table_modal.placeholder.content = Obsah +table_modal.label.rows = Řádky +table_modal.label.columns = Sloupce +link_modal.header = PÅ™idat odkaz +link_modal.url = URL +link_modal.description = Popis +link_modal.paste_reminder = Tip: pokud máte adresu zkopírovanou ve schránce, můžete vytvoÅ™it odkaz jejím vložením přímo do editoru. [filter] string.asc=A – Z @@ -216,7 +224,7 @@ network_error=Chyba sítÄ› server_internal = Interní chyba serveru [startpage] -app_desc=Bezproblémová samostatnÄ› hostovatelná služba Git +app_desc=Jednoduchá, samostatnÄ› hostovatelná služba Git install=Jednoduché na instalaci install_desc=JednoduÅ¡e spusÅ¥te binární soubor pro vaÅ¡i platformu, nasaÄte jej pomocí Dockeru nebo si jej stáhnÄ›te jako balíÄek. platform=Multiplatformní @@ -251,7 +259,7 @@ err_empty_db_path=Cesta k databázi SQLite3 nemůže být prázdná. no_admin_and_disable_registration=Nelze vypnout registraci úÄtů bez vytvoÅ™ení úÄtu administrátora. err_empty_admin_password=Heslo administrátora nemůže být prázdné. err_empty_admin_email=E-mail administrátora nemůže být prázdný. -err_admin_name_is_reserved=Uživatelské jméno administrátora není platné, uživatelské jméno je rezervované +err_admin_name_is_reserved=Uživatelské jméno administrátora není platné, jméno je rezervované err_admin_name_pattern_not_allowed=Uživatelské jméno administrátora je neplatné, uživatelské jméno odpovídá vyhrazenému vzoru err_admin_name_is_invalid=Uživatelské jméno administrátora není platné @@ -434,7 +442,7 @@ non_local_account=ExternÄ› ověřovaní uživatelé nemohou zmÄ›nit své heslo p verify=Ověřit scratch_code=Záložní kód use_scratch_code=Použít záložní kód -twofa_scratch_used=Použili jste váš záložní kód. Byli jste pÅ™esmÄ›rování na stránku s nastavením dvoufaktorového ověřování, kde můžete odstranit registraci vaÅ¡eho zařízení nebo vygenerovat nový záložní kód. +twofa_scratch_used=Použili jste svůj záložní kód. Byli jste pÅ™esmÄ›rování na stránku s nastavením dvoufázového ověření, kde můžete odstranit registraci vaÅ¡eho zařízení nebo vygenerovat nový záložní kód. twofa_passcode_incorrect=VaÅ¡e heslo je neplatné. Pokud jste ztratili vaÅ¡e zařízení, použijte záložní kód k pÅ™ihlášení. twofa_scratch_token_incorrect=Váš záložní kód není správný. login_userpass=PÅ™ihlásit se @@ -478,6 +486,8 @@ hint_register = Nemáte úÄet? Zaregistrujte se nyní. sign_up_button = Zaregistrujte se nyní. back_to_sign_in = ZpÄ›t na pÅ™ihlášení sign_in_openid = PokraÄovat s OpenID +unauthorized_credentials = Údaje jsou nesprávné nebo vyprÅ¡ely. Opakujte svůj příkaz nebo se podívejte na %s pro více informací +use_onetime_code = Použít jednorázový kód [mail] view_it_on=Zobrazit na %s @@ -488,11 +498,11 @@ hi_user_x=Ahoj %s, activate_account=Prosíme, aktivujte si váš úÄet activate_account.title=%s, prosím aktivujte si váš úÄet activate_account.text_1=Ahoj %[1]s, dÄ›kujeme za registraci na %[2]s! -activate_account.text_2=Pro aktivaci vaÅ¡eho úÄtu do %s kliknÄ›te na následující odkaz: +activate_account.text_2=Pro aktivaci vaÅ¡eho úÄtu kliknÄ›te %s na následující odkaz : activate_email=Ověřte vaÅ¡i e-mailovou adresu activate_email.title=%s, prosím ověřte vaÅ¡i e-mailovou adresu -activate_email.text=Pro aktivaci vaÅ¡eho úÄtu do %s kliknÄ›te na následující odkaz: +activate_email.text=Pro ověření vaší e-mailové adresy kliknÄ›te %s na následující odkaz: register_notify=Vítejte v %s register_notify.title=%[1]s vítejte v %[2]s @@ -511,8 +521,8 @@ issue_assigned.issue=@%[1]s vás pÅ™iÅ™adil/a k problému %[2]s v repozitáři % issue.x_mentioned_you=@%s vás zmínil/a: issue.action.force_push=%[1]s vynutil/a nahrání %[2]s z %[3]s do %[4]s. -issue.action.push_1=@%[1]s nahrál/a %[3]d commit do %[2]s -issue.action.push_n=@%[1]s nahrál/a %[3]d commity do %[2]s +issue.action.push_1=Uživatel @%[1]s nahrál %[3]d revizi do %[2]s +issue.action.push_n=Uživatel @%[1]s nahrál %[3]d revizí do %[2]s issue.action.close=@%[1]s uzavÅ™el/a #%[2]d. issue.action.reopen=@%[1]s znovu otevÅ™el/a #%[2]d. issue.action.merge=@%[1]s slouÄil/a #%[2]d do %[3]s. @@ -584,9 +594,9 @@ AuthName=Název ověření AdminEmail=E-mailová adresa správce NewBranchName=Název nové vÄ›tve -CommitSummary=Shrnutí commity -CommitMessage=Zpráva commitu -CommitChoice=VýbÄ›r commitu +CommitSummary=Shrnutí revize +CommitMessage=Zpráva revize +CommitChoice=VýbÄ›r revize TreeName=Cesta k souboru Content=Obsah @@ -622,7 +632,7 @@ repository_files_already_exist.adopt=Soubory pro tento repozitář již existuj repository_files_already_exist.delete=Soubory pro tento repozitář již existují. Musíte je odstranit. repository_files_already_exist.adopt_or_delete=Soubory pro tento repozitář již existují. PÅ™ijmÄ›te je, nebo je odstraňte. visit_rate_limit=Dosaženo limitu rychlosti dotazů pÅ™i vzdáleném přístupu. -2fa_auth_required=Vzdálený přístup vyžaduje dvoufaktorové ověřování. +2fa_auth_required=Vzdálený přístup vyžaduje dvoufázové ověření. org_name_been_taken=Název organizace je již použit. team_name_been_taken=Název týmu je již použit. team_no_units_error=Povolit přístup alespoň do jedné sekce repozitáře. @@ -646,8 +656,8 @@ cannot_add_org_to_team=Organizace nemůže být pÅ™idána jako Älen týmu. duplicate_invite_to_team=Uživatel byl již pozván jako Älen týmu. organization_leave_success=ÚspěšnÄ› jste opustili organizaci %s. -invalid_ssh_key=Nelze ověřit váš SSH klíÄ: %s -invalid_gpg_key=Nelze ověřit váš GPG klíÄ: %s +invalid_ssh_key=NepodaÅ™ilo se ověřit váš klÃ­Ä SSH: %s +invalid_gpg_key=NepodaÅ™ilo se ověřit váš klÃ­Ä GPG: %s invalid_ssh_principal=Neplatný SSH Principal certifikát: %s must_use_public_key=Zadaný klÃ­Ä je soukromý klíÄ. Nenahrávejte svůj soukromý klÃ­Ä nikde. Místo toho použijte váš veÅ™ejný klíÄ. unable_verify_ssh_key=NepodaÅ™ilo se ověřit klÃ­Ä SSH, zkontrolujte, zda neobsahuje chyby. @@ -660,10 +670,9 @@ org_still_own_repo=Organizace stále vlastní jeden nebo více repozitářů. Ne org_still_own_packages=Organizace stále vlastní jeden nebo více balíÄků. Nejdříve je odstraňte. target_branch_not_exist=Cílová vÄ›tev neexistuje. -admin_cannot_delete_self = Nemůžete odstranit sami sebe, když jste administrátorem. Nejprve prosím odeberte svá práva administrátora. +admin_cannot_delete_self=Nemůžete se smazat, dokud jste správce. Nejdříve prosím odeberte svá administrátorská oprávnÄ›ní. username_error_no_dots = ` může obsahovat pouze alfanumerické znaky („0-9“, „a-z“, „A-Z“), pomlÄky („-“) a podtržítka („_“). Nemůže zaÄínat nebo konÄit nealfanumerickými znaky. Jsou také zakázány po sobÄ› jdoucí nealfanumerické znaky.` -admin_cannot_delete_self=Nemůžete se smazat, dokud jste správce. Nejdříve prosím odeberte svá administrátorská oprávnÄ›ní. unset_password = Tento uživatel nemá nastavené heslo. unsupported_login_type = U tohoto typu úÄtu není funkce odstranÄ›ní úÄtu podporována. required_prefix = Vstup musí zaÄínat textem „%s“ @@ -675,6 +684,8 @@ Location = UmístÄ›ní To = Název vÄ›tve Biography = Životopis AccessToken = Přístupový token +username_claiming_cooldown = Uživatelské jméno nelze získat, protože jeÅ¡tÄ› neskonÄila doba jeho platnosti. Půjde jej získat %[1]s. +email_domain_is_not_allowed = Doména uživatelské e-mailové adresy %s je v rozporu se seznamem EMAIL_DOMAIN_ALLOWLIST nebo EMAIL_DOMAIN_BLOCKLIST. UjistÄ›te se, že je vaÅ¡e adresa správnÄ› nastavena. [user] change_avatar=ZmÄ›nit váš avatar… @@ -687,7 +698,7 @@ watched=Sledované repozitáře code=Kód projects=Projekty overview=PÅ™ehled -following_few=%d sledovaní +following_few=%d sledovaných follow=Sledovat unfollow=PÅ™estat sledovat user_bio=Životopis @@ -709,7 +720,7 @@ follow_blocked_user = Tohoto uživatele nemůžete sledovat, protože jste si je block = Zablokovat unblock = Odblokovat followers_one = %d sledující -following_one = %d následuje +following_one = %d sledovaný followers.title.one = Sledující followers.title.few = Sledující following.title.one = Sleduje @@ -718,6 +729,7 @@ public_activity.visibility_hint.self_private = VaÅ¡e aktivita je viditelná pouz 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í. public_activity.visibility_hint.admin_public = Tato aktivita je viditelná vÅ¡em, ale jako administrátor také můžete vidÄ›t interakce v soukromých prostorech. +public_activity.visibility_hint.self_private_profile = VaÅ¡e aktivita je viditelná pouze vám a správcům instance, protože váš profil je soukromý. Nastavit. [settings] profile=Profil @@ -732,16 +744,16 @@ applications=Aplikace orgs=Organizace repos=Repozitáře delete=Smazat úÄet -twofa=Dvoufaktorové ověřování (TOTP) +twofa=Dvoufázové ověření (TOTP) account_link=Propojené úÄty organization=Organizace uid=UID -webauthn=Dvoufaktorové ověřování (bezpeÄnostní klíÄe) +webauthn=Dvoufázové ověření (bezpeÄnostní klíÄe) public_profile=VeÅ™ejný profil -biography_placeholder=ŘeknÄ›te nám nÄ›co o sobÄ›! (Můžete použít Markdown) +biography_placeholder=ŘeknÄ›te ostatním nÄ›co o sobÄ›! (Je podporován Markdown) location_placeholder=Sdílejte svou pÅ™ibližnou polohu s ostatními -profile_desc=Nastavte, jak bude váš profil zobrazen ostatním uživatelům. VaÅ¡e hlavní e-mailová adresa bude použita pro oznámení, obnovení hesla a operace Git. +profile_desc=O vás password_username_disabled=Externí uživatelé nemohou mÄ›nit svoje uživatelské jméno. Kontaktujte prosím svého administrátora pro více detailů. full_name=Celé jméno website=Web @@ -761,7 +773,7 @@ language=Jazyk ui=Motiv vzhledu hidden_comment_types=Skryté typy komentářů hidden_comment_types_description=Zde zkontrolované typy komentářů nebudou zobrazeny na stránkách problémů. ZaÅ¡krtnutí „Štítek“ například odstraní vÅ¡echny komentáře „ pÅ™idal/odstranil
      pour vérifier la signature de l'index : alpine.registry.info=Choisissez $branch et $repository dans la liste ci-dessous. alpine.install=Pour installer le paquet, exécutez la commande suivante : -alpine.repository=Informations sur le Dépôt +alpine.repository=Informations sur le dépôt alpine.repository.branches=Branches alpine.repository.repositories=Dépôts alpine.repository.architectures=Architectures @@ -3644,7 +3753,7 @@ conda.install=Pour installer le paquet en utilisant Conda, exécutez la commande container.details.type=Type d'image container.details.platform=Plateforme container.pull=Tirez l'image depuis un terminal : -container.digest=Empreinte : +container.digest=Empreinte container.multi_arch=SE / Arch container.layers=Calques d'image container.labels=Labels @@ -3655,7 +3764,7 @@ cran.install=Pour installer le paquet, exécutez la commande suivante : debian.registry=Configurez ce registre à partir d'un terminal : debian.registry.info=Choisissez $distribution et $component dans la liste ci-dessous. debian.install=Pour installer le paquet, exécutez la commande suivante : -debian.repository=Infos sur le Dépôt +debian.repository=Infos sur le dépôt debian.repository.distributions=Distributions debian.repository.components=Composants debian.repository.architectures=Architectures @@ -3685,9 +3794,9 @@ rpm.registry=Configurez ce registre à partir d'un terminal : rpm.distros.redhat=sur les distributions basées sur RedHat rpm.distros.suse=sur les distributions basées sur SUSE rpm.install=Pour installer le paquet, exécutez la commande suivante : -rpm.repository=Informations sur le Dépôt -rpm.repository.architectures=Architectures -rpm.repository.multiple_groups=Ce paquet est disponible en plusieurs groupes. +rpm.repository = Information sur le dépôt +rpm.repository.architectures = Architectures +rpm.repository.multiple_groups = Ce paquet est disponible dans plusieurs groupes. rubygems.install=Pour installer le paquet en utilisant gem, exécutez la commande suivante : rubygems.install2=ou ajoutez-le au Gemfile : rubygems.dependencies.runtime=Dépendances d'exécution @@ -3741,11 +3850,33 @@ owner.settings.cleanuprules.success.delete=La règle de nettoyage a été suppri owner.settings.chef.title=Dépôt Chef owner.settings.chef.keypair=Générer une paire de clés owner.settings.chef.keypair.description=Une paire de clés est nécessaire pour s'authentifier au registre Chef. Si vous avez déjà généré une paire de clés, la génération d'une nouvelle paire de clés supprimera l'ancienne. -rpm.repository = Information sur le dépôt -rpm.repository.architectures = Architectures -rpm.repository.multiple_groups = Ce paquet est disponible dans plusieurs groupes. owner.settings.cargo.rebuild.no_index = Incapable de reconstruire, index non initialisé. npm.dependencies.bundle = Bundles de dépendances +arch.pacman.helper.gpg = Ajouter un certificat de confiance pour pacman : +arch.pacman.repo.multi = %s a la même version dans différentes distributions. +arch.pacman.repo.multi.item = Configuration pour %s +arch.pacman.conf = Ajouter un serveur associées à la distribution et l'architecture dans /etc/pacman.conf : +arch.pacman.sync = Synchroniser le paquet avec pacman : +arch.version.properties = Propriétés de version +arch.version.description = Description +arch.version.provides = Fournit +arch.version.groups = Groupe +arch.version.depends = Dépend +arch.version.optdepends = Dépendances optionnelles +arch.version.checkdepends = Vérifier les dépendances +arch.version.conflicts = Conflits +arch.version.replaces = Remplace +arch.version.backup = Sauvegarde +arch.version.makedepends = Faire des dépendances +container.images.title = Images +search_in_external_registry = Rechercher dans %s +alt.repository = Informations sur le dépôt +alt.repository.architectures =Architectures +alt.registry = Configurez ce registre à partir d'un terminal : +alt.registry.install = Pour installer le paquet, exécutez la commande suivante : +alt.install = Installer le paquet +alt.repository.multiple_groups = Ce paquet est disponible dans plusieurs groupes. +alt.setup = Ajouter un dépôt à la liste des dépôts connecté (choisissez l'architecture nécessaire à la place de "_arch") : [secrets] secrets=Secrets @@ -3765,7 +3896,7 @@ management=Gestion des secrets [actions] actions=Actions -unit.desc=Gérer l'intégration continue avec Forgejo Actions +unit.desc=Gérer l'intégration continue avec Forgejo Actions. status.unknown=Inconnu status.waiting=En attente @@ -3825,8 +3956,8 @@ runs.actors_no_select=Tous les acteurs runs.status_no_select=Touts les statuts runs.no_results=Aucun résultat correspondant. runs.no_workflows=Il n'y a pas encore de workflows. -runs.no_workflows.quick_start=Vous découvrez les Actions Gitea ? Consultez le didacticiel. -runs.no_workflows.documentation=Pour plus d’informations sur les actions Gitea, voir la documentation. +runs.no_workflows.quick_start = Vous ne savez pas comment commencer avec Forgejo Action ? Consultez le guide de démarrage rapide. +runs.no_workflows.documentation = Pour plus d’informations sur Forgejo Actions, voir la documentation. runs.no_runs=Le flux de travail n'a pas encore d'exécution. runs.empty_commit_message=(message de révision vide) @@ -3845,7 +3976,7 @@ variables.none=Il n'y a pas encore de variables. variables.deletion=Retirer la variable variables.deletion.description=La suppression d’une variable est permanente et ne peut être défaite. Continuer ? variables.description=Les variables sont passées aux actions et ne peuvent être lues autrement. -variables.id_not_exist=La variable avec l’ID %d n’existe pas. +variables.id_not_exist = La variable numéro %d n’existe pas. variables.edit=Modifier la variable variables.deletion.failed=Impossible de retirer la variable. variables.deletion.success=La variable a bien été retirée. @@ -3853,9 +3984,6 @@ variables.creation.failed=Impossible d'ajouter la variable. variables.creation.success=La variable « %s » a été ajoutée. variables.update.failed=Impossible d’éditer la variable. variables.update.success=La variable a bien été modifiée. -runs.no_workflows.quick_start = Vous ne savez pas comment commencer avec Forgejo Action ? Consultez le guide de démarrage rapide. -runs.no_workflows.documentation = Pour plus d’informations sur Forgejo Actions, voir la documentation. -variables.id_not_exist = La variable numéro %d n’existe pas. runs.workflow = Workflow runs.no_job_without_needs = Le workflow doit contenir au moins une tâche sans dépendances. workflow.dispatch.use_from = Utiliser un workflow depuis @@ -3866,15 +3994,19 @@ workflow.dispatch.success = L'exécution du workflow a bien été demandée. workflow.dispatch.input_required = Le champ "%s" est obligatoire. workflow.dispatch.invalid_input_type = Type invalide pour le champ "%s". workflow.dispatch.warn_input_limit = Affichage des %d premiers champs seulement. +runs.expire_log_message = Les journaux ont été purgés car ils étaient trop anciens. +runs.no_workflows.help_write_access = Vous ne savez pas par où commencer avec Forgejo Actions ? Regardez la section démarrage rapide dans la documentation utilisateur pour écrire votre premier workflow, puis mettre en place un Forgejo runner pour exécuter vos jobs. +runs.no_workflows.help_no_write_access = Pour en savoir plus sur Forgejo Actions, consultez la documentation. +variables.not_found = La variable n'a pas été trouvée. [projects] type-1.display_name=Projet personnel type-2.display_name=Projet du dépôt type-3.display_name=Projet de l'organisation +deleted.display_name = Projet Supprimé [git.filemode] changed_filemode=%[1]s → %[2]s -; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … directory=Dossier normal_file=Fichier normal executable_file=Fichier exécutable @@ -3883,45 +4015,36 @@ submodule=Sous-module -[graphs] -component_loading_info = Cela peut prendre du temps… -component_failed_to_load = Une erreur inattendue s'est produite. -contributors.what = contributions -component_loading = Chargement %s... -component_loading_failed = Échec de chargement de %s - -code_frequency.what = fÅ•equence de code -recent_commits.what = commits récents - - [search] -search = Rechercher... +search = Rechercher… type_tooltip = Type de recherche fuzzy = Approximatif code_search_by_git_grep = Les résultats de recherche dans le code sont fournis par "git grep". Les résultats pourraient être plus pertinents si l'administrateur du site active les indexeurs de code source. -runner_kind = Chercher les runners... +runner_kind = Chercher les runners… no_results = Aucun résultat n'a été trouvé. keyword_search_unavailable = La recherche par mot-clé n'est pas disponible actuellement. Veuillez contacter l'administrateur du site. fuzzy_tooltip = Inclure les résultats proches des termes recherchés match = Correspondance match_tooltip = Uniquement inclure les résultats correspondant exactement aux termes recherchés -repo_kind = Chercher dans les dépôt... -user_kind = Chercher les utilisateurs... -org_kind = Chercher les organisations... -team_kind = Chercher les équipes... -code_kind = Chercher le code... +repo_kind = Chercher dans les dépôts… +user_kind = Chercher les utilisateurs… +org_kind = Chercher les organisations… +team_kind = Chercher les équipes… +code_kind = Chercher le code… code_search_unavailable = La recherche dans le code n'est pas disponible. Veuillez contacter l'administrateur du site. -package_kind = Chercher les paquets... -project_kind = Chercher les projets... -branch_kind = Chercher les branches... -commit_kind = Chercher les commits... +package_kind = Chercher les paquets… +project_kind = Chercher les projets… +branch_kind = Chercher les branches… +commit_kind = Chercher les commits… exact = Exact exact_tooltip = Inclure uniquement les résultats qui correspondent exactement au terme recherché -issue_kind = Rechercher dans les tickets... +issue_kind = Rechercher dans les tickets… union = Union union_tooltip = Inclus les résultats contenant au moins un des mots clé séparés par des espaces -pull_kind = Rechercher dans les demande d'ajout... +pull_kind = Rechercher dans les demande d'ajout… milestone_kind = Recherche dans les jalons... +regexp_tooltip = Interpréter le terme de recherche comme une expression régulière +regexp = RegExp [munits.data] @@ -3936,4 +4059,27 @@ eib = Eio [markup] filepreview.line = Ligne %[1]d dans %[2]s filepreview.lines = Lignes %[1]d jusqu'à %[2]d dans %[3]s -filepreview.truncated = L'aperçu a été tronqué \ No newline at end of file +filepreview.truncated = L'aperçu a été tronqué + +[repo.permissions] +pulls.write = Écrire : Fermer des demandes de tirage et gérer les métadonnées telles que les étiquettes, les jalons, les assignés, les dates d'échéance et les dépendances. +actions.read = Lire : Voir les pipelines CI/CD intégrés et leurs journaux. +releases.read = Lire: Voir et télécharger les versions. +releases.write = Écrire : Publier, modifier et supprimer des versions et leurs ressources. +projects.write = Écrire : Créer des projets, des colonnes et les modifier. +code.read = Lire : Accéder au code du dépôt et le cloner. +ext_issues = Accéder au lien vers un système externe de suivi des problèmes. Les autorisations sont gérées de manière externe. +code.write = Écrire : Pousser vers le dépôt, créer des branches et des étiquettes. +issues.read = Lire : Lire et créer des tickets et des commentaires. +wiki.read = Lire : Lire le wiki intégré et son historique. +wiki.write = Écrire : Créer, mettre à jour et supprimer des pages dans le wiki intégré. +projects.read = Lire : Accéder aux tableaux de projet du dépôt. +packages.read = Lire : Voir et télécharger les paquets assignés au dépôt. +packages.write = Écrire : Publier et supprimer des paquets assignés au dépôt. +actions.write = Écrire : Déclencher manuellement, redémarrer, annuler ou approuver les pipelines CI/CD en attente. +ext_wiki = Accéder au lien vers un wiki externe. Les autorisations sont gérées de manière externe. +issues.write = Écrire : Fermer des tickets et gérer les métadonnées telles que les étiquettes, les jalons, les assignés, les dates d'échéance et les dépendances. +pulls.read = Lire : Lire et créer des demandes de tirage. + +[translation_meta] +test = Ceci est une chaîne de test. Elle n'est pas affichée dans l'interface de Forgejo mais est utilisée à des fins de test. N'hésitez pas à entrer 'ok' pour gagner du temps (ou un fait amusant de votre choix) pour atteindre ce doux 100 % de complétion. :-) diff --git a/options/locale/locale_ga-IE.ini b/options/locale/locale_ga-IE.ini new file mode 100644 index 0000000000..d2d960b627 --- /dev/null +++ b/options/locale/locale_ga-IE.ini @@ -0,0 +1,2996 @@ +[common] +home = Baile +dashboard = Deais +explore = Iniúch +help = Cabhair +logo = Lógó +sign_in = Sínigh isteach +sign_in_with_provider = Sínigh isteach le %s +sign_in_or = nó +sign_out = Sínigh amach +sign_up = Cláraigh +link_account = Cuntas Nasc +register = Cláraigh +version = Leagan +powered_by = Cumhachtaithe ag %s +page = Leathanach +template = Teimpléad +language = Teanga +notifications = Fógraí +active_stopwatch = Rianaitheoir Ama Gníomhach +tracked_time_summary = Achoimre ar an am rianaithe bunaithe ar scagairí an liosta eisiúna +create_new = Cruthaigh… +user_profile_and_more = Próifíl agus Socruithe… +signed_in_as = Sínithe isteach mar +enable_javascript = Éilíonn JavaScript ar an suíomh Gréasáin seo. +toc = Tábla na nÃbhar +licenses = Ceadúnais +more_items = Tuilleadh míreanna +username = Ainm úsáideora +email = Seoladh ríomhphoist +password = Pasfhocal +access_token = Comhartha Rochtana +re_type = Deimhnigh Pasfhocal +captcha = CAPTCHA +twofa = Fíordheimhniú Dhá-Fhachtóir +twofa_scratch = Cód Scratch Dhá-Fhachtóra +passcode = Paschód +webauthn_insert_key = Cuir isteach d'eochair slándála +webauthn_sign_in = Brúigh an cnaipe ar d'eochair slándála. Mura bhfuil aon chnaipe ag d'eochair slándála, cuir isteach é arís. +webauthn_press_button = Brúigh an cnaipe ar d'eochair slándála le do thoil… +webauthn_use_twofa = Úsáid cód dhá fhachtóir ó do ghuthán +webauthn_error = Ní fhéadfaí do eochair slándála a léamh. +webauthn_unsupported_browser = Ní thacaíonn do bhrabhsálaí le WebAuthn faoi láthair. +webauthn_error_unknown = Tharla earráid anaithnid. Déan iarracht arís. +webauthn_error_insecure = Ní thacaíonn WebAuthn ach le naisc slán. Le haghaidh tástála thar HTTP, is féidir leat an bunús “localhost†nó "127.0.0.1" a úsáid +webauthn_error_unable_to_process = Ní fhéadfadh an freastalaí d'iarratas a phróiseáil. +webauthn_error_duplicated = Ní cheadaítear an eochair slándála don iarratas seo. Déan cinnte le do thoil nach bhfuil an eochair cláraithe cheana féin. +webauthn_error_empty = Ní mór duit ainm a shocrú don eochair seo. +webauthn_error_timeout = Sroicheadh an teorainn ama sula bhféadfaí d’eochair a léamh. Athlódáil an leathanach seo, le do thoil, agus déan iarracht arís. +repository = Stór +organization = Eagraíocht +mirror = Scáthán +new_mirror = Scáthán Nua +new_fork = Forc Stór Nua +new_project = Tionscadal Nua +new_project_column = Colún Nua +admin_panel = Riarachán Láithreáin +settings = Socruithe +your_profile = Próifíl +your_starred = Réaltaigh +your_settings = Socruithe +all = Gach +sources = Foinsí +mirrors = Scátháin +collaborative = Comhoibritheach +forks = Forcanna +activities = Gníomhaíochtaí +pull_requests = Iarrataí Tarraing +issues = Saincheisteanna +milestones = Clocha míle +ok = CEART GO LEOR +cancel = Cealaigh +retry = Atriail +rerun = Ath-rith +rerun_all = Ath-rith na poist go léir +save = Sábháil +add = Cuir +add_all = Cuir Gach +remove = Bain +remove_all = Bain Gach +remove_label_str = Bain mír “%s†+edit = Cuir in eagar +view = Amharc +test = Tástáil +enabled = Cumasaithe +disabled = Díchumasaithe +locked = Faoi ghlas +copy = Cóipeáil +copy_url = Cóipeáil URL +copy_hash = Cóipeáil hais +copy_path = Cóipeáil cosán +copy_content = Cóipeáil ábhair +copy_branch = Ainm brainse cóipeáil +copy_success = Cóipeáil! +copy_error = Theip ar an gcóipeáil +copy_type_unsupported = Ní féidir an cineál comhaid seo a chóipeáil +write = Scríobh +preview = Réamhamharc +loading = à lódáil... +error = Earráid +error404 = Níl an leathanach atá tú ag iarraidh a bhaint amach ann nó níl tú údaraithe chun é a fheiceáil. +go_back = Ar ais +invalid_data = Sonraí neamhbhailí: %v +never = Riamh +unknown = Anaithnid +rss_feed = Fothú RSS +pin = Bioráin +unpin = Díphoráil +artifacts = Déantáin +archived = Cartlann +concept_system_global = Domhanda +concept_user_individual = Duine aonair +concept_code_repository = Stóráil +concept_user_organization = Eagraíocht +show_timestamps = Taispeáin stampaí ama +show_log_seconds = Taispeáin soicindí +show_full_screen = Taispeáin scáileán iomlán +download_logs = Ãoslódáil logaí +confirm_delete_selected = Deimhnigh chun gach earra roghnaithe a scriosadh? +name = Ainm +value = Luach +filter = Scagaire +filter.is_archived = Cartlannaithe +filter.not_archived = Gan Cartlannaithe +filter.public = Poiblí +filter.private = Príobháideach + +[search] +search = Cuardaigh... +type_tooltip = Cineál cuardaigh +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... +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... +no_results = Níl aon torthaí meaitseála le fáil. +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] +navbar = Barra Nascleanúint +footer = Buntásc +footer.links = Naisc + +[heatmap] +number_of_contributions_in_the_last_12_months = %s ranníocaíochtaí le 12 mhí anuas +less = Níos lú +more = Níos mó + +[editor] +buttons.heading.tooltip = Cuir ceannteideal leis +buttons.bold.tooltip = Cuir téacs trom leis +buttons.italic.tooltip = Cuir téacs iodálach leis +buttons.quote.tooltip = Téacs luaigh +buttons.code.tooltip = Cuir cód leis +buttons.link.tooltip = Cuir nasc leis +buttons.list.unordered.tooltip = Cuir liosta piléar leis +buttons.list.ordered.tooltip = Cuir liosta uimhrithe +buttons.list.task.tooltip = Cuir liosta tascanna leis +buttons.mention.tooltip = Luaigh úsáideoir nó foireann +buttons.ref.tooltip = Déan tagairt d'eisiúint nó iarratas tarraingthe +buttons.switch_to_legacy.tooltip = Úsáid an eagarthóir oidhreachta ina ionad +buttons.enable_monospace_font = Cumasaigh cló monospace +buttons.disable_monospace_font = Díchumasaigh cló monospace + +[filter] +string.asc = A - Z +string.desc = Z - A + +[error] +occurred = Tharla earráid +not_found = Ní raibh an sprioc in ann a fháil. +network_error = Earráid líonra + +[startpage] +app_desc = Seirbhís Git gan phian, féin-óstáil +install = Éasca a shuiteáil +install_desc = Níl ort ach rith an dénártha do d'ardán, seol é le Docker, nó faigh pacáilte é. +platform = Tras-ardán +lightweight = Éadrom +license = Foinse Oscailte + +[install] +install = Suiteáil +title = Cumraíocht Tosaigh +db_title = Socruithe Bunachar Sonraí +db_type = Cineál Bunachar Sonraí +host = Óstach +user = Ainm úsáideora +password = Pasfhocal +db_name = Ainm Bunachar Sonraí +db_schema = Scéim +db_schema_helper = Fág bán le haghaidh réamhshocraithe bunachar sonraí ("poiblí"). +ssl_mode = SSL +path = Cosán +reinstall_confirm_check_1 = Féadfaidh na sonraí criptithe ag an SECRET_KEY i app.ini a chailleadh: b'fhéidir nach mbeidh úsáideoirí in ann logáil isteach le 2FA/OTP & b'fhéidir nach bhfeidhmeoidh scátháin i gceart. Trí an bhosca seo a sheiceáil deimhníonn tú go bhfuil an ceart an SECRET_KEY sa chomhad reatha app.ini. +reinstall_confirm_check_2 = B'fhéidir go gcaithfear na stórais agus na socruithe a athshioncronú. Trí an bhosca seo a sheiceáil deimhníonn tú go ndéanfaidh tú na crúcaí do na stórálacha agus an chomhad authorized_keys a athshioncronú de láimh. Deimhníonn tú go gcinnteoidh tú go bhfuil socruithe stórais agus scátháin ceart. +err_empty_db_path = Ní féidir cosán bunachar sonraí SQLite3 a bheith folamh. +no_admin_and_disable_registration = Ní féidir leat féinchlárú úsáideora a dhíchumasú gan cuntas riarthóra a chruthú. +err_empty_admin_password = Ní féidir le pasfhocal an riarthóra a bheith folamh. +err_empty_admin_email = Ní féidir le ríomhphost an riarthóra a bheith folamh. +err_admin_name_is_reserved = Riarthóir Tá an t-ainm úsáideora neamhbhailí, tá an t-ainm úsáideora curtha in áirithe +err_admin_name_pattern_not_allowed = Tá ainm úsáideora an riarthóra neamhbhailí, meaitseálann an t-ainm úsáideora patrún in áirithe +err_admin_name_is_invalid = Tá an t-ainm úsáideora Riarthóra neamhbhailí +general_title = Socruithe Ginearálta +repo_path = Cosán Fréimhe an Stór +repo_path_helper = Sábhálfar stórais iargúlta Git chuig an eolaire seo. +lfs_path = Cosán Fréamh Git LFS +lfs_path_helper = Stórálfar comhaid a rianóidh Git LFS san eolaire seo. Fág folamh le díchumasú. +domain = Fearann ​​Freastalaí +domain_helper = Seoladh fearainn nó óstach don fhreastalaí. +ssh_port = Port Freastalaí SSH +app_url_helper = Seoladh bonn le haghaidh URLanna clóin HTTP(S) agus fógraí ríomhphoist. +log_root_path = Cosán Logála +log_root_path_helper = Scríofar comhaid logála chuig an eolaire seo. +optional_title = Socruithe Roghnacha +email_title = Socruithe ríomhphoist +smtp_addr = Óstach SMTP +smtp_port = Port SMTP +smtp_from = Seol Ríomhphost Mar +smtp_from_invalid = Tá an seoladh “Seol Ríomhphost Mar†neamhbhailí +mailer_user = SMTP Ainm úsáideora +mailer_password = Pasfhocal SMTP +register_confirm = Deimhniú Ríomhphoist a cheangal le Clárú +mail_notify = Cumasaigh Fógraí Ríomhphoist +server_service_title = Socruithe Freastalaí agus Seirbhíse Tríú Páirtí +offline_mode = Cumasaigh Mód Ãitiúil +disable_gravatar = Díchumasaigh Gravatar +federated_avatar_lookup = Cumasaigh Abhatáir Chónaidhme +disable_registration = Díchumasaigh Féin-Chlárú +openid_signin = Cumasaigh Síniú isteach OpenID +openid_signup = Cumasaigh Féinchlárú OpenID +enable_captcha = Cumasaigh clárú CAPTCHA +default_keep_email_private = Folaigh Seoltaí Ríomhphoist de réir Réamhshocrú +default_allow_create_organization = Ceadaigh Cruthú Eagraíochtaí de réir Réamhshocrú +default_enable_timetracking = Cumasaigh Rianú Ama de réir Réamhshocrú +admin_title = Socruithe Cuntas Riarthóra +admin_name = Ainm Úsáideora an Riarthóra +admin_password = Pasfhocal +confirm_password = Deimhnigh Pasfhocal +admin_email = Seoladh ríomhphoist +invalid_db_setting = Tá na socruithe bunachar sonraí neamhbhailí:%v +invalid_db_table = Tá an tábla bunachar sonraí "%s" neamhbhailí: %v +invalid_repo_path = Tá cosán fréimhe an stór neamhbhailí:%v +invalid_app_data_path = Tá cosán sonraí an aip neamhbhailí:%v +internal_token_failed = Theip ar chomhartha inmheánach a ghiniúint:%v +secret_key_failed = Theip ar an eochair rúnda a ghiniúint:%v +save_config_failed = Theip ar chumraíocht a shábháil:%v +invalid_admin_setting = Tá socrú cuntas riarthóra neamhbhailí: %v +invalid_log_root_path = Tá an cosán logála neamhbhailí:%v +no_reply_address = Fearann Ríomhphoist Folaite +password_algorithm = Algartam Hais Pasfhocal +invalid_password_algorithm = Algartam hais pasfhocail neamhbhailí +password_algorithm_helper = Socraigh an algartam hashing pasfhocal. Tá riachtanais agus neart éagsúla ag halgartaim. Tá an algartam argon2 sách slán ach úsáideann sé go leor cuimhne agus d'fhéadfadh sé a bheith míchuí do chórais bheaga. +enable_update_checker = Cumasaigh Seiceoir Nuashonraithe +env_config_keys = Cumraíocht Comhshaoil +env_config_keys_prompt = Cuirfear na hathróga comhshaoil seo a leanas i bhfeidhm ar do chomhad cumraíochta freisin: + +[home] +uname_holder = Ainm Úsáideora nó Seoladh Ríomhphoist +switch_dashboard_context = Athraigh Comhthéacs an Deais +my_repos = Stórais +view_home = Amharc %s +filter = Scagairí Eile +filter_by_team_repositories = Scag de réir stórais foirne +feed_of = `Fotha de "%s"` +show_archived = Cartlannaithe +show_both_archived_unarchived = Ag taispeáint idir chartlannaithe agus neamhchartlann +show_only_archived = Ag taispeáint ach na cartlannaigh +show_only_unarchived = Ag taispeáint ach na cartlannaigh neamh +show_private = Príobháideach +show_both_private_public = Ag taispeáint poiblí agus príobháideach araon +show_only_private = Ag taispeáint príobháideach amháin +show_only_public = Ag taispeáint poiblí amháin +issues.in_your_repos = I do stórais + +[explore] +repos = Stórais +users = Úsáideoirí +organizations = Eagraíochtaí +go_to = Téigh chuig +code = Cód +code_last_indexed_at = Innéacsaithe %s is déanaí +relevant_repositories_tooltip = Tá stórais atá forca iad nó nach bhfuil aon ábhar acu, gan aon deilbhín, agus gan aon tuairisc i bhfolach. +relevant_repositories = Níl ach stórtha ábhartha á dtaispeáint, taispeáin torthaí neamhscagtha. + +[auth] +create_new_account = Cláraigh Cuntas +disable_register_prompt = Tá clárú faoi dhíchumasú. Téigh i dteagmháil le do riarthóir suíomh. +disable_register_mail = Tá deimhniú ríomhphoist le haghaidh clárú faoi dhíchum +manual_activation_only = Déan teagmháil le riarthóir do tsuímh chun gníomhachtú a chur i gcrích. +remember_me = Cuimhnigh ar an nGléas seo +forgot_password_title = Dearmad ar an bPasfhocal +forgot_password = Dearmad ar an bPasfhocal? +sign_up_successful = Cruthaíodh cuntas go rathúil. Fáilte romhat! +must_change_password = Nuashonraigh do phasfhocal +allow_password_change = A cheangal ar an úsáideoir pasfhocal a athrú (molta) +active_your_account = Gníomhachtaigh do chuntas +account_activated = Cuireadh cuntas gníomhachtaithe +resent_limit_prompt = D'iarr tú ríomhphost gníomhachtaithe cheana féin le déanaí. Fan 3 nóiméad le do thoil agus bain triail as arís. +has_unconfirmed_mail = Dia duit %s, tá seoladh ríomhphoist neamhdheimhnithe agat (%s). Mura bhfuair tú ríomhphost dearbhaithe nó mura gcaithfidh tú ceann nua a athsheoladh, cliceáil ar an gcnaipe thíos le do thoil. +resend_mail = Cliceáil anseo chun do r-phost gníomhachtaithe a athshe +reset_password = Aisghabháil Cuntas +invalid_code = Tá do chód deimhnithe neamhbhailí nó tá sé in éag. +invalid_code_forgot_password = Tá do chód deimhnithe neamhbhailí nó tá sé in éag. Cliceáil anseo chun seisiún nua a thosú. +invalid_password = Ní mheaitseálann do phasfhocal leis an bhfocal faire a úsáideadh chun an cuntas a chruthú. +reset_password_helper = Gnóthaigh Cuntas +reset_password_wrong_user = Tá tú sínithe isteach mar %s, ach tá an nasc aisghabhála cuntas i gceist le haghaidh %s +password_too_short = Ní féidir fad pasfhocal a bheith níos lú ná %d carachtair. +verify = Fíoraigh +scratch_code = Cód Scratch +use_scratch_code = Úsáid cód scratch +twofa_scratch_used = D'úsáid tú do chód scratch. Tá tú atreoraithe chuig an leathanach socruithe dhá fhachtóir ionas gur féidir leat clárú do ghléas a bhaint nó cód scratch nua a ghiniúint. +twofa_passcode_incorrect = Tá do phaschód mícheart. Má chuir tú do ghléas míchuir tú, bain úsáid as do chód scratch chun síniú isteach. +twofa_scratch_token_incorrect = Tá do chód scratch mícheart. +login_userpass = Sínigh isteach +oauth_signup_tab = Cláraigh Cuntas Nua +oauth_signup_title = Comhlánaigh Cuntas Nua +oauth_signup_submit = Cuntas Comhlánaigh +oauth_signin_title = Sínigh isteach chun Cuntas Nasctha a Údarú +oauth_signin_submit = Cuntas Nasc +oauth.signin.error = Bhí earráid ann ag próiseáil an t-iarratas ar údarú. Má leanann an earráid seo, déan teagmháil le riarthóir an láithreáin. +oauth.signin.error.access_denied = Diúltaíodh an t-iarratas ar údarú. +oauth.signin.error.temporarily_unavailable = Theip ar údarú toisc nach bhfuil an fhreastalaí fíordheimhnithe ar fáil Bain triail as arís níos déanaí. +openid_connect_submit = Ceangail +openid_connect_title = Ceangail le cuntas atá ann cheana +openid_connect_desc = Níl an URI OpenID roghnaithe ar eolas. Comhcheangail é le cuntas nua anseo. +openid_register_title = Cruthaigh cuntas nua +openid_register_desc = Níl an URI OpenID roghnaithe ar eolas. Comhcheangail é le cuntas nua anseo. +openid_signin_desc = Cuir isteach do URI OpenID. Mar shampla: alice.openid.example.org nó https://openid.example.org/alice. +disable_forgot_password_mail = Tá aisghabháil cuntas díchumasaithe toisc nach bhfuil aon ríomhphost ar bun. Téigh i dteagmháil le do riarthóir suíomh. +disable_forgot_password_mail_admin = Níl aisghabháil cuntas ar fáil ach amháin nuair a bhíonn ríomhphost ar bun. Bunaigh ríomhphost le do thoil chun aisghabháil cuntas a chumasú +email_domain_blacklisted = Ní féidir leat clárú le do sheoladh ríomhphoist. +authorize_application = Údaraigh an Feidhmchlár +authorize_redirect_notice = Déanfar tú a atreorú chuig %s má údaraíonn tú an feidhmchlár seo. +authorize_application_created_by = Chruthaigh %s an feidhmchlár seo. +authorize_title = Údaraigh "%s" chun rochtain a fháil ar do chuntas? +authorization_failed = Theip ar údarú +authorization_failed_desc = Theip ar an údarú toisc gur bhraitheamar iarratas neamhbhailí. Téigh i dteagmháil le cothabhálaí an aip a rinne tú iarracht a údarú. +password_pwned = Tá an pasfhocal a roghnaigh tú ar liosta na bhfocal faire goidte a nochtadh cheana i sáruithe sonraí poiblí. Bain triail eile as le pasfhocal eile agus smaoinigh ar an bpasfhocal seo a athrú áit eile freisin. +password_pwned_err = Ní fhéadfaí iarratas a chomhlánú ar HaveIBeenPwned +last_admin = Ní féidir leat an riarachán deireanach a bhaint. Caithfidh riarachán amháin ar a laghad a bheith ann. +back_to_sign_in = Ar ais go Sínigh Isteach + +[mail] +view_it_on = Féach air ar %s +reply = nó freagra a thabhairt ar an r-phost seo go díreach +hi_user_x = Dia duit %s, +activate_account = Gníomhachtaigh do chuntas le do thoil +activate_account.text_1 = Dia duit %[1]s, go raibh maith agat as clárú ag %[2]s! +activate_account.text_2 = Cliceáil ar an nasc seo a leanas chun do chuntas a ghníomhachtú laistigh de %s: +activate_email = Fíoraigh do sheoladh ríomhphoist +activate_email.text = Cliceáil ar an nasc seo a leanas le do sheoladh ríomhphoist a fhíorú laistigh de %s: +register_notify = Fáilte go dtí %s +register_notify.text_1 = is é seo do ríomhphost deimhnithe clárúcháin do %s! +reset_password = Aisghabháil do chuntas +register_success = Clárú rathúil +issue_assigned.pull = @%[1]s shann tú don iarratas tarraingthe %[2]s i stór %[3]s. +issue_assigned.issue = @%[1]s shann tú don eisiúint %[2]s i stór %[3]s. +issue.x_mentioned_you = Luaigh @%s tú: +issue.action.force_push = Bhrúigh %[1]s an %[2]s go fórsa ó %[3]s go %[4]s. +issue.action.push_1 = Bhrúigh @%[1]s %[3]d tiomáintí go %[2]s +issue.action.push_n = @%[1]s brúite % [3]d tiomáintí chuig %[2]s +issue.action.close = @%[1]s dúnta #%[2]d. +issue.action.reopen = D'athoscail @%[1]s #%[2]d. +issue.action.merge = Chomhcheangail @%[1]s #%[2]d le %[3]s. +issue.action.approve = Cheadaigh @%[1]s an t-iarratas tarraingthe seo. +issue.action.reject = D'iarr @%[1]s athruithe ar an iarratas tarraingthe seo. +issue.action.review = Rinne @%[1]s trácht ar an iarratas tarraingthe seo. +issue.action.review_dismissed = Dhiúltaigh @%[1]s an léirmheas deiridh ó %[2]s don iarratas tarraingthe seo. +issue.action.ready_for_review = Mharcáil @%[1]s an t-iarratas tarraingthe seo réidh lena athbhreithniú. +issue.action.new = Chruthaigh @%[1]s #%[2]d. +issue.in_tree_path = I %s: +release.new.subject = Scaoileadh %s i %s +release.new.text = D'eisigh @%[1]s %[2]s i %[3]s +release.title = Teideal: %s +release.note = Nóta: +release.downloads = Ãoslódálacha: +release.download.zip = Cód Foinse (ZIP) +release.download.targz = Cód Foinse (TAR.GZ) +repo.transfer.to_you = tú +repo.transfer.body = Chun glacadh leis nó a dhiúltú tabhair cuairt ar %s nó neamhaird a dhéanamh air. +team_invite.subject = Tá cuireadh tugtha agat ag %[1]s chun dul le heagraíocht %[2]s +team_invite.text_1 = Tá cuireadh tugtha ag %[1]s duit chun dul le foireann %[2]s in eagraíocht %[3]s. +team_invite.text_2 = Cliceáil ar an nasc seo a leanas le do thoil chun dul isteach san fhoireann: +team_invite.text_3 = Nóta: Bhí an cuireadh seo beartaithe do %[1]s. Mura raibh tú ag súil leis an gcuireadh seo, is féidir leat neamhaird a dhéanamh den ríomhphost seo. + +[modal] +yes = Tá +no = Níl +confirm = Deimhnigh +cancel = Cealaigh +modify = Nuashonraigh + +[form] +UserName = Ainm úsáideora +RepoName = Ainm stórais +Email = Seoladh ríomhphoist +Password = Pasfhocal +Retype = Deimhnigh Pasfhocal +PayloadUrl = URL Pálasta +TeamName = Ainm foirne +AuthName = Ainm údaraithe +AdminEmail = Ríomhphost riaracháin +NewBranchName = Ainm brainse nua +CommitSummary = Achoimre tiomáintí +CommitMessage = Tiomantas teachtaireacht +CommitChoice = Rogha tiomanta +TreeName = Cosán comhaid +Content = Ãbhar +SSPISeparatorReplacement = Deighilteoir +SSPIDefaultLanguage = Teanga Réamhshocraithe +require_error = ` ní féidir a bheith folamh.` +git_ref_name_error = ` caithfidh gur ainm tagartha Git dea-chruthaithe é.` +size_error = ` ní mór méid %s.` +min_size_error = ` ní mór go mbeadh carachtar %s ar a laghad ann.` +max_size_error = caithfidh %s carachtar ar a mhéad a bheith ann. +email_error = `ní seoladh ríomhphoist bailí é.` +url_error = `ní URL bailí é "%s".` +include_error = ` ní mór fotheaghrán a bheith ann "%s".` +glob_pattern_error = ` tá patrún glob neamhbhailí: %s.` +regex_pattern_error = `tá patrún regex neamhbhailí: %s.` +invalid_group_team_map_error = ` tá mapáil neamhbhailí: %s` +unknown_error = Earráid anaithnid: +captcha_incorrect = Tá an cód CAPTCHA mícheart. +password_not_match = Ní mheaitseálann na pasfhocail. +lang_select_error = Roghnaigh teanga ón liosta. +username_been_taken = Tá an t-ainm úsáideora tógtha cheana féin. +username_change_not_local_user = Ní cheadaítear d'úsáideoirí neamháitiúla a n-ainm úsáideora a athrú. +repo_name_been_taken = Úsáidtear ainm an stór cheana féin. +repository_force_private = Tá Force Private cumasaithe: ní féidir stórais phríobháideacha a dhéanamh poiblí. +repository_files_already_exist = Tá comhaid ann cheana féin don stór seo. Déan teagmháil leis an riarthóir córais. +repository_files_already_exist.adopt = Tá comhaid ann cheana don stór seo agus ní féidir iad a ghlacadh ach amháin. +repository_files_already_exist.delete = Tá comhaid ann cheana féin don stór seo. Ní mór duit iad a scriosadh. +repository_files_already_exist.adopt_or_delete = Tá comhaid ann cheana féin don stór seo. Glac iad nó scrios iad. +visit_rate_limit = Thug cuairt chianda aghaidh ar theorannú rátaí. +2fa_auth_required = Bhí fíordheimhniú dhá thoisc ag teastáil ó chianchuairt. +org_name_been_taken = Tá ainm na heagraíochta glactha cheana féin. +team_name_been_taken = Tá ainm na foirne glactha cheana féin. +team_no_units_error = Ceadaigh rochtain ar chuid stórais amháin ar a laghad. +email_been_used = Úsáidtear an seoladh ríomhphoist cheana féin. +email_invalid = Tá an seoladh ríomhphoist neamhbhailí. +openid_been_used = Úsáidtear an seoladh OpenID "%s" cheana féin. +username_password_incorrect = Tá ainm úsáideora nó pasfhocal mícheart. +password_complexity = Ní shásaíonn pasfhocal ceanglais castachta: +password_lowercase_one = Carachtar beaga amháin ar a laghad +password_uppercase_one = Carachtar cás uachtair amháin ar a laghad +password_digit_one = Digit amháin ar a laghad +password_special_one = Carachtar speisialta amháin ar a laghad (poncaíocht, lúibíní, luachana, srl.) +enterred_invalid_repo_name = Tá ainm an stórais a chuir tú isteach mícheart. +enterred_invalid_org_name = Tá ainm na heagraíochta a chuir tú isteach mícheart. +enterred_invalid_owner_name = Níl ainm an úinéara nua bailí. +enterred_invalid_password = Tá an pasfhocal a chuir tú isteach mícheart. +unset_password = Níor shocraigh an t-úsáideoir logála isteach an pasfhocal. +unsupported_login_type = Ní thacaítear leis an gcineál logála isteach chun cuntas a scriosadh. +user_not_exist = Níl an t-úsáideoir ann. +team_not_exist = Níl an fhoireann ann. +cannot_add_org_to_team = Ní féidir eagraíocht a chur leis mar bhall foirne. +duplicate_invite_to_team = Tugadh cuireadh don úsáideoir cheana féin mar bhall foirne. +organization_leave_success = D'fhág tú an eagraíocht %s go rathúil. +invalid_ssh_key = Ní féidir d'eochair SSH a fhíorú: %s +invalid_gpg_key = Ní féidir d'eochair GPG a fhíorú: %s +invalid_ssh_principal = Príomhoide neamhbhailí: %s +must_use_public_key = Is eochair phríobháideach an eochair a sholáthraíonn tú. Ná uaslódáil d'eochair phríobháideach áit ar bith Úsáid d'eochair phoiblí ina ionad. +auth_failed = Theip ar fhíordheimhniú:%v +target_branch_not_exist = Níl spriocbhrainse ann. +admin_cannot_delete_self = Ní féidir leat tú féin a scriosadh nuair is riarachán tú. Bain do phribhléidí riaracháin ar dtús. + +[user] +change_avatar = Athraigh do abhatár… +joined_on = Cláraigh ar %s +repositories = Stórais +activity = Gníomhaíocht Phoiblí +follow = Lean +unfollow = Dílean +starred = Stórais Réaltaithe +watched = Stórais Breathnaithe +code = Cód +projects = Tionscadail +overview = Forbhreathnú +user_bio = Beathaisnéis +email_visibility.limited = Tá do sheoladh ríomhphoist le feiceáil do gach úsáideoir fíordheimhnithe +show_on_map = Taispeáin an áit seo ar léarscáil +settings = Socruithe Úsáideora +disabled_public_activity = Dhíchumasaigh an t-úsáideoir seo infheictheacht phoiblí na gníomhaíochta. +form.name_reserved = Tá an t-ainm úsáideora "%s" in áirithe. +form.name_pattern_not_allowed = Ní cheadaítear an patrún "%s" in ainm úsáideora. + +[settings] +profile = Próifíl +account = Cuntas +appearance = Dealramh +password = Pasfhocal +security = Slándáil +avatar = Abhatár +ssh_gpg_keys = Eochracha SSH/GPG +applications = Iarratais +repos = Stórais +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í +location_placeholder = Comhroinn do shuíomh thart le daoine eile +full_name = Ainm Iomlán +website = Láithreán Gréasáin +location = Suíomh +update_profile = Nuashonraigh Próifíl +update_language_not_found = Níl teanga “%s†ar fáil. +update_language_success = Tá an teanga nuashonraithe. +update_profile_success = Nuashonraíodh do phróifíl. +change_username = Tá d'ainm úsáideora athraithe. +change_username_prompt = Nóta: Athraíonn athrú d'ainm úsáideora URL do chuntais freisin. +change_username_redirect_prompt = Athreoróidh an sean-ainm úsáideora go dtí go n-éilíonn duine é +continue = Lean ar aghaidh +cancel = Cealaigh +language = Teanga +ui = Téama +hidden_comment_types = Cineálacha tráchtaireachta ceilte +hidden_comment_types.ref_tooltip = Tuairimí ina dtagraíodh an tsaincheist seo ó shaincheiste/coiste eile... +hidden_comment_types.issue_ref_tooltip = Tuairimí ina n-athraíonn an t-úsáideoir an brainse/clib a bhaineann leis an tsaincheist +comment_type_group_reference = Tagairt +comment_type_group_label = Lipéad +comment_type_group_milestone = Cloch Mhíle +comment_type_group_assignee = Sannaitheoir +comment_type_group_title = Teideal +comment_type_group_branch = Brainse +comment_type_group_time_tracking = Rianú Ama +comment_type_group_deadline = Spriocdháta +comment_type_group_dependency = Spleáchas +comment_type_group_lock = Stádas Glas +comment_type_group_review_request = Iarratas athbhreithnithe +comment_type_group_pull_request_push = Tiomáintí curtha leis +comment_type_group_project = Tionscadal +comment_type_group_issue_ref = Tagairt eisiúna +saved_successfully = Sábháiltear do shocruithe go rathúil. +privacy = Príobháideacht +keep_activity_private = Folaigh gníomhaíocht ó leathanach próifíle +enable_custom_avatar = Úsáid Avatar Saincheaptha +choose_new_avatar = Roghnaigh avatar nua +update_avatar = Nuashonrú Avatar +delete_current_avatar = Scrios Avatar Reatha +uploaded_avatar_not_a_image = Ní íomhá é an comhad uaslódáilte. +uploaded_avatar_is_too_big = Sáraíonn méid an chomhaid uaslódáilte (%d KiB) an méid uasta (%d KiB). +update_avatar_success = Tá do avatar nuashonraithe. +update_user_avatar_success = Nuashonraíodh avatar an úsáideora. +old_password = Pasfhocal Reatha +new_password = Pasfhocal Nua +retype_new_password = Deimhnigh Pasfhocal Nua +password_incorrect = Tá an pasfhocal reatha mícheart. +manage_emails = Bainistigh Seoltaí Ríomhphoist +email_desc = Úsáidfear do phríomhsheoladh ríomhphoist le haghaidh fógraí, aisghabháil pasfhocal agus, ar choinníoll nach bhfuil sé i bhfolach, oibríochtaí Git bunaithe ar an ngréas +primary = Príomhúil +activated = Gníomhachtaithe +requires_activation = Éilíonn gníomhachtú +primary_email = Déan príomhúil +activate_email = Seol Gníomhachtaithe +activations_pending = Gníomhartha ar Feitheamh +can_not_add_email_activations_pending = Tá gníomhachtú ar feitheamh, déan iarracht arís i gceann cúpla nóiméad más mian leat ríomhphost nua a chur leis. +delete_email = Bain +email_deletion = Bain Seoladh R-phoist +email_deletion_desc = Bainfear an seoladh ríomhphoist agus an fhaisnéis ghaolmhar as do chuntas. Ní bheidh na tiomáintí Git a bhaineann leis an seoladh ríomhphoist seo athraithe. Lean ar aghaidh? +email_deletion_success = Tá an seoladh ríomhphoist bainte. +theme_update_success = Nuashonraíodh do théama. +theme_update_error = Níl an téama roghnaithe ann. +openid_deletion = Bain Seoladh OpenID +openid_deletion_desc = Cuirfidh an seoladh OpenID seo a bhaint as do chuntas cosc ort síniú isteach leis. Lean ar aghaidh? +openid_deletion_success = Tá an seoladh OpenID bainte. +add_new_openid = Cuir URI OpenID nua leis +add_email = Cuir Seoladh R-phoist leis +add_openid = Cuir OpenID URI +add_email_success = Cuireadh an seoladh ríomhphoist nua leis. +email_preference_set_success = Socraíodh rogha ríomhphoist go rathúil. +add_openid_success = Cuireadh an seoladh OpenID nua leis. +keep_email_private = Folaigh Seoladh ríomhphoist +openid_desc = Ligeann OpenID duit fíordheimhniú a tharmligean chuig soláthraí seachtrach. +manage_ssh_keys = Bainistigh Eochracha SSH +manage_ssh_principals = Bainistigh Príomhoidí Teastas SSH +manage_gpg_keys = Bainistigh Eochracha GPG +add_key = Cuir Eochair +principal_desc = Tá baint ag na príomhoidí deimhnithe SSH seo le do chuntas agus ceadaíonn siad rochtain iomlán ar do stórtha. +add_new_principal = Cuir Príomhoide +ssh_key_been_used = Cuireadh an eochair SSH seo leis an bhfreastalaí cheana féin. +ssh_key_name_used = Tá eochair SSH leis an ainm céanna ar do chuntas cheana féin. +ssh_principal_been_used = Cuireadh an príomhoide seo leis an bhfreastalaí cheana féin. +gpg_key_id_used = Tá eochair GPG poiblí leis an aitheantas céanna ann cheana féin. +gpg_no_key_email_found = Ní mheaitseálann an eochair GPG seo aon seoladh ríomhphoist gníomhachtaithe a bhaineann le do chuntas. Féadfar é a chur leis fós má shíníonn tú an comhartha a chuirtear ar fáil. +gpg_key_matched_identities = Aitheantais Meaitseáilte: +gpg_key_matched_identities_long = Meaitseálann na haitheantais leabaithe san eochair seo na seoltaí ríomhphoist gníomhachtaithe seo a leanas don úsáideoir seo. Is féidir gealltanais a mheaitseálann na seoltaí ríomhphoist seo a fhíorú leis an eochair seo. +gpg_key_verified = Eochair Fhíoraithe +gpg_key_verified_long = Fíoraíodh an eochair le heochairchomhartha agus is féidir í a úsáid chun a fhíorú go bhfuil geallta ag meaitseáil aon seoltaí ríomhphoist gníomhachtaithe don úsáideoir seo chomh maith le haon aitheantas comhoiriúnaithe don eochair seo. +gpg_key_verify = Fíoraigh +gpg_invalid_token_signature = Ní mheaitseálann an eochair, an síniú agus an comhartha GPG a sholáthraítear nó tá an comhartha as dáta. +gpg_token_required = Ní mór duit síniú a sholáthar don chomhartha thíos +gpg_token = Comhartha +gpg_token_help = Is féidir leat síniú a ghiniúint ag úsáid: +gpg_token_signature = Síniú Armúrtha GPG +verify_gpg_key_success = Tá eochair GPG “%s†fíoraithe. +ssh_key_verified = Eochair Fhíoraithe +ssh_key_verified_long = Fíoraíodh an eochair le heochairchomhartha agus is féidir í a úsáid chun a fhíorú go bhfuil geallta ag teacht le haon seoltaí ríomhphoist gníomhachtaithe don úsáideoir seo. +ssh_key_verify = Fíoraigh +ssh_invalid_token_signature = Ní mheaitseálann an eochair, an síniú nó an comhartha SSH a sholáthraítear nó tá an comhartha as dáta. +ssh_token_required = Ní mór duit síniú a sholáthar don chomhartha thíos +ssh_token = Comhartha +ssh_token_help = Is féidir leat síniú a ghiniúint ag úsáid: +ssh_token_signature = Síniú armúrtha SSH +verify_ssh_key_success = Tá eochair SSH “%s†fíoraithe. +subkeys = Fo-eochracha +key_id = Eochair ID +key_name = Ainm Eochair +key_content = Ãbhar +principal_content = Ãbhar +add_key_success = Cuireadh an eochair SSH “%s†leis. +add_gpg_key_success = Cuireadh an eochair GPG “%s†leis. +add_principal_success = Cuireadh príomhoide an deimhnithe SSH “%s†leis. +delete_key = Bain +ssh_key_deletion = Bain Eochair SSH +gpg_key_deletion = Bain Eochair GPG +ssh_principal_deletion = Bain Príomhoide Teastas SSH +ssh_key_deletion_desc = Ag baint eochair SSH, cuirtear a rochtain ar do chuntas a chúlghairm. Lean ar aghaidh? +gpg_key_deletion_desc = Má bhaintear eochair GPG, ní fhíoraítear gealltanais a shínigh sé. An leanfaidh tú ar aghaidh? +ssh_principal_deletion_desc = Cúlghairtear a rochtain ar do chuntas Príomhoide Teastas SSH. Lean ar aghaidh? +ssh_key_deletion_success = Tá an eochair SSH bainte. +gpg_key_deletion_success = Tá an eochair GPG bainte amach. +ssh_principal_deletion_success = Tá an príomhoide bainte. +added_on = Cuireadh leis ar %s +valid_until_date = Bailí go dtí %s +valid_forever = Bailí go deo +last_used = Úsáidtear go deireanach ar +no_activity = Gan gníomhaíocht le déanaí +can_read_info = Léigh +can_write_info = Scríobh +key_state_desc = Úsáideadh an eochair seo le 7 lá anuas +token_state_desc = Úsáideadh an comhartha seo le 7 lá anuas +principal_state_desc = Úsáideadh an príomhoide seo le 7 lá anuas +show_openid = Taispeáin ar phróifíl +hide_openid = Folaigh ón bpróifíl +ssh_signonly = Tá SSH faoi láthair faoi láthair mar sin ní úsáidtear na heochracha seo ach le haghaidh fíorú sínithe tiomanta. +ssh_externally_managed = Déantar an eochair SSH seo a bhainistiú go seachtrach don úsáideoir seo +generate_new_token = Gin Comhartha Nua +token_name = Ainm Comhartha +generate_token = Gin Comhartha +generate_token_success = Gintear do chomhartha nua. Cóipeáil é anois mar ní thaispeánfar é arís. +generate_token_name_duplicate = Úsáideadh %s mar ainm feidhmchláir cheana féin. Úsáid ceann nua le do thoil. +delete_token = Scrios +access_token_deletion = Scrios Comhartha Rochtana +access_token_deletion_desc = Cúlghairfear rochtain ar do chuntas le haghaidh feidhmchláir a úsáideann é a scriosadh comhartha. Ní féidir é seo a chur ar ais. Lean ar aghaidh? +delete_token_success = Tá an comhartha scriosta. Níl rochtain ag iarratais a úsáideann é ar do chuntas a thuilleadh. +repo_and_org_access = Rochtain Stórála agus Eagraíochta +permissions_public_only = Poiblí amháin +permissions_access_all = Gach (poiblí, príobháideach agus teoranta) +select_permissions = Roghnaigh ceadanna +permission_no_access = Gan rochtain +permission_read = Léigh +permission_write = Léigh agus Scríobh +at_least_one_permission = Ní mór duit cead amháin ar a laghad a roghnú chun comhartha a chruthú +permissions_list = Ceadanna: +manage_oauth2_applications = Bainistigh Feidhmchláir OAuth2 +edit_oauth2_application = Cuir Feidhmchlár OAuth2 in eagar +remove_oauth2_application = Bain Feidhmchlár OAuth2 +remove_oauth2_application_desc = Ag baint feidhmchlár OAuth2, cúlghairfear rochtain ar gach comhartha rochtana sínithe. Lean ar aghaidh? +remove_oauth2_application_success = Scriosadh an feidhmchlár. +create_oauth2_application = Cruthaigh Feidhmchlár OAuth2 nua +create_oauth2_application_button = Cruthaigh Feidhmchlár +create_oauth2_application_success = D'éirigh leat feidhmchlár nua OAuth2 a chruthú. +update_oauth2_application_success = D'éirigh leat an feidhmchlár OAuth2 a nuashonrú. +oauth2_application_name = Ainm Feidhmchláir +oauth2_confidential_client = Cliant Rúnda. Roghnaigh le haghaidh aipeanna a choimeádann an rún faoi rún, mar aipeanna gréasáin. Ná roghnaigh le haghaidh aipeanna dúchasacha lena n-áirítear aipeanna deisce agus soghluaiste. +oauth2_redirect_uris = URIs a atreorú. Úsáid líne nua do gach URI le do thoil. +save_application = Sábháil +oauth2_client_id = ID Cliant +oauth2_client_secret = Rúnda Cliant +oauth2_regenerate_secret = Athghin Rún +oauth2_regenerate_secret_hint = Chaill tú do rún? +oauth2_client_secret_hint = Ní thaispeánfar an rún arís tar éis duit an leathanach seo a fhágáil nó a athnuachan. Déan cinnte le do thoil gur shábháil tú é. +oauth2_application_edit = Cuir in eagar +oauth2_application_create_description = Tugann feidhmchláir OAuth2 rochtain d'iarratas tríú páirtí ar chuntais úsáideora ar an gcás seo. +oauth2_application_remove_description = Cuirfear feidhmchlár OAuth2 a bhaint cosc air rochtain a fháil ar chuntais úsáideora údaraithe ar an gcás seo. Lean ar aghaidh? +authorized_oauth2_applications = Feidhmchláir Údaraithe OAuth2 +revoke_key = Cúlghairm +revoke_oauth2_grant = Rochtain a chúlghairm +revoke_oauth2_grant_description = Cuirfidh rochtain ar an bhfeidhmchlár tríú páirtí seo a chúlghairm cosc ar an bhfeidhmchlár seo rochtain An bhfuil tú cinnte? +revoke_oauth2_grant_success = Cúlghairtear rochtain go rathúil. +twofa_desc = Chun do chuntas a chosaint ar goid pasfhocal, is féidir leat fón cliste nó gléas eile a úsáid chun pasfhocail aon-uaire bunaithe ar am (“TOTPâ€) a fháil. +twofa_recovery_tip = Má chailleann tú do ghléas, beidh tú in ann eochair aisghabhála aonúsáide a úsáid chun rochtain ar do chuntas a fháil ar ais. +twofa_is_enrolled = Tá do chuntas cláraithe i bhfíord heimhniú dhá fhachtóir faoi láthair. +twofa_not_enrolled = Níl do chuntas cláraithe faoi láthair i bhfíordheimhniú dhá fhachtóir. +twofa_disable = Díchumasaigh Fíordheimhniú Dhá-Fachtóir +twofa_scratch_token_regenerate = Athghin Eochair Aisghabhála Aonúsáide +twofa_scratch_token_regenerated = Is é %s d'eochair aisghabhála aonúsáide anois. Stóráil é in áit shábháilte, mar ní thaispeánfar é arís. +twofa_enroll = Cláraigh le Fíordheimhniú Dhá-Fachtóir +twofa_disable_note = Is féidir leat fíordheimhniú dhá fhachtóir a dhíchumasú más gá. +twofa_disable_desc = Má dhíchumasaítear fíordheimhniú dhá fhachtóir beidh do chuntas chomh slán. Lean ar aghaidh? +regenerate_scratch_token_desc = Má chuir tú d'eochair aisghabhála míchuir tú nó má d'úsáid tú é cheana féin chun síniú isteach, is féidir leat é a athshocrú anseo. +twofa_disabled = Tá fíordheimhniú dhá fhachtóir díchumasaithe. +scan_this_image = Scan an íomhá seo le d'fheidhmchlár fíordheimhnithe: +or_enter_secret = Nó cuir isteach an rún: %s +then_enter_passcode = Agus cuir isteach an paschód a léirítear san fheidhmchlár: +passcode_invalid = Tá an pascód mícheart. Bain triail as arís. +twofa_enrolled = Tá do chuntas cláraithe go rathúil. Stóráil d'eochair aisghabhála aonúsáide (%s) in áit shábháilte, mar ní thaispeánfar é arís. +twofa_failed_get_secret = Theip ar rún a fháil. +webauthn_desc = Is feistí crua-earraí iad eochracha slándála ina bhfuil eochracha cripte Is féidir iad a úsáid le haghaidh fíordheimhniú dhá fhachtóir. Caithfidh eochracha slándála tacú le caigh deán Fíordheimhnithe WebAuthn +webauthn_register_key = Cuir Eochair Slándála +webauthn_nickname = Leasainm +webauthn_delete_key = Bain Eochair Slándála +webauthn_delete_key_desc = Má bhaineann tú eochair slándála ní féidir leat síniú leis a thuilleadh. Lean ar aghaidh? +webauthn_key_loss_warning = Má chailleann tú d'eochracha slándála, caillfidh tú rochtain ar do chuntas. +webauthn_alternative_tip = B'fhéidir gur mhaith leat modh fíordheimhnithe breise a chumrú. +link_account = Cuntas Nasc +remove_account_link = Bain Cuntas Nasctha +remove_account_link_success = Tá an cuntas nasctha bainte amach. +hooks.desc = Cuir crúcaí gréasán leis a spreagfar do gach stór ar leatsa iad. +orgs_none = Níl tú ina bhall d'aon eagraíochtaí. +repos_none = Níl aon stórais agat. +delete_account = Scrios Do Cuntas +delete_prompt = Scriosfaidh an oibríocht seo do chuntas úsáideora go buan. Nà FÉIDIR é a chealú. +delete_with_all_comments = Tá do chuntas níos óige ná %s. Chun tuairimí taibhse a sheachaint, scriosfar gach trácht saincheistea/PR leis. +confirm_delete_account = Deimhnigh scriosadh +delete_account_title = Scrios Cuntas Úsáide +delete_account_desc = An bhfuil tú cinnte gur mhaith leat an cuntas úsáideora seo a scriosadh go buan? +email_notifications.enable = Cumasaigh Fógraí Ríomhphoist +email_notifications.onmention = Ríomhphost amháin ar luaigh +email_notifications.disable = Díchumasaigh Fógraí Ríomhphoist +email_notifications.submit = Socraigh rogha ríomhphoist +email_notifications.andyourown = Agus Do Fógraí Féin +visibility = Infheictheacht úsáideora +visibility.public = Poiblí +visibility.public_tooltip = Infheicthe do gach duine +visibility.limited = Teoranta +visibility.private = Príobháideach +visibility.private_tooltip = Ní fheictear ach do bhaill d'eagraíochtaí a chuaigh tú isteach + +[repo] +owner = Úinéir +owner_helper = B'fhéidir nach dtaispeánfar roinnt eagraíochtaí sa anuas mar gheall ar theorainn uasta comhaireamh stórais. +repo_name = Ainm Stórais +repo_size = Méid an Stóras +template = Teimpléad +template_helper = Déan teimpléad den stóras +template_description = Ligeann stórais teimpléid d'úsáideoirí stórais nua a ghiniúint leis an struchtúr eolaire céanna, comhaid agus socruithe roghnacha. +visibility = Infheictheacht +visibility_description = Ní bheidh ach an t-úinéir nó baill na heagraíochta má tá cearta acu in ann é a fheiceáil. +visibility_helper = Déan stóras príobháideach +visibility_helper_forced = Cuireann riarthóir do shuíomh iallach ar stórais nua a bheith príobháideach. +clone_helper = Teastaíonn cabhair ó chlónáil? Tabhair cuairt ar Cabhair. +fork_repo = Stóras Forc +fork_from = Forc ó +already_forked = Tá tú tar éis %s a fhoirceann +fork_to_different_account = Forc chuig cuntas difriúil +fork_visibility_helper = Ní féidir infheictheacht stór forcailte a athrú. +fork_branch = Brainse le clónú chuig an bhforc +all_branches = Gach brainse +fork_no_valid_owners = Ní féidir an stór seo a fhorcáil toisc nach bhfuil úinéirí bailí ann. +use_template = Úsáid an teimpléad seo +open_with_editor = Oscail le %s +download_zip = Ãoslódáil ZIP +download_tar = Ãoslódáil TAR.GZ +download_bundle = Ãoslódáil BUNDLE +generate_repo = Cruthaigh Stóras +generate_from = Gin Ó +repo_desc = Cur síos +repo_desc_helper = Cuir isteach tuairisc ghearr (roghnach) +repo_gitignore_helper_desc = Roghnaigh na comhaid nach bhfuil le rianú ó liosta teimpléid do theangacha coitianta. Cuirtear déantáin tipiciúla a ghineann uirlisí tógála gach teanga san áireamh ar.gitignore de réir réamhshocraithe. +license = Ceadúnas +object_format = Formáid Oibiacht +readme = README +readme_helper_desc = Seo an áit inar féidir leat cur síos iomlán a scríobh do thionscadal. +create_repo = Cruthaigh Stóras +default_branch = Branse Réamhshocraithe +default_branch_label = réamhshocraithe +default_branch_helper = Is é an brainse réamhshocraithe an bunbhrainse d'iarratais tarraingthe agus gealltanna cód. +mirror_prune = Prúnáil +mirror_prune_desc = Bain tagairtí cianrianaithe atá as feidhm +mirror_interval_invalid = Níl an eatramh scátháin bailí. +mirror_sync = sioncronaithe +mirror_sync_on_commit = Sioncrónaigh nuair a bhrúitear geallúintí +mirror_address = Clón Ó URL +mirror_address_desc = Cuir aon dhintiúir riachtanacha sa chuid Údaraithe. +mirror_address_url_invalid = Tá an URL curtha ar fáil neamhbhailí. Caithfidh tú gach comhpháirt den url a éalú i gceart. +mirror_address_protocol_invalid = Tá an URL curtha ar fáil neamhbhailí. Ní féidir ach suíomhanna http (s)://nó git://a úsáid le haghaidh scátháin. +mirror_lfs = Stóráil Comhad Móra (LFS) +mirror_lfs_desc = Gníomhachtaigh scáthú sonraí LFS. +mirror_lfs_endpoint = Críochphointe LFS +mirror_lfs_endpoint_desc = Déanfaidh Sync iarracht an url clónála a úsáid chun an freastalaí LFS a chinneadh. Is féidir leat críochphointe saincheaptha a shonrú freisin má tá na sonraí LFS stórtha stóráilte áit éigin eile. +mirror_last_synced = Sincronaithe Deireanach +mirror_password_placeholder = (Gan athrú) +mirror_password_blank_placeholder = (Neamhshocraithe) +mirror_password_help = Athraigh ainm úsáideora chun pasfhocal stóráilte a scriosadh. +watchers = Breathnóirí +stargazers = Réalteoirí +stars_remove_warning = Bainfidh sé seo na réaltaí go léir ón stóras seo. +forks = Forcanna +stars = Réaltaí +reactions_more = agus %d níos mó +unit_disabled = Tá an chuid stórais seo díchumasaithe ag riarthóir an láithreáin. +language_other = Eile +adopt_search = Iontráil ainm úsáideora chun stórais neamhghlactha a chuardach... (fág bán chun gach rud a fháil) +adopt_preexisting_label = Glacadh le Comhaid +adopt_preexisting = Glac le comhaid atá ann cheana +adopt_preexisting_content = Cruthaigh stór ó %s +adopt_preexisting_success = Comhaid ghlacadh agus stór cruthaithe ó %s +delete_preexisting_label = Scrios +delete_preexisting = Scrios comhaid atá ann cheana +delete_preexisting_content = Scrios comhaid i %s +delete_preexisting_success = Scriosta comhaid neamhghlactha i %s +blame_prior = Féach ar an milleán roimh an athrú seo +blame.ignore_revs = Ag déanamh neamhairde de leasuithe i .git-blame-ignore-revs. Cliceáil anseo chun seachaint agus an gnáth-amharc milleán a fheiceáil. +blame.ignore_revs.failed = Theip ar neamhaird a dhéanamh ar leasuithe i .git-blame-ignore-revs. +transfer.accept = Glac le hAistriú +transfer.accept_desc = Aistriú chuig “%s†+transfer.reject = Diúltaigh aistriú +transfer.reject_desc = `Cealaigh aistriú chuig "%s"` +transfer.no_permission_to_accept = Níl cead agat glacadh leis an aistriú seo. +transfer.no_permission_to_reject = Níl cead agat an aistriú seo a dhiúltú. +desc.private = Príobháideach +desc.public = Poiblí +desc.template = Teimpléad +desc.internal = Inmheánach +desc.archived = Cartlannaithe +desc.sha256 = SHA256 +template.items = Míreanna Teimpléad +template.git_content = Ãbhar Git (Brainse Réamhshocraithe) +template.git_hooks = Crúcanna Git +template.git_hooks_tooltip = Faoi láthair ní féidir leat Git Hooks a mhodhnú nó a bhaint nuair a chuirtear leis. Roghnaigh é seo ach amháin má tá muinín agat as an stóras teimpléid. +template.webhooks = Crúcaí gréasáin +template.topics = Topaicí +template.avatar = Abhatár +template.issue_labels = Lipéid Eisiúna +template.one_item = Ní mór mír teimpléad amháin ar a laghad a roghnú +template.invalid = Ní mór stór teimpléad a roghnú +archive.title_date = Tá an stóras seo cartlannaithe ar %s. Is féidir leat comhaid a fheiceáil agus é a chlónú, ach ní féidir leat saincheisteanna a bhrú nó a oscailt ná iarratais a tharraingt. +form.reach_limit_of_creation_1 = Tá úinéir an stóras tar éis teorainn de %d stóras a bhaint amach cheana féin. +form.reach_limit_of_creation_n = Tá úinéir an stórais tar éis teorainn de %d stórtha a bhaint amach cheana féin. +form.name_reserved = Tá ainm an stór "%s" in áirithe. +form.name_pattern_not_allowed = Ní cheadaítear an patrún "%s" in ainm stór. +need_auth = Údarú +migrate_options = Roghanna Imirce +migrate_options_mirror_helper = Beidh an stóras seo ina scáthán +migrate_options_lfs = Aimirce comhaid LFS +migrate_options_lfs_endpoint.label = Críochphointe LFS +migrate_options_lfs_endpoint.description = Déanfaidh imirce iarracht do chianda Git a úsáid chun freastalaí LFS a chinneadh. Is féidir leat críochphointe saincheaptha a shonrú freisin má tá na sonraí LFS stórtha stóráilte áit éigin eile. +migrate_options_lfs_endpoint.description.local = Tacaítear le cosán freastalaí áitiúil freisin. +migrate_options_lfs_endpoint.placeholder = Má fhágtar bán, díorthófar an críochphointe ón URL clóin +migrate_items = Míreanna Imirce +migrate_items_wiki = Wiki +migrate_items_milestones = Clocha míle +migrate_items_labels = Lipéid +migrate_items_issues = Saincheisteanna +migrate_items_pullrequests = Iarrataí Tarraing +migrate_items_merge_requests = Iarrataí Cumaisc +migrate_items_releases = Eisiúintí +migrate_repo = Stóras Imirc +migrate.clone_address = Aimirce/ Clón Ó URL +migrate.github_token_desc = Is féidir leat comhartha amháin nó níos mó a chur le camóg scartha anseo chun imirce a dhéanamh níos gasta mar gheall ar theorainn ráta API GitHub. RABHADH: D'fhéadfadh mí-úsáid na ngné seo beartas an sholáthraí seirbhíse a shárú agus blocáil cuntais a bheith mar thoradh air. +migrate.clone_local_path = nó cosán freastalaí áitiúil +migrate.permission_denied = Ní cheadaítear duit stórais áitiúla a iompórtáil. +migrate.permission_denied_blocked = Ní féidir leat allmhairiú ó óstaigh neamh-cheadaithe, iarr ar an riarachán socruithe ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS a sheiceáil le do thoil. +migrate.invalid_lfs_endpoint = Níl an críochphointe LFS bailí. +migrate.failed = Theip ar an imirce:% v +migrate.migrate_items_options = Teastaíonn Comhartha Rochtana chun míreanna breise a aistriú +migrated_from = Aistríodh ó %[2]s +migrated_from_fake = Aistrithe ó %[1]s +migrate.migrate = Aistrigh Ó %s +migrate.migrating = Ag aistriú ó %s ... +migrate.migrating_failed = Theip ar aistriú ó %s. +migrate.migrating_failed.error = Theip ar aistriú: %s +migrate.migrating_failed_no_addr = Theip ar an imirce. +migrate.git.description = Aistrigh stór amháin ó aon seirbhís Git. +migrate.gitlab.description = Aistrigh sonraí ó gitlab.com nó ó chásanna GitLab eile. +migrate.gitea.description = Aistrigh sonraí ó gitea.com nó ó chásanna Gitea eile. +migrate.gogs.description = Aistrigh sonraí ó notabug.org nó ó chásanna eile de chuid Gogs. +migrate.onedev.description = Aistrigh sonraí ó code.onedev.io nó ó chásanna OneDev eile. +migrate.codebase.description = Aistrigh sonraí ó codebasehq.com. +migrate.gitbucket.description = Aistrigh sonraí ó chásanna GitBucket. +migrate.migrating_git = Sonraí Git a Aimirce +migrate.migrating_topics = Ãbhair Imirce +migrate.migrating_milestones = Clocha Míle a Imirce +migrate.migrating_labels = Lipéid Imirce +migrate.migrating_releases = Eisiúintí Imirce +migrate.migrating_issues = Saincheisteanna Imirce +migrate.migrating_pulls = Iarratais Tarraingthe á n-Imirce +migrate.cancel_migrating_title = Cealaigh Imirce +migrate.cancel_migrating_confirm = Ar mhaith leat an imirce seo a chealú? +mirror_from = scáthán de +forked_from = forcailte ó +generated_from = a ghintear ó +fork_from_self = Ní féidir leat stóras atá agat a fhorcáil. +fork_guest_user = Sínigh isteach chun an stóras seo a fhorc. +watch_guest_user = Sínigh isteach chun féachaint ar an stór seo. +star_guest_user = Sínigh isteach chun an stóras seo a réalú. +watch = Fhéachaint +unwatch = Dífhéachaint +star = Réalta +unstar = Bain Réalta +fork = Forc +download_archive = Ãoslódáil Stóras +more_operations = Tuilleadh oibríochtaí +quick_guide = Treoir Tapa +clone_this_repo = Clóin an stóras seo +cite_this_repo = Luaigh an stóras seo +create_new_repo_command = Stóras nua a chruthú ar an líne ordaithe +push_exist_repo = Stóras atá ann cheana a bhrú ón líne ordaithe +empty_message = Níl aon ábhar sa stóras seo. +broken_message = Ní féidir na sonraí Git atá mar bhunús leis an stóras seo a léamh. Déan teagmháil le riarthóir an chás seo nó scrios an stóras seo. +code = Cód +code.desc = Rochtain ar chód foinse, comhaid, gealltanais agus brainsí. +branch = Brainse +tree = Crann +clear_ref = `Tagairt reatha soiléir` +filter_branch_and_tag = Scagaire brainse nó clib +find_tag = Aimsigh clib +branches = Brainsí +tag = Clib +tags = Clibeanna +issues = Saincheisteanna +pulls = Iarratais Tarraingthe +packages = Pacáistí +actions = Gníomhartha +release = Scaoileadh +releases = Scaoileann +labels = Lipéid +milestones = Clocha míle +org_labels_desc = Lipéid ar leibhéal eagraíochta is féidir a úsáid le gach stóras faoin eagraíocht seo +org_labels_desc_manage = bainistigh +commits = Tiomáintí +commit = Tiomantas +released_this = scaoileadh seo +file.title = %s ag %s +file_raw = Amh +file_history = Stair +file_view_source = Féach Foinse +file_view_rendered = Amharc Rindreáilte +file_view_raw = Amharc Amh +file_permalink = Buan-nasc +file_too_large = Tá an comhad ró-mhór le taispeáint. +invisible_runes_header = `Tá carachtair Unicode dofheicthe sa chomhad seo ` +invisible_runes_description = `Tá carachtair dofheicthe Unicode sa chomhad seo nach féidir a idirdhealú do dhaoine ach d'fhéadfadh ríomhaire iad a phróiseáil ar bhealach difriúil. Má cheapann tú go bhfuil sé seo d'aon ghnó, is féidir leat neamhaird a dhéanamh go sábháilte don rabhadh seo Úsáid an cnaipe Escape chun iad a nochtadh. ` +ambiguous_runes_header = `Tá carachtair Unicode débhríoch sa chomhad seo ` +ambiguous_runes_description = `Tá carachtair Unicode sa chomhad seo a d'fhéadfadh a bheith mearbhall le carachtair eile. Má cheapann tú go bhfuil sé seo d'aon ghnó, is féidir leat neamhaird a dhéanamh go sábháilte don rabhadh seo Úsáid an cnaipe Escape chun iad a nochtadh. ` +invisible_runes_line = `Tá carachtair unicode dofheicthe ag an líne seo ` +ambiguous_runes_line = `Tá carachtair unicode débhríoch ag an líne seo ` +ambiguous_character = `Is féidir %[1]c [U+%04[1]X] a mheascadh le %[2]c [U+%04[2]X]` +escape_control_characters = Éalú +unescape_control_characters = Dí-Éalú +file_copy_permalink = Cóipeáil Buan-nasc +view_git_blame = Féach ar Git Blame +stored_lfs = Stóráilte le Git LFS +symbolic_link = Nasc siombalach +executable_file = Comhad Infheidhmithe +vendored = Díoltóra +generated = Gintear +commit_graph = Graf Tiomantas +commit_graph.select = Roghnaigh brainsí +commit_graph.hide_pr_refs = Folaigh Iarrataí Tarraing +commit_graph.monochrome = Mona +commit_graph.color = Dath +commit.contained_in = Tá an tiomantas seo le fáil i: +commit.contained_in_default_branch = Tá an tiomantas seo mar chuid den bhrainse réamhshocraithe +commit.load_referencing_branches_and_tags = Luchtaigh brainsí agus clibeanna a thagraíonn an tiomantas +blame = An milleán +download_file = Ãoslódáil comhad +normal_view = Amharc Gnáth +line = líne +lines = línte +from_comment = (trácht) +editor.add_file = Cuir Comhad +editor.new_file = Comhad Nua +editor.upload_file = Uaslódáil Comhad +editor.edit_file = Cuir Comhad in eagar +editor.preview_changes = Athruithe Réamhamhar +editor.cannot_edit_lfs_files = Ní féidir comhaid LFS a chur in eagar sa chomhéadan gréasáin. +editor.cannot_edit_non_text_files = Ní féidir comhaid dhénártha a chur in eagar sa chomhéadan gréasáin. +editor.edit_this_file = Cuir Comhad in eagar +editor.this_file_locked = Tá an comhad faoi ghlas +editor.must_be_on_a_branch = Caithfidh tú a bheith ar bhrainse chun athruithe a dhéanamh nó a mholadh ar an gcomhad seo. +editor.fork_before_edit = Ní mór duit an stór seo a fhorcáil chun athruithe a dhéanamh nó a mholadh ar an gcomhad seo. +editor.delete_this_file = Scrios Comhad +editor.must_have_write_access = Caithfidh rochtain scríofa a bheith agat chun athruithe a dhéanamh nó a mholadh ar an gcomhad seo. +editor.file_delete_success = Tá an comhad "%s" scriosta. +editor.name_your_file = Ainmnigh do chomhad… +editor.or = nó +editor.cancel_lower = Cealaigh +editor.commit_signed_changes = Tiomantas Athruithe Sínithe +editor.commit_changes = Athruithe a Tiomantas +editor.add = Cuir %s leis +editor.update = Nuashonraigh %s +editor.delete = Scrios %s +editor.patch = Cuir paiste i bhfeidh +editor.patching = Paisteáil: +editor.fail_to_apply_patch = Ní féidir paiste "%s" a chur i bhfeidhm +editor.new_patch = Paiste Nua +editor.commit_message_desc = Cuir cur síos leathnaithe roghnach leis… +editor.signoff_desc = Cuir leantóir sínithe ag an gcoiteoir ag deireadh na teachtaireachta logála tiomanta. +editor.create_new_branch = Cruthaigh brainse nua don ghealltanas seo agus cuir tús le hiarratas tarraingthe. +editor.create_new_branch_np = Cruthaigh brainse nua don tiomantas seo. +editor.propose_file_change = Athrú comhad a mholadh +editor.new_branch_name = Ainmnigh an brainse nua don gealltanas seo +editor.new_branch_name_desc = Ainm brainse nua… +editor.cancel = Cealaigh +editor.filename_cannot_be_empty = Ní féidir ainm an chomhaid a bheith folamh. +editor.filename_is_invalid = Tá ainm an chomhaid neamhbhailí: "%s". +editor.branch_does_not_exist = Níl brainse "%s" ann sa stóras seo. +editor.branch_already_exists = Tá brainse "%s" ann cheana féin sa stóras seo. +editor.directory_is_a_file = Úsáidtear ainm eolaire "%s" cheana féin mar ainm comhaid sa stóras seo. +editor.file_is_a_symlink = Is nasc siombalach é "%s". Ní féidir naisc shiombalacha a chur in eagar san eagarthóir gréasáin +editor.filename_is_a_directory = Úsáidtear ainm comhaid "%s" cheana féin mar ainm eolaire sa stóras seo. +editor.file_editing_no_longer_exists = Níl an comhad atá á chur in eagar, "%s", ann sa stóras seo a thuilleadh. +editor.file_deleting_no_longer_exists = Níl an comhad atá á scriosadh, "%s", ann sa stóras seo a thuilleadh. +editor.file_changed_while_editing = Tá athrú tagtha ar ábhar an chomhad ó thosaigh tú ag eagarthóireacht Cliceáil anseo chun iad a fheiceáil nó Athru ithe a Tiomantas arís chun iad a fhorscríobh. +editor.file_already_exists = Tá comhad darb ainm "%s" ann cheana féin sa stóras seo. +editor.push_out_of_date = Is cosúil go bhfuil an brú as dáta. +editor.commit_empty_file_header = Tiomantas comhad folamh +editor.commit_empty_file_text = Tá an comhad atá tú ar tí tiomantas folamh. Ar aghaidh? +editor.no_changes_to_show = Níl aon athruithe le taispeáint. +editor.fail_to_update_file = Theip ar nuashonrú/cruthú comhad "%s". +editor.fail_to_update_file_summary = Teachtaireacht Earráide: +editor.push_rejected_no_message = Dhiúltaigh an freastalaí an t-athrú gan teachtaireacht. Seiceáil Git Hooks le do thoil. +editor.push_rejected = Dhiúltaigh an freastalaí an t-athrú. Seiceáil Git Hooks le do thoil. +editor.push_rejected_summary = Teachtaireacht Diúltaithe Iomlán: +editor.add_subdir = Cuir eolaire leis… +editor.unable_to_upload_files = Theip ar uaslódáil comhaid go "%s" le hearráid: %v +editor.upload_file_is_locked = Tá comhad "%s" faoi ghlas ag %s. +editor.upload_files_to_dir = `Uaslódáil comhaid go "%s"` +editor.cannot_commit_to_protected_branch = Ní féidir gealltanas a thabhairt don bhrainse faoi chosaint "%s". +editor.no_commit_to_branch = Ní féidir tiomantas a thabhairt go díreach don bhrainse mar: +editor.user_no_push_to_branch = Ní féidir leis an úsáideoir brúigh go dtí an brainse +editor.require_signed_commit = Éilíonn an Brainse tiomantas sínithe +editor.cherry_pick = Roghnaigh silíní %s ar: +editor.revert = Fill %s ar: +editor.commit_email = Tiomantas ríomhphost +commits.desc = Brabhsáil stair athraithe cód foinse. +commits.commits = Tiomáintí +commits.no_commits = Níl aon ghealltanas i gcoiteann. Tá stair iomlán difriúil ag "%s" agus "%s". +commits.nothing_to_compare = Tá na brainsí seo cothrom. +commits.search.tooltip = Is féidir eochairfhocail a réamhfhostú le “údar:â€, “committer:â€, “after:â€, nó “before:â€, e.g. "fill an t-údar:Alice roimh: 2019-01-13". +commits.search_branch = An Brainse seo +commits.search_all = Gach Brainse +commits.author = Údar +commits.message = Teachtaireacht +commits.date = Dáta +commits.older = Níos sine +commits.newer = Níos nuaí +commits.signed_by = Sínithe ag +commits.signed_by_untrusted_user = Sínithe ag úsáideoir neamhiontaofa +commits.signed_by_untrusted_user_unmatched = Sínithe ag úsáideoir neamhiontaofa nach bhfuil ag teacht leis an gcoiste +commits.gpg_key_id = GPG Eochair ID +commits.ssh_key_fingerprint = Méarloirg Eochair SSH +commits.view_path = Féach ag an bpointe seo sa stair +commit.operations = Oibríochtaí +commit.revert = Téigh ar ais +commit.revert-header = Téigh ar ais: %s +commit.revert-content = Roghnaigh brainse chun filleadh ar: +commit.cherry-pick = Roghnaigh silíní +commit.cherry-pick-header = Roghnaigh silíní: %s +commit.cherry-pick-content = Roghnaigh brainse chun silíní a phiocadh air: +commitstatus.error = Earráid +commitstatus.failure = Teip +commitstatus.pending = Ar feitheamh +commitstatus.success = Rath +projects = Tionscadail +projects.description = Cur síos (roghnach) +projects.description_placeholder = Cur síos +projects.create = Cruthaigh Tionscadal +projects.title = Teideal +projects.new = Tionscadal Nua +projects.new_subheader = Déan do chuid oibre a chomhordú, a rianú agus a nuashonrú in aon áit amháin, ionas go bhfanann na tionscadail trédhearcach agus de réir sceidil. +projects.create_success = Tá an tionscadal "%s" cruthaithe. +projects.deletion = Scrios tionscadal +projects.deletion_desc = Má scriostar tionscadal, bainfear de gach saincheist a bhaineann leis é. Lean ort? +projects.deletion_success = Tá an tionscadal scriosta. +projects.edit = Cuir Tionscadal in Eagar +projects.edit_subheader = Eagraíonn tionscadail saincheisteanna agus rianaíonn siad dul chun cinn. +projects.modify = Cuir Tionscadal in Eagar +projects.edit_success = Tá an tionscadal "%s" nuashonraithe. +projects.open = Oscailte +projects.close = Dún +projects.column.assigned_to = Sannta do +issues.desc = Eagraigh tuarascálacha fabht, tascanna agus cloch mhíle. +issues.filter_assignees = Scagaire Sannaitheoir +issues.filter_milestones = Cloch Mhíle Scagaire +issues.filter_projects = Tionscadal Scagaire +issues.filter_labels = Lipéad Scagaire +issues.filter_reviewers = Athbhreithneoir Scagaire +issues.new = Eagrán Nua +issues.new.title_empty = Ní féidir leis an teideal a bheith folamh +issues.new.labels = Lipéid +issues.new.clear_labels = Lipéid shoiléir +issues.new.projects = Tionscadail +issues.new.clear_projects = Tionscadail soiléire +issues.new.no_projects = Gan aon tionscadal +issues.new.open_projects = Tionscadail Oscailte +issues.new.closed_projects = Tionscadail Dúnta +issues.new.no_items = Gan aon earraí +issues.new.milestone = Cloch Mhíle +issues.new.no_milestone = Gan Chloch Mhíle +issues.new.clear_milestone = Cloch Mhíle soiléir +issues.new.assignees = Sannaitheoirí +issues.new.clear_assignees = Ceannaitheoirí soiléir +issues.new.no_assignees = Gan aon Sannaitheoirí +issues.new.no_reviewers = Gan Léirmheastóirí +issues.edit.already_changed = Ní féidir athruithe a shábháil ar an tsaincheist. Dealraíonn sé gur athraigh úsáideoir eile an t-ábhar cheana féin. Athnuachan an leathanach agus déan iarracht eagarthóireacht arís chun a gcuid athruithe a sheachaint +issues.choose.get_started = Faigh Tosaigh +issues.choose.open_external_link = Oscailte +issues.choose.blank = Réamhshocrú +issues.choose.blank_about = Cruthaigh saincheist ó theimpléad réamhshocraithe. +issues.choose.ignore_invalid_templates = Rinneadh neamhaird ar theimpléid +issues.choose.invalid_templates = %v teimpléad neamhbhail(í) aimsíodh +issues.choose.invalid_config = Tá earráidí sa chumraíocht eisiúint: +issues.no_ref = Níl aon Brainse/Clib Sonraithe +issues.create = Cruthaigh Saincheist +issues.new_label = Lipéad Nua +issues.new_label_placeholder = Ainm lipéad +issues.new_label_desc_placeholder = Cur síos +issues.create_label = Cruthaigh Lipéad +issues.label_templates.fail_to_load_file = Theip ar lódáil an chomhaid teimpléid lipéid "%s": %v +issues.add_label = cuireadh an lipéad %s %s leis +issues.add_labels = cuireadh na %s lipéid %s +issues.remove_label = bainte an %s lipéad %s +issues.remove_labels = bainte na %s lipéid %s +issues.add_remove_labels = chuir %s leis agus bhain %s lipéid %s +issues.add_milestone_at = `chuir seo leis an gcloch mhíle %s %s` +issues.add_project_at = `chuir seo leis an tionscadal %s %s` +issues.change_milestone_at = `mionathraithe an chloch mhíle ó %s go %s %s` +issues.change_project_at = `mionathraithe an tionscadal ó %s go %s %s` +issues.remove_milestone_at = ` bhain seo den %schloch mhíle %s` +issues.remove_project_at = `bhain sé seo den %san tionscadal %s` +issues.deleted_milestone = `(scriosta)` +issues.deleted_project = `(scriosta)` +issues.self_assign_at = `féin-shannta an %s seo` +issues.add_assignee_at = `a shannadh ag %s %s` +issues.remove_assignee_at = `a bhí gan shannadh ag %s %s` +issues.remove_self_assignment = `bhain siad a sannadh %s` +issues.change_title_at = `athraigh an teideal ó %s go %s %s` +issues.change_ref_at = `tagairt athraithe ó %s go %s %s` +issues.remove_ref_at = `bhaint an tagairt %s %s` +issues.add_ref_at = `Cuireadh an tagairt %s %s leis` +issues.delete_branch_at = `brainse scriosta %s %s` +issues.filter_label = Lipéad +issues.filter_label_exclude = `Úsáid alt + cliceáil/iontráil chun lipéid a eisiamh` +issues.filter_label_no_select = Gach lipéad +issues.filter_label_select_no_label = Gan lipéad +issues.filter_milestone = Cloch Mhíle +issues.filter_milestone_all = Gach cloch mhíle +issues.filter_milestone_none = Gan aon clocha mhíle +issues.filter_milestone_open = Clocha mhíle oscailte +issues.filter_milestone_closed = Clocha mhíle dúnta +issues.filter_project = Tionscadal +issues.filter_project_all = Gach tionscadal +issues.filter_project_none = Gan aon tionscadal +issues.filter_assignee = Sannaitheoir +issues.filter_assginee_no_select = Gach sannaithe +issues.filter_assginee_no_assignee = Gan sannaitheoir +issues.filter_poster = Údar +issues.filter_type = Cineál +issues.filter_type.all_issues = Gach saincheist +issues.filter_type.assigned_to_you = Sannta duit +issues.filter_type.created_by_you = Cruthaithe agat +issues.filter_type.mentioning_you = Ag tagairt duit +issues.filter_type.review_requested = Athbhreithniú iarrtha +issues.filter_type.reviewed_by_you = Athbhreithnithe agat +issues.filter_sort = Sórtáil +issues.filter_sort.latest = Is nuaí +issues.filter_sort.oldest = Is sine +issues.filter_sort.recentupdate = Nuashonraithe le déanaí +issues.filter_sort.leastupdate = Is lú a nuashonraíodh le déanaí +issues.filter_sort.mostcomment = Is mó a bhfuil tráchtanna air +issues.filter_sort.leastcomment = Is lú a bhfuil tráchtanna air +issues.filter_sort.nearduedate = An dáta dlite is gaire +issues.filter_sort.farduedate = An dáta dlite is faide +issues.filter_sort.moststars = An líon réaltaí is mó +issues.filter_sort.feweststars = An líon réaltaí is lú +issues.filter_sort.mostforks = An líon forcanna is mó +issues.filter_sort.fewestforks = An líon forcanna is lú +issues.action_open = Oscailte +issues.action_close = Dún +issues.action_label = Lipéad +issues.action_milestone = Cloch Mhíle +issues.action_milestone_no_select = Gan Chloch Mhíle +issues.action_assignee = Sannaitheoir +issues.action_assignee_no_select = Gan sannaitheoir +issues.action_check = Seiceáil/Dísheiceáil +issues.action_check_all = Seiceáil/Dísheiceáil gach mireanna +issues.opened_by = oscail %[1]s le %[3]s +pulls.merged_by = le %[3]s cumasc %[1]s +pulls.merged_by_fake = le %[2]s a chumasc %[1]s +issues.closed_by = le dúnadh %[3]s %[1]s +issues.opened_by_fake = oscail %[1]s le %[2]s +issues.closed_by_fake = faoi ​​%[2]s dúnadh %[1]s +issues.previous = Roimhe Seo +issues.next = Ar Aghaidh +issues.open_title = Oscailte +issues.closed_title = Dúnta +issues.draft_title = Dréacht +issues.num_comments_1 = %d trácht +issues.num_comments = %d tráchtanna +issues.commented_at = `trácht %s ` +issues.delete_comment_confirm = An bhfuil tú cinnte gur mhaith leat an trácht seo a scriosadh? +issues.context.copy_link = Cóipeáil Nasc +issues.context.quote_reply = Luaigh Freagra +issues.context.edit = Cuir in eagar +issues.context.delete = Scrios +issues.no_content = Níl aon tuairisc ar fáil. +issues.close = Dún Eagrán +issues.comment_pull_merged_at = cumasc tiomantas %[1]s le %[2]s %[3]s +issues.comment_manually_pull_merged_at = cumasc tiomantas %[1]s le %[2]s %[3]s +issues.close_comment_issue = Dún le trácht +issues.reopen_issue = Athoscail +issues.reopen_comment_issue = Athoscail le trácht +issues.create_comment = Trácht +issues.closed_at = `dhún an cheist seo %[2]s` +issues.reopened_at = `athoscail an t-eagrán seo %[2]s` +issues.commit_ref_at = `rinne tagairt don cheist seo ó ghealltanas %[2]s` +issues.ref_issue_from = `rinne dagairt don cheist seo %[4]s %[2]s` +issues.ref_pull_from = `rinne dagairt don iarratas tarraingthe seo %[4]s %[ 2]s` +issues.ref_closed_from = `dhún an cheist seo %[4]s %[2]s` +issues.ref_reopened_from = `d'athoscail an eagrán seo %[4]s %[2]s` +issues.ref_from = `ó %[1]s` +issues.author = Údar +issues.role.owner = Úinéir +issues.role.owner_helper = Is é an t-úsáideoir seo úinéir an stór seo. +issues.role.member = Comhalta +issues.role.member_helper = Is ball den eagraíocht é an t-úsáideoir seo a bhfuil an stór seo ina úinéireacht. +issues.role.collaborator = Comhoibritheoir +issues.role.collaborator_helper = Tugadh cuireadh don úsáideoir seo comhoibriú ar an stóras. +issues.role.first_time_contributor = Cuiditheoir den chéad uair +issues.role.first_time_contributor_helper = Seo é an chéad uair a chuir an t-úsáideoir seo leis an stóras. +issues.role.contributor = Cuiditheoir +issues.re_request_review = Athiarraigh athbhreithniú +issues.is_stale = Rinneadh athruithe ar an PR seo ón athbhreithniú seo +issues.remove_request_review = Bain iarratas athbhreithni +issues.remove_request_review_block = Ní féidir iarratas athbhreithnithe a bhaint +issues.dismiss_review = Díbhe Athbhreithnithe +issues.dismiss_review_warning = An bhfuil tú cinnte gur mhaith leat an athbhreithnithe seo a dhíbhe? +issues.sign_in_require_desc = Sínigh isteach chun dul isteach sa chomhrá seo. +issues.edit = Cuir in eagar +issues.cancel = Cealaigh +issues.save = Sábháil +issues.label_title = Ainm +issues.label_description = Cur síos +issues.label_color = Dath +issues.label_exclusive = Eisiach +issues.label_archive = Lipéad Cartlann +issues.label_archived_filter = Taispeáin lipéid cartlainne +issues.label_archive_tooltip = Eisiatar lipéid chartlainne de réir réamhshocraithe ó na moltaí nuair a dhéantar cuardach de réir lipéid. +issues.label_exclusive_desc = Ainmnigh an lipéad scope/item chun é a dhéanamh comheisiatach le lipéid scope/ eile. +issues.label_exclusive_warning = Bainfear aon lipéid scóipe contrártha le linn eagarthóireacht a dhéanamh ar lipéid iarratais eisiúna nó tarraingthe. +issues.label_count = %d lipéid +issues.label_open_issues = %d saincheisteanna oscailte/iarratais tarraing +issues.label_edit = Cuir in eagar +issues.label_delete = Scrios +issues.label_modify = Cuir Lipéad in Eagar +issues.label_deletion = Scrios Lipéad +issues.label_deletion_desc = Baineann lipéad a scriosadh é ó gach saincheist. Lean ar aghaidh? +issues.label_deletion_success = Tá an lipéad scriosta. +issues.label.filter_sort.alphabetically = Aibítreach +issues.label.filter_sort.reverse_alphabetically = Aisiompú in ord aibítre +issues.label.filter_sort.by_size = Méid is lú +issues.label.filter_sort.reverse_by_size = Méid is mó +issues.attachment.open_tab = `Cliceáil chun "%s" a fheiceáil i gcluaisín nua` +issues.attachment.download = `Cliceáil chun "%s" a íoslódáil` +issues.subscribe = Liostáil +issues.unsubscribe = Díliostáil +issues.lock = Cuir glas ar an gcomhrá +issues.unlock = Díghlasáil comhrá +issues.lock.unknown_reason = Ní féidir fadhb a ghlasáil le cúis anaithnid. +issues.lock_duplicate = Ní féidir saincheist a ghlasáil faoi dhó. +issues.unlock_error = Ní féidir saincheist nach bhfuil glasáilte a dhíghlasáil. +issues.lock_confirm = Glas +issues.unlock_confirm = Díghlasáil +issues.lock.notice_2 = - Is féidir leatsa agus le comhoibrithe eile a bhfuil rochtain acu ar an stór seo fós tuairimí a fhágáil a fheiceann daoine eile. +issues.lock.notice_3 = - Is féidir leat an tsaincheist seo a dhíghlasáil arís sa todhchaí. +issues.unlock.notice_1 = - Bheadh gach duine in ann trácht a dhéanamh ar an gceist seo arís. +issues.unlock.notice_2 = - Is féidir leat an tsaincheist seo a ghlasáil arís sa todhchaí i gcónaí. +issues.lock.reason = Cúis le glasáil +issues.lock.title = Glas comhrá ar an gceist seo. +issues.unlock.title = Díghlasáil comhrá ar an gceist seo. +issues.comment_on_locked = Ní féidir leat trácht a dhéanamh ar shaincheist faoi ghlas. +issues.delete = Scrios +issues.delete.title = Scrios an t-eagrán seo? +issues.delete.text = An bhfuil tú cinnte gur mhaith leat an cheist seo a scriosadh? (Bainfidh sé seo an t-inneachar go léir go buan. Smaoinigh ar é a dhúnadh ina ionad sin, má tá sé i gceist agat é a choinneáil i gcartlann) +issues.tracker = Rianaitheoir Ama +issues.tracker_auto_close = Stopfar ama go huathoibríoch nuair a dhúnfar an tsaincheist seo +issues.tracking_already_started = `Tá tús curtha agat cheana féin ag rianú ama ar eagrán eile!` +issues.cancel_tracking_history = `rianú ama curtha ar ceal %s` +issues.del_time = Scrios an log ama seo +issues.del_time_history = `an t-am caite scriosta %s` +issues.add_time_hours = Uaireanta +issues.add_time_minutes = Miontuairi +issues.add_time_sum_to_small = Níor iontráilíodh aon am. +issues.time_spent_total = An t-am iomlán a chaitear +issues.time_spent_from_all_authors = `Am Iomlán Caitear: %s` +issues.due_date = Dáta dlite +issues.force_push_compare = Déan comparáid +issues.dependency.title = Spleithiúlachtaí +issues.dependency.issue_no_dependencies = Níl aon spleáchais leagtha síos. +issues.dependency.pr_no_dependencies = Níl aon spleáchais leagtha síos. +issues.dependency.add = Cuir spleáchas leis… +issues.dependency.cancel = Cealaigh +issues.dependency.remove = Bain +issues.dependency.remove_info = Bain an spleáchas seo +issues.dependency.added_dependency = `cuireadh spleáchas nua %s` +issues.dependency.removed_dependency = `bainte spleáchas %s` +issues.dependency.pr_closing_blockedby = Cuireann na saincheisteanna seo a leanas bac ar an iarratas tarraingte seo a dhúnadh +issues.dependency.issue_closing_blockedby = Tá na saincheisteanna seo a leanas bac ar dhúnadh an cheist seo +issues.dependency.issue_close_blocks = Cuireann an tsaincheist seo bac ar dhúnadh na saincheisteanna +issues.dependency.pr_close_blocks = Cuireann an iarratas tarraingthe seo bac ar dhúnadh na saincheisteanna +issues.dependency.issue_close_blocked = Ní mór duit gach saincheist a chuireann bac ar an gceist seo a dhúnadh sular féidir leat é a dhúnadh. +issues.dependency.pr_close_blocked = Ní mór duit gach saincheist a bhlocálann an iarratas tarraingthe seo a dhúnadh sula féidir leat é a chumasc. +issues.dependency.blocks_short = Bloic +issues.dependency.blocked_by_short = Ag brath ar +issues.dependency.remove_header = Bain spleáchas +issues.dependency.issue_remove_text = Bainfidh sé seo an spleáchas ón gceist seo. Lean ar aghaidh? +issues.dependency.pr_remove_text = Bainfidh sé seo an spleáchas ón iarratas tarraingthe seo. Lean ar aghaidh? +issues.dependency.setting = Cumasaigh spleáchais le haghaidh Saincheisteanna agus Iarrataí Tar +issues.dependency.add_error_same_issue = Ní féidir leat ceist a dhéanamh ag brath air féin. +issues.dependency.add_error_dep_issue_not_exist = Níl saincheist spleách ann. +issues.dependency.add_error_dep_not_exist = Ní bhíonn spleáchas ann. +issues.dependency.add_error_dep_exists = Tá spleáchas ann cheana féin. +issues.dependency.add_error_cannot_create_circular = Ní féidir leat spleáchas a chruthú le dhá shaincheist a chuireann bac ar a chéile. +issues.dependency.add_error_dep_not_same_repo = Caithfidh an dá shaincheist a bheith sa stór céanna. +issues.review.self.approval = Ní féidir leat d'iarratas tarraingthe féin a cheadú. +issues.review.self.rejection = Ní féidir leat athruithe a iarraidh ar d'iarratas tarraingthe féin. +issues.review.dismissed_label = Dhiúltaigh +issues.review.left_comment = d'fhág trácht +issues.review.content.empty = Ní mór duit trácht a fhágáil a léiríonn an t-athrú (í) iarrtha. +issues.review.pending = Ar feitheamh +issues.review.pending.tooltip = Níl an nóta tráchta seo le feiceáil ag úsáideoirí eile faoi láthair. Chun do thuairimí ar feitheamh a chur isteach, roghnaigh "%s" -> "%s/%s/%s" ag barr an leathanaigh. +issues.review.reviewers = Léirmheasóirí +issues.review.outdated = As dáta +issues.review.outdated_description = Tá athrú tagtha ar ábhar ó rinneadh an trácht seo +issues.review.option.show_outdated_comments = Taispeáin tráchtanna atá as dáta +issues.review.option.hide_outdated_comments = Folaigh tráchtanna atá as dáta +issues.review.show_outdated = Taispeáin as dáta +issues.review.hide_outdated = Folaigh as dáta +issues.review.show_resolved = Taispeáin réitithe +issues.review.hide_resolved = Folaigh réitithe +issues.review.resolve_conversation = Réitigh comhrá +issues.review.un_resolve_conversation = Comhrá gan réiteach +issues.review.resolved_by = mharcáil an comhrá seo mar réitigh +issues.reference_issue.body = Comhlacht +issues.content_history.deleted = scriosta +issues.content_history.edited = curtha in eagar +issues.content_history.created = cruthaithe +issues.content_history.delete_from_history = Scrios ón stair +issues.content_history.delete_from_history_confirm = Scrios ón stair? +issues.content_history.options = Roghanna +issues.reference_link = Tagairt: %s +compare.compare_base = bonn +compare.compare_head = déan comparáid +pulls.desc = Cumasaigh iarratais tarraingthe agus athbhreithnithe cód. +pulls.new = Iarratas Tarraingthe Nua +pulls.view = Féach ar Iarratas Tarraing +pulls.edit.already_changed = Ní féidir athruithe a shábháil ar an iarratas tarraingthe. Dealraíonn sé gur athraigh úsáideoir eile an t-ábhar cheana féin. Athnuachan an leathanach agus déan iarracht eagarthóireacht arís chun a gcuid athruithe a sheachaint +pulls.compare_changes = Iarratas Tarraingthe Nua +pulls.allow_edits_from_maintainers = Ceadaigh eagarthóirí ó chothabhálaí +pulls.allow_edits_from_maintainers_desc = Is féidir le húsáideoirí a bhfuil rochtain scríofa acu ar an mbunbhrainse brú chuig an bhrainse +pulls.allow_edits_from_maintainers_err = Theip ar nuashonrú +pulls.compare_changes_desc = Roghnaigh an brainse le cumasc isteach agus an brainse le tarraingt uaidh. +pulls.has_viewed_file = Breathnaithe +pulls.has_changed_since_last_review = Athraithe ó d'athbhreithniú deire +pulls.viewed_files_label = Breathnaíodh ar %[1]d / %[2]d comhaid +pulls.expand_files = Leathnaigh gach comhaid +pulls.collapse_files = Laghdaigh gach comhaid +pulls.compare_base = cumaisc isteach +pulls.compare_compare = tarraing ó +pulls.switch_comparison_type = Athraigh cineál comparáide +pulls.switch_head_and_base = Athraigh ceann agus bonn +pulls.filter_branch = Brainse scagaire +pulls.show_all_commits = Taispeáin gach gealltanas +pulls.show_changes_since_your_last_review = Taispeáin athruithe ón léirmheas deiridh +pulls.showing_only_single_commit = Ag taispeáint athruithe tiomantais %[1]s amháin +pulls.showing_specified_commit_range = Ag taispeáint athruithe idir %[1]s..%[2]s +pulls.select_commit_hold_shift_for_range = Roghnaigh tiomantas. Coinnigh shift + cliceáil chun raon a roghnú +pulls.review_only_possible_for_full_diff = Ní féidir athbhreithniú a dhéanamh ach amháin nuair a bhreathnaítear ar an difríocht iomlán +pulls.filter_changes_by_commit = Scagaigh de réir tiomantas +pulls.nothing_to_compare = Tá na brainsí seo cothrom. Ní gá iarratas tarraingthe a chruthú. +pulls.nothing_to_compare_have_tag = Tá an brainse/clib roghnaithe cothrom. +pulls.nothing_to_compare_and_allow_empty_pr = Tá na brainsí seo cothrom. Beidh an PR seo folamh. +pulls.has_pull_request = `Tá iarratas tarraingthe idir na brainsí seo ann cheana: %[2]s#%[3]d` +pulls.create = Cruthaigh Iarratas Tarraing +pulls.change_target_branch_at = `athraigh an spriocbhrainse ó %s go %s %s` +pulls.tab_conversation = Comhrá +pulls.tab_commits = Tiomáintí +pulls.tab_files = Comhaid Athraithe +pulls.reopen_to_merge = Athoscail an t-iarratas tarraingthe seo le do thoil chun cumasc a dhéanamh. +pulls.cant_reopen_deleted_branch = Ní féidir an t-iarratas tarraingthe seo a athoscailt toisc gur scriosadh an brainse. +pulls.merged = Cumaiscthe +pulls.merged_success = D'éirigh leis an iarratas tarraingthe a chumasc agus a dhúnadh +pulls.closed = Iarratas tarraingthe dúnta +pulls.manually_merged = Cumaisc de láimh +pulls.merged_info_text = Is féidir an brainse %s a scriosadh anois. +pulls.is_closed = Tá an t-iarratas tarraingthe dúnta. +pulls.title_wip_desc = `Tosaigh an teideal le %s chun an t-iarratas tarraingthe a chosc ó chumasc de thaisme.` +pulls.cannot_merge_work_in_progress = Tá an t-iarratas tarraingthe seo marcáilte mar obair atá ar siúl. +pulls.still_in_progress = Fós ar siúl? +pulls.add_prefix = Cuir réimír %s leis +pulls.remove_prefix = Bain an réimír %s +pulls.data_broken = Tá an t-iarratas tarraingthe seo briste mar gheall ar fhaisnéis forc a bheith in easnamh. +pulls.files_conflicted = Tá athruithe ag an iarratas tarraingthe seo atá contrártha leis an spriocbhrainse. +pulls.required_status_check_failed = Níor éirigh le roinnt seiceálacha riachtanacha. +pulls.required_status_check_missing = Tá roinnt seiceanna riachtanacha ar iarraidh. +pulls.required_status_check_administrator = Mar riarthóir, féadfaidh tú an t-iarratas tarraingthe seo a chumasc fós. +pulls.can_auto_merge_desc = Is féidir an t-iarratas tarraingt seo a chumasc go huathoibríoch. +pulls.cannot_auto_merge_desc = Ní féidir an t-iarratas tarraingthe seo a chumasc go huathoibríoch mar gheall ar choinbhleachtaí. +pulls.cannot_auto_merge_helper = Cumaisc de láimh chun na coinbhleachtaí a réiteach. +pulls.no_merge_desc = Ní féidir an t-iarratas tarraingthe seo a chumasc toisc go bhfuil gach rogha cumaisc stór díchumasaithe. +pulls.no_merge_helper = Cumasaigh roghanna cumaisc i socruithe an stór nó cumasc an t-iarratas tarraingthe de láimh. +pulls.no_merge_wip = Ní féidir an t-iarratas tarraingthe seo a chumasc toisc go bhfuil sé marcáilte mar obair atá ar siúl é. +pulls.no_merge_not_ready = Níl an t-iarratas tarraingthe seo réidh le cumasc, seiceáil stádas athbhreithnithe agus seiceálacha stádais. +pulls.no_merge_access = Níl tú údaraithe chun an t-iarratas tarraingthe seo a chumasc. +pulls.merge_pull_request = Cruthaigh tiomantas cumaisc +pulls.rebase_merge_pull_request = Athbhunaigh ansin go tapa ar aghaidh +pulls.rebase_merge_commit_pull_request = Rebase ansin cruthaigh tiomantas cumaisc +pulls.squash_merge_pull_request = Cruthaigh tiomantas scuaise +pulls.fast_forward_only_merge_pull_request = Go tapa ar aghaidh amháin +pulls.merge_manually = Cumaisc de láimh +pulls.merge_commit_id = ID an tiomantis cumaisc +pulls.require_signed_wont_sign = Éilíonn an bhrainse tiomáintí shínithe, ach ní shínífear an cumasc seo +pulls.invalid_merge_option = Ní féidir leat an rogha cumaisc seo a úsáid don iarratas tarraingthe seo. +pulls.merge_conflict = Theip ar Cumaisc: Bhí coinbhleacht ann agus é ag cumasc. Leid: Bain triail as straitéis dhifriúil +pulls.merge_conflict_summary = Teachtaireacht Earráide +pulls.rebase_conflict = Theip ar Chumasc: Bhí coinbhleacht ann agus tiomantas á athbhunú: %[1]s. Leid: Bain triail as straitéis eile +pulls.rebase_conflict_summary = Teachtaireacht Earráide +pulls.unrelated_histories = Theip ar Cumaisc: Ní roinneann an ceann cumaisc agus an bonn stair choiteann. Leid: Bain triail as straitéis dhifriúil +pulls.merge_out_of_date = Theip ar Cumaisc: Agus an cumaisc á ghiniúint, nuashonraíodh an bonn. Leid: Bain triail as arís. +pulls.head_out_of_date = Theip ar Cumaisc: Agus an cumaisc á ghiniúint, nuashonraíodh an ceann. Leid: Bain triail as arís. +pulls.has_merged = Theip ar: Cumaisíodh an t-iarratas tarraingthe, ní féidir leat a chumasc arís nó an spriocbhrainse a athrú. +pulls.push_rejected = Theip ar Brúigh: Diúltaíodh don bhrú. Déan athbhreithniú ar na Git Hooks don stór seo. +pulls.push_rejected_summary = Teachtaireacht Diúltaithe Iomlán +pulls.push_rejected_no_message = Theip ar Brúigh: Diúltaíodh don bhrú ach ní raibh aon teachtaireacht iargúlta ann. Déan athbhreithniú ar Git Hooks don stór seo +pulls.open_unmerged_pull_exists = `Ní féidir leat oibríocht athoscailte a dhéanamh toisc go bhfuil iarratas tarraingthe ar feitheamh (#%d) le hairíonna comhionanna. ` +pulls.status_checking = Tá roinnt seiceála ar feitheamh +pulls.status_checks_success = D'éirigh le gach seiceáil +pulls.status_checks_warning = Thuairiscigh roinnt seiceálacha rabhaidh +pulls.status_checks_failure = Theip ar roinnt seiceálacha +pulls.status_checks_error = Thug roinnt seiceálacha earráidí +pulls.status_checks_requested = Riachtanach +pulls.status_checks_details = Sonraí +pulls.status_checks_hide_all = Folaigh gach seiceáil +pulls.status_checks_show_all = Taispeáin gach seiceáil +pulls.update_branch = Nuashonrú brainse trí chumasc +pulls.update_branch_rebase = Nuashonraigh an bhrainse trí athbhunú +pulls.update_branch_success = Bhí nuashonrú brainse rathúil +pulls.update_not_allowed = Ní cheadaítear duit brainse a nuashonrú +pulls.outdated_with_base_branch = Tá an brainse seo as dáta leis an mbunbhrainse +pulls.close = Dún Iarratas Tarraing +pulls.closed_at = `dhún an t-iarratas tarraingthe seo %[2]s` +pulls.reopened_at = `athoscail an t-iarratas tarraingthe seo %[2]s` +pulls.cmd_instruction_checkout_title = Seiceáil +pulls.cmd_instruction_checkout_desc = Ó stór tionscadail, seiceáil brainse nua agus déan tástáil ar na hathruithe. +pulls.cmd_instruction_merge_title = Cumaisc +pulls.clear_merge_message = Glan an teachtaireacht chumaisc +pulls.clear_merge_message_hint = Má imrítear an teachtaireacht chumaisc ní bhainfear ach ábhar na teachtaireachta tiomanta agus coimeádfar leantóirí git ginte ar nós "Co-Authored-By …". +pulls.auto_merge_button_when_succeed = (Nuair a éiríonn le seiceálacha) +pulls.auto_merge_when_succeed = Cumaisc uathoibríoch nuair a éiríonn +pulls.auto_merge_newly_scheduled = Bhí an t-iarratas tarraingt sceidealta le cumasc nuair a éiríonn le gach seiceáil. +pulls.auto_merge_has_pending_schedule = Bhí an t-iarratas tarraingthe seo sceidealaithe ag %[1]s chun cumasc uathoibríoch a dhéanamh nuair a éiríonn le gach seiceáil %[2]s. +pulls.auto_merge_cancel_schedule = Cealaigh cumasc uathoibríoch +pulls.auto_merge_not_scheduled = Níl an t-iarratas tarraingthe seo sceidealaithe le cumasc go huathoibríoch. +pulls.auto_merge_canceled_schedule = Cealaíodh an cumaisc uathoibríoch don iarratas tarraingthe seo. +pulls.auto_merge_newly_scheduled_comment = `sceidealta an t-iarratas tarraingthe seo le cumasc uathoibrithe nuair a éiríonn le gach seiceáil %[1]s` +pulls.auto_merge_canceled_schedule_comment = `curtha ar ceal uathchumasc leis an iarratas tarraingthe seo nuair a éiríonn le gach seiceáil %[1]s` +pulls.delete.title = Scrios an t-iarratas tarraingthe seo? +pulls.delete.text = An bhfuil tú cinnte gur mhaith leat an t-iarratas tarraingthe seo a scriosadh? (Bainfidh sé seo an t-inneachar go léir go buan. Smaoinigh ar é a dhúnadh ina ionad sin, má tá sé i gceist agat é a choinneáil i gcartlann) +pull.deleted_branch = (scriosta): %s +comments.edit.already_changed = Ní féidir athruithe a shábháil ar an trácht. Dealraíonn sé gur athraigh úsáideoir eile an t-ábhar cheana féin. Athnuachan an leathanach agus déan iarracht eagarthóireacht arís chun a gcuid athruithe a sheachaint +milestones.new = Cloch Mhíle Nua +milestones.closed = Dúnta %s +milestones.update_ago = Nuashonraithe %s +milestones.no_due_date = Gan dáta dlite +milestones.open = Oscailte +milestones.close = Dún +milestones.new_subheader = Is féidir le clocha míle cabhrú leat ceisteanna a eagrú agus a ndul chun cinn a rianú. +milestones.completeness = %d%% Críochnaithe +milestones.create = Cruthaigh Cloch Mhíle +milestones.title = Teideal +milestones.desc = Cur síos +milestones.due_date = Dáta dlite (roghnach) +milestones.clear = Glan +milestones.create_success = Cruthaíodh an chloch mhíle "%s". +milestones.edit = Cuir Cloch Mhíle in eagar +milestones.edit_subheader = Eagraíonn Garspriocanna saincheisteanna agus rianaítear dul chun cinn. +milestones.cancel = Cealaigh +milestones.modify = Nuashonraigh Cloch Mhíle +milestones.edit_success = Nuashonraíodh cloch mhíle "%s". +milestones.deletion = Scrios Cloch Mhíle +milestones.deletion_desc = Cuireann scriosadh cloch mhíle é as gach saincheist ghaolmhar. Lean ar aghaidh? +milestones.deletion_success = Tá an chloch mhíle scriosta. +milestones.filter_sort.name = Ainm +milestones.filter_sort.least_complete = Is lú críochnaithe +milestones.filter_sort.most_complete = Is mó críochnaithe +milestones.filter_sort.most_issues = Saincheisteanna is mó +milestones.filter_sort.least_issues = Saincheisteanna is lú +signing.will_sign = Síneofar an gealltanas seo le heochair "%s". +signing.wont_sign.error = Bhí earráid ann agus tú ag seiceáil an féidir an tiomantas a shíniú. +signing.wont_sign.never = Ní shínítear tiomáintí riamh. +signing.wont_sign.always = Sínítear tiomáintí i gcónaí. +signing.wont_sign.pubkey = Ní shíníofar an tiomantas toisc nach bhfuil eochair phoiblí agat a bhaineann le do chuntas. +signing.wont_sign.twofa = Caithfidh fíordheimhniú dhá-fhachtóir a bheith agat chun tiomáintí a shíniú. +signing.wont_sign.parentsigned = Ní shíníofar an tiomantas toisc nach bhfuil an tiomantas tuismitheora sínithe. +signing.wont_sign.basesigned = Ní shínífear an cumasc toisc nach bhfuil an tiomantas bunaithe sínithe. +signing.wont_sign.headsigned = Ní shínífear an cumasc toisc nach bhfuil an tiomantas ceann sínithe. +signing.wont_sign.commitssigned = Ní shínífear an cumasc toisc nach bhfuil na tiomáintí gaolmhara go léir sínithe. +signing.wont_sign.approved = Ní shíníofar an cumaisc toisc nach bhfuil an PR ceadaithe. +signing.wont_sign.not_signed_in = Níl tú sínithe isteach. +wiki = Vicí +wiki.welcome = Fáilte go dtí an Vicí. +wiki.welcome_desc = Ligeann an vicí duit cáipéisíocht a scríobh agus a roinnt le comhoibrithe. +wiki.desc = Scríobh agus roinn cáipéisíocht le comhoibrithe. +wiki.create_first_page = Cruthaigh an Chéad Leathanach +wiki.page = Leathanach +wiki.filter_page = Leathanach scagaire +wiki.new_page = Leathanach +wiki.page_title = Teideal an leathanaigh +wiki.page_content = Ãbhar an leathanaigh +wiki.default_commit_message = Scríobh nóta faoin nuashonrú leathanaigh seo (roghnach). +wiki.save_page = Sábháil Leathanach +wiki.last_commit_info = Cuireadh %s an leathanach seo in eagar %s +wiki.edit_page_button = Cuir in eagar +wiki.new_page_button = Leathanach Nua +wiki.file_revision = Athbhreithniú Leathanach +wiki.back_to_wiki = Ar ais go leathanach vicí +wiki.delete_page_button = Scrios Leathanach +wiki.delete_page_notice_1 = Ní féidir leathanach vicí "%s" a scriosadh. Lean ort? +wiki.page_already_exists = Tá leathanach vicí leis an ainm céanna ann cheana féin. +wiki.reserved_page = Tá an t-ainm leathanaigh vicí "%s" in áirithe. +wiki.pages = Leathanaigh +wiki.last_updated = Nuashonraithe deireanach %s +wiki.original_git_entry_tooltip = Féach ar an gcomhad bunaidh Git in ionad nasc cairdiúil a úsáid. +activity = Gníomhaíocht +activity.navbar.pulse = Cuisle +activity.navbar.code_frequency = Minicíocht Cód +activity.navbar.contributors = Rannpháirtithe +activity.navbar.recent_commits = Tiomáintí le déanaí +activity.period.filter_label = Tréimhse: +activity.period.daily = 1 lá +activity.period.halfweekly = 3 lá +activity.period.weekly = 1 seachtain +activity.period.monthly = 1 mhí +activity.period.quarterly = 3 mhí +activity.period.semiyearly = 6 mhí +activity.period.yearly = 1 bhliain +activity.overview = Forbhreathnú +activity.active_prs_count_1 = %d Iarratas Tarraingthe Gníomhach +activity.active_prs_count_n = %d Iarratais Tharraing Ghníomhach +activity.merged_prs_count_1 = Iarratas Tarraing Cumaisc +activity.merged_prs_count_n = Iarratais Tharraing Chomhcheangail +activity.opened_prs_count_1 = Iarratas Tarraing Beartaithe +activity.opened_prs_count_n = Iarratais Tarraing Beartaithe +activity.title.user_1 = %d úsáideoir +activity.title.user_n = %d úsáideoirí +activity.title.prs_1 = Iarratas tarraing %d +activity.title.prs_n = %d Iarratais Tarraing +activity.title.prs_merged_by = %s a chumasc ag %s +activity.title.prs_opened_by = %s arna mholadh ag %s +activity.merged_prs_label = Cumaiscthe +activity.opened_prs_label = Molta +activity.active_issues_count_1 = %d Eagrán Gníomhach +activity.active_issues_count_n = %d Ceisteanna Gníomhacha +activity.closed_issues_count_1 = Saincheist Dúnta +activity.closed_issues_count_n = Saincheisteanna Dúnta +activity.title.issues_1 = Saincheist %d +activity.title.issues_n = Saincheisteanna %d +activity.title.issues_closed_from = %s dúnta ó %s +activity.title.issues_created_by = %s cruthaithe ag %s +activity.closed_issue_label = Dúnta +activity.new_issues_count_1 = Eagrán Nua +activity.new_issues_count_n = Saincheisteanna Nua +activity.new_issue_label = Osclaíodh +activity.title.unresolved_conv_1 = %d Comhrá Neamhréitithe +activity.title.unresolved_conv_n = %d Comhráite Neamhréitithe +activity.unresolved_conv_desc = Níor réitíodh na saincheisteanna agus na hiarratais tarraingthe seo le déanaí fós. +activity.unresolved_conv_label = Oscailte +activity.title.releases_1 = Scaoileadh %d +activity.title.releases_n = Eisiúintí %d +activity.title.releases_published_by = %s foilsithe ag %s +activity.no_git_activity = Níor rinneadh aon ghníomhaíocht tiomanta sa tréimhse seo. +activity.git_stats_exclude_merges = Gan cumaisc a áireamh, +activity.git_stats_author_1 = %d údar +activity.git_stats_author_n = %d údair +activity.git_stats_pushed_1 = tá sé brúite +activity.git_stats_pushed_n = tá brú orthu +activity.git_stats_commit_1 = %d tiomantas +activity.git_stats_commit_n = %d tiomáintí +activity.git_stats_push_to_branch = chuig %s agus +activity.git_stats_push_to_all_branches = chuig gach brainse. +activity.git_stats_on_default_branch = Ar %s, +activity.git_stats_file_1 = %d comhad +activity.git_stats_file_n = %d comhaid +activity.git_stats_files_changed_1 = tá athrú tagtha +activity.git_stats_files_changed_n = tá athraithe +activity.git_stats_additions = agus tá ann +activity.git_stats_addition_1 = %d breisiú +activity.git_stats_addition_n = %d breiseanna +activity.git_stats_and_deletions = agus +activity.git_stats_deletion_1 = %d scriosadh +activity.git_stats_deletion_n = %d scriosta +contributors.contribution_type.filter_label = Cineál ranníocaíochta: +contributors.contribution_type.commits = Tiomáintí +contributors.contribution_type.additions = Breiseanna +contributors.contribution_type.deletions = Scriosadh +settings = Socruithe +settings.desc = Is é socruithe an áit ar féidir leat na socruithe don stóras a bhainistiú +settings.options = Stóras +settings.collaboration = Comhoibritheoirí +settings.collaboration.admin = Riarthóir +settings.collaboration.write = Scríobh +settings.collaboration.read = Léigh +settings.collaboration.owner = Úinéir +settings.collaboration.undefined = Neamhshainithe +settings.hooks = Crúcaí Gréasán +settings.githooks = Crúcanna Git +settings.basic_settings = Socruithe Bunúsacha +settings.mirror_settings = Socruithe Scáthán +settings.mirror_settings.docs = Cuir do stóras ar bun chun tiomáintí, clibeanna agus brainsí a shioncronú go huathoibríoch le stóras eile. +settings.mirror_settings.docs.disabled_pull_mirror.instructions = Socraigh do thionscadal chun tiomáintí, clibeanna agus brainsí a bhrú go huathoibríoch chuig stóras eile. Tá scátháin tarraingthe díchumasaithe ag riarthóir do shuíomh. +settings.mirror_settings.docs.disabled_push_mirror.instructions = Socraigh do thionscadal chun tiomáintí, clibeanna agus brainsí a tharraingt go huathoibríoch ó stóras eile. +settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning = Faoi láthair, ní féidir é seo a dhéanamh ach sa roghchlár "Imirce Nua". Le haghaidh tuilleadh eolais, téigh i gcomhairle le do thoil: +settings.mirror_settings.docs.disabled_push_mirror.info = Chuir riarthóir do shuíomh faoi dhíchumasú scátháin bhrú. +settings.mirror_settings.docs.no_new_mirrors = Tá do stóras ag teacht le hathruithe chuig nó ó stóras eile. Cuimhnigh le do thoil nach féidir leat scátháin nua a chruthú faoi láthair. +settings.mirror_settings.docs.can_still_use = Cé nach féidir leat scátháin atá ann cheana a mhodhnú nó cinn nua a chruthú, féadfaidh tú do scáthán atá ann cheana a úsáid fós. +settings.mirror_settings.docs.pull_mirror_instructions = Chun scáthán tarraingthe a shocrú, téigh i gcomhairle le do thoil: +settings.mirror_settings.docs.more_information_if_disabled = Is féidir leat tuilleadh eolais a fháil faoi scátháin bhrú agus tarraingthe anseo: +settings.mirror_settings.docs.doc_link_title = Conas is féidir liom na stórtha a scáthánú? +settings.mirror_settings.docs.doc_link_pull_section = an chuid "Ag tarraingt ó stóras" den doiciméadú. +settings.mirror_settings.docs.pulling_remote_title = Ag tarraingt ó stóras cianda +settings.mirror_settings.mirrored_repository = Stóras scátháin +settings.mirror_settings.pushed_repository = Stóras brúite +settings.mirror_settings.direction = Treo +settings.mirror_settings.direction.pull = Tarraingt +settings.mirror_settings.direction.push = Brúigh +settings.mirror_settings.last_update = Nuashonrú deireanach +settings.mirror_settings.push_mirror.none = Níl aon scátháin bhrú cumraithe +settings.mirror_settings.push_mirror.remote_url = URL Stóras Cianda Git +settings.mirror_settings.push_mirror.add = Cuir Scáthán Brúigh leis +settings.mirror_settings.push_mirror.edit_sync_time = Eagar eatramh sioncronaithe scátháin +settings.sync_mirror = Sioncronaigh Anois +settings.pull_mirror_sync_in_progress = Athruithe a tharraingt ón iargúlta %s i láthair na huaire. +settings.push_mirror_sync_in_progress = Athruithe a bhrú ar an iargúlta %s i láthair na huaire. +settings.site = Láithreán Gréasáin +settings.update_mirror_settings = Nuashonraigh Socruithe Scátháin +settings.branches.switch_default_branch = Athraigh Brainse Réamhshocraithe +settings.branches.update_default_branch = An Brainse Réamhshocraithe a nuashonrú +settings.branches.add_new_rule = Cuir Riail Nua leis +settings.advanced_settings = Ardsocruithe +settings.wiki_desc = Cumasaigh Stór Vicí +settings.use_internal_wiki = Úsáid Vicí Insuite +settings.use_external_wiki = Úsáid Vicí Seachtrach +settings.external_wiki_url = URL Vicí Seachtrach +settings.external_wiki_url_error = Ní URL bailí é URL seachtrach vicí. +settings.external_wiki_url_desc = Atreoraítear cuairteoirí chuig an URL wiki seachtrach agus iad ag cliceáil ar an gcluaisín wiki. +settings.issues_desc = Cumasaigh Rianóir Saincheist Stórais +settings.use_internal_issue_tracker = Úsáid Rianóir Saincheist Ionsuite +settings.use_external_issue_tracker = Úsáid Rianaire Eisiúint Sheachtrach +settings.external_tracker_url = URL Rianaithe Saincheisteanna Seachtrach +settings.external_tracker_url_error = Ní URL bailí é an URL rianaitheora saincheisteanna seachtrach. +settings.external_tracker_url_desc = Déantar cuairteoirí a atreorú chuig an URL rianaithe eisiúintí seachtracha nuair a chliceálann siad ar an táb saincheisteanna. +settings.tracker_url_format = Formáid URL Rianaithe Saincheist Seachtrach +settings.tracker_url_format_error = Ní URL bailí é an fhormáid URL rianaitheora saincheisteanna seachtrach. +settings.tracker_issue_style = Formáid Uimhir Rianaithe Saincheisteanna +settings.tracker_issue_style.numeric = Uimhriúil +settings.tracker_issue_style.alphanumeric = Alfauméireacha +settings.tracker_issue_style.regexp = Léiriú Rialta +settings.tracker_issue_style.regexp_pattern = Patrún Léirithe Rialta +settings.tracker_issue_style.regexp_pattern_desc = Úsáidfear an chéad ghrúpa a gabhadh in ionad {index}. +settings.tracker_url_format_desc = Úsáid na sealbhóirí áite {user}, {repo} agus {index} le haghaidh an ainm úsáideora, an t-ainm stórtha agus an t-innéacs eisiúna. +settings.enable_timetracker = Cumasaigh Rianú Ama +settings.allow_only_contributors_to_track_time = Lig do Rannpháirtithe Amach Am a Rianú +settings.pulls_desc = Cumasaigh Iarratais Tarraingthe Stóras +settings.pulls.ignore_whitespace = Déan neamhaird de spás bán le haghaidh coinbhleachtaí +settings.pulls.enable_autodetect_manual_merge = Cumasaigh cumasc láimhe autodetector (Nóta: I roinnt cásanna speisialta, is féidir míbhreithiúnais tarlú) +settings.pulls.allow_rebase_update = Cumasaigh brainse iarratais tarraingthe a nuashonrú trí athbhunú +settings.pulls.default_delete_branch_after_merge = Scrios brainse an iarratais tarraingthe tar éis cumasc de réir réamhshocraithe +settings.pulls.default_allow_edits_from_maintainers = Ceadaigh eagarthóirí ó chothabhálaí de réir réamhshocraithe +settings.releases_desc = Cumasaigh Eisiúintí Stórais +settings.admin_settings = Socruithe Riarthóra +settings.admin_enable_health_check = Cumasaigh Seiceálacha Sláinte Stórais (git fsck) +settings.admin_code_indexer = Innéacsaitheoir Cód +settings.admin_stats_indexer = Innéacsóir Staitisticí Cód +settings.admin_indexer_unindexed = Neamh-innéacsaithe +settings.reindex_button = Cuir le Scuaine Reindex +settings.reindex_requested = Athinnéacsú Iarrtha +settings.admin_enable_close_issues_via_commit_in_any_branch = Saincheist a dhúnadh trí ghealltanas a rinneadh i mbrainse neamh-mhainneachtana +settings.danger_zone = Crios Contúirte +settings.new_owner_has_same_repo = Tá stóras leis an ainm céanna ag an úinéir nua cheana féin. Roghnaigh ainm eile le do thoil. +settings.convert = Tiontaigh go Stóras Rialta +settings.convert_desc = Is féidir leat an scáthán seo a thiontú ina stór rialta. Ní féidir é seo a chur ar ais. +settings.convert_notices_1 = Déanfaidh an oibríocht seo an scáthán a thiontú ina stóras rialta agus ní féidir é a chur ar ais. +settings.convert_confirm = Tiontaigh Stóras +settings.convert_succeed = Tá an scáthán tiontaithe ina stóras rialta. +settings.convert_fork = Tiontaigh go Stóras Rialta +settings.convert_fork_desc = Is féidir leat an forc seo a thiontú ina stóras rialta. Ní féidir é seo a chur ar ais. +settings.convert_fork_notices_1 = Déanfaidh an oibríocht seo an forc a thiontú ina stóras rialta agus ní féidir é a chur ar ais. +settings.convert_fork_confirm = Tiontaigh Stóras +settings.convert_fork_succeed = Tá an forc tiontaithe ina stóras rialta. +settings.transfer.rejected = Diúltaíodh d'aistriú stóras. +settings.transfer.success = D'éirigh le haistriú stóras. +settings.transfer_abort = Cealaigh aistriú +settings.transfer_abort_invalid = Ní féidir leat aistriú stóras nach bhfuil ann a chealú. +settings.transfer_abort_success = Cuireadh an t-aistriú stóras chuig %s ar ceal go rathúil. +settings.transfer_desc = Aistrigh an stóras seo chuig úsáideoir nó chuig eagraíocht a bhfuil cearta riarthóra agat ina leith. +settings.transfer_in_progress = Tá aistriú leanúnach ann faoi láthair. Cealaigh é más mian leat an stóras seo a aistriú chuig úsáideoir eile. +settings.transfer_notices_1 = - Caillfidh tú rochtain ar an stóras má aistríonn tú é chuig úsáideoir aonair. +settings.transfer_notices_2 = - Coimeádfaidh tú rochtain ar an stóras má aistríonn tú é chuig eagraíocht a bhfuil (comh)úinéir agat. +settings.transfer_notices_3 = - Má tá an stóras príobháideach agus má aistrítear é chuig úsáideoir aonair, cinnteoidh an gníomh seo go bhfuil ar a laghad cead léite ag an úsáideoir (agus athraíonn sé ceadanna más gá). +settings.transfer_owner = Úinéir nua +settings.transfer_perform = Déan Aistriú +settings.transfer_started = `Tá an stóras seo marcáilte le haistriú agus tá sé ag fanacht le deimhniú ó "%s"` +settings.transfer_succeed = Tá an stóras aistrithe. +settings.signing_settings = Socruithe Fíoraithe Sínithe +settings.trust_model = Samhail Iontaobhas Sínithe +settings.trust_model.default = Múnla Iontaobhais Réamhshocraithe +settings.trust_model.default.desc = Úsáid an tsamhail iontaobhais stórais réamhshocraithe don suiteáil +settings.trust_model.collaborator = Comhoibritheoir +settings.trust_model.collaborator.long = Comhoibritheoir: Sínithe muinín ag comhoibrithe +settings.trust_model.collaborator.desc = Déanfar sínithe bailí ó chomhoibritheoirí an stóras seo a mharcáil mar 'iontaofa' – (cibé acu a mheaitseálann siad an tiomnóir nó nach bhfuil). Seachas sin, marcálfar sínithe bailí mar 'neamhiontaofa' má mheaitseálann an síniú an tiomnóir agus mar 'neamh-mheaitseáilte' mura bhfuil. +settings.trust_model.committer = Coimisitheoir +settings.trust_model.collaboratorcommitter = Comhoibritheo+Coimiteoir +settings.trust_model.collaboratorcommitter.long = Comhoibrí+Coiste: sínithe muiníne ó chomhoibrithe a mheaitseálann an tiomnóir +settings.wiki_delete = Scrios Sonraí Vicí +settings.wiki_delete_desc = Tá sonraí wiki stóras a scriosadh buan agus ní féidir iad a chur ar ais. +settings.wiki_delete_notices_1 = - Scriosfaidh agus díchumasóidh sé seo an stóras vicí do %s go buan. +settings.confirm_wiki_delete = Scrios Sonraí Vicí +settings.wiki_deletion_success = Scriosadh sonraí vicí an stórais. +settings.delete = Scrios an Stóras seo +settings.delete_desc = Tá scriosadh stóras buan agus ní féidir é a chealú. +settings.delete_notices_1 = - Nà FÉIDIR an oibríocht seo a chealú. +settings.delete_notices_2 = - Scriosfaidh an oibríocht seo stór %s go buan lena n-áirítear cód, ceisteanna, nótaí tráchta, sonraí vicí agus socruithe comhoibrithe. +settings.delete_notices_fork_1 = - Beidh forcanna den stóras seo neamhspleách tar éis iad a scriosadh. +settings.deletion_success = Tá an stóras scriosta. +settings.update_settings_success = Nuashonraíodh na socruithe stóras. +settings.update_settings_no_unit = Ba cheart go gceadódh an stóras idirghníomhú de chineál éigin ar a laghad. +settings.confirm_delete = Scrios Stóras +settings.add_collaborator = Cuir Comhoibritheoir leis +settings.add_collaborator_success = Cuireadh an comhoibritheoir leis. +settings.add_collaborator_inactive_user = Ní féidir úsáideoir neamhghníomhach a chur mar chomhoibritheoir. +settings.add_collaborator_owner = Ní féidir úinéir a chur leis mar chomhoibritheoir. +settings.add_collaborator_duplicate = Tá an comhoibrí curtha leis an stóras seo cheana féin. +settings.delete_collaborator = Bain +settings.collaborator_deletion = Bain Comhoibritheoir +settings.collaborator_deletion_desc = Má dhéantar comhoibrí a bhaint, déanfar a rochtain ar an stóras seo a chúlghairm. Lean ort? +settings.remove_collaborator_success = Tá an comhoibritheoir bainte. +settings.org_not_allowed_to_be_collaborator = Ní féidir eagraíochtaí a chur leis mar chomhoibritheoir. +settings.change_team_access_not_allowed = Tá rochtain foirne a athrú don stóras teoranta d'úinéir eagraíochta +settings.team_not_in_organization = Níl an fhoireann san eagraíocht chéanna leis an stóras +settings.teams = Foirne +settings.add_team = Cuir Foireann leis +settings.add_team_duplicate = Tá an stóras ag an bhfoireann cheana féin +settings.add_team_success = Tá rochtain ag an bhfoireann anois ar an stóras. +settings.change_team_permission_tip = Tá cead na foirne socraithe ar leathanach socraithe foirne agus ní féidir é a athrú in aghaidh an stóras +settings.delete_team_tip = Tá rochtain ag an bhfoireann seo ar gach stórais agus ní féidir í a bhaint +settings.remove_team_success = Tá rochtain na foirne ar an stóras bainte amach. +settings.add_webhook = Cuir Crúca Gréasán leis +settings.add_webhook.invalid_channel_name = Ní féidir ainm cainéal Crúca Gréasán a bheith folamh agus ní féidir ach carachtar # a bheith ann. +settings.webhook_deletion = Bain Crúca Gréasán +settings.webhook_deletion_desc = Scriostar a shocruithe agus a stair seachadta a bhaineann le Crúca Gréasán a bhaint. Lean ar aghaidh? +settings.webhook_deletion_success = Tá an Crúca Gréasán bainte amach. +settings.webhook.test_delivery = Seachadadh Tástála +settings.webhook.test_delivery_desc = Déan tástáil ar an Crúca Gréasán seo le himeacht bhréige. +settings.webhook.test_delivery_desc_disabled = Chun an Crúca Gréasán seo a thástáil le himeacht bhréige, gníomhachtaigh é. +settings.webhook.request = Iarratas +settings.webhook.response = Freagra +settings.webhook.headers = Ceanntásca +settings.webhook.payload = Ãbhar +settings.webhook.body = Comhlacht +settings.webhook.replay.description = Seinn an Crúca Gréasán seo arís. +settings.webhook.replay.description_disabled = Chun an Crúca Gréasán seo a athsheinm, gníomhachtaigh é. +settings.webhook.delivery.success = Cuireadh imeacht leis an scuaine seachadta. D'fhéadfadh sé cúpla soicind a thógáil sula dtaispeántar sé sa stair seachadta. +settings.githook_edit_desc = Mura bhfuil an hook neamhghníomhach, cuirfear ábhar samplach i láthair. Má fhágann tú ábhar go luach folamh díchumasófar an crúca seo. +settings.githook_name = Ainm Crúca +settings.githook_content = Ãbhar Crúca +settings.update_githook = Nuashonraigh Crúca +settings.payload_url = URL spriocdhírithe +settings.http_method = Modh HTTP +settings.content_type = Cineál Ãbhar POST +settings.secret = Rúnda +settings.slack_username = Ainm úsáideora +settings.slack_icon_url = URL deilbhín +settings.slack_color = Dath +settings.discord_username = Ainm úsáideora +settings.discord_icon_url = URL deilbhín +settings.event_desc = Truicear Ar: +settings.event_push_only = Imeachtaí Brúigh +settings.event_send_everything = Gach Imeacht +settings.event_choose = Imeachtaí Saincheaptha… +settings.event_header_repository = Imeachtaí Stóras +settings.event_create = Cruthaigh +settings.event_create_desc = Cruthaíodh brainse nó clib. +settings.event_delete = Scrios +settings.event_delete_desc = Brainse nó clib scriosta. +settings.event_fork = Forc +settings.event_fork_desc = Forcadh stóras. +settings.event_wiki = Vicí +settings.event_wiki_desc = Leathanach Vicí cruthaithe, athainmnithe, curtha in eagar nó scriosta. +settings.event_release = Scaoileadh +settings.event_release_desc = Scaoileadh foilsithe, nuashonraithe nó scriosta i stóras. +settings.event_push = Brúigh +settings.event_push_desc = Brúigh Git chuig stóras. +settings.event_repository = Stóras +settings.event_repository_desc = Stóras a cruthaíodh nó a scriosadh. +settings.event_header_issue = Imeachtaí Eisiúint +settings.event_issues_desc = Osclaíodh, dúnadh, athosclaíodh nó cuireadh an cheist in eagar. +settings.event_issue_assign_desc = Eisiúint sannta nó neamhshannta. +settings.event_issue_comment_desc = Trácht eisiúna cruthaithe, curtha in eagar nó a scriosadh. +settings.event_header_pull_request = Tarraingt Imeachtaí Iarratas +settings.event_pull_request_desc = Iarratas tarraingthe oscailte, dúnta, athoscailte nó curtha in eagar. +settings.event_pull_request_assign_desc = Iarratas tarraingthe sannta nó neamhshannta. +settings.event_pull_request_comment_desc = Trácht ar iarratas tarraingthe cruthaithe, curtha in eagar, nó scriosta. +settings.event_pull_request_review_request_desc = Tarraing athbhreithniú iarratais iarrtha nó baineadh iarratas athbhreithnithe. +settings.event_pull_request_approvals = Ceaduithe Iarratais Tarraing +settings.event_pull_request_merge = Cumaisc Iarratas Tarraing +settings.event_package = Pacáiste +settings.event_package_desc = Pacáiste a cruthaíodh nó a scriosadh i stóras. +settings.branch_filter = Scagaire brainse +settings.branch_filter_desc = Liosta bán brainse le haghaidh brú, cruthú brainse agus imeachtaí scriosta brainse, sonraithe mar phatrún glob. Má tá sé folamh nó *, tuairiscítear imeachtaí do gach brainse. Féach %[2]s doiciméadú le haghaidh comhréire. Samplaí: máistir, {master,release*}. +settings.authorization_header = Ceanntásc Údaraithe +settings.authorization_header_desc = Cuirfear san áireamh mar cheanntásc údaraithe d'iarratais nuair a bheidh ann Samplaí: %s. +settings.active = Gníomhach +settings.active_helper = Seolfar faisnéis faoi imeachtaí spreagtha chuig an URL Crúca Gréasán seo. +settings.add_hook_success = Cuireadh an Crúca Gréasán leis. +settings.update_webhook = Nuashonraigh Crúca Gréasán +settings.update_hook_success = Nuashonraíodh an Crúca Gréasán. +settings.delete_webhook = Bain Crúca Gréasán +settings.recent_deliveries = Seachadtaí le déana +settings.hook_type = Cineál Crúca +settings.slack_token = Comhartha +settings.slack_domain = Fearann +settings.slack_channel = Cainéal +settings.add_web_hook_desc = Comhtháthaigh %s isteach i do stóras. +settings.web_hook_name_gitea = Gitea +settings.web_hook_name_gogs = Gogs +settings.web_hook_name_slack = Slack +settings.web_hook_name_discord = Discord +settings.web_hook_name_dingtalk = DingTalk +settings.web_hook_name_telegram = Teileagram +settings.web_hook_name_matrix = Maitrís +settings.web_hook_name_msteams = Microsoft Teams +settings.web_hook_name_wechatwork = WeCom (Wechat Work) +settings.web_hook_name_packagist = Packagist +settings.packagist_username = Ainm úsáideora Pacagist +settings.packagist_api_token = Comhartha API +settings.packagist_package_url = URL pacáiste Packagist +settings.deploy_keys = Eochracha a imscaradh +settings.add_deploy_key = Cuir Eochair Imscartha leis +settings.deploy_key_desc = Tá rochtain tarraingthe léite amháin ag eochracha imscartha ar an stóras. +settings.is_writable = Cumasaigh Rochtain Scríobh +settings.is_writable_info = Lig don eochair imlonnaithe seo a bhrú chuig an stóras. +settings.no_deploy_keys = Níl aon eochracha imscartha ann fós. +settings.title = Teideal +settings.deploy_key_content = Ãbhar +settings.key_been_used = Tá eochair imscartha le hábhar comhionann in úsáid cheana féin. +settings.key_name_used = Tá eochair imscartha leis an ainm céanna ann cheana féin. +settings.add_key_success = Tá an eochair imlonnaithe "%s" curtha leis. +settings.deploy_key_deletion = Bain Eochair Imlonnaithe +settings.deploy_key_deletion_desc = Ag baint eochair imscartha, cuirfear a rochtain ar an stóras seo a chúlghairm. Lean ar aghaidh? +settings.deploy_key_deletion_success = Tá an eochair imscartha bainte amach. +settings.branches = Brainsí +settings.protected_branch = Cosaint Brainse +settings.protected_branch.save_rule = Sábháil Riail +settings.protected_branch.delete_rule = Scrios Riail +settings.protect_disable_push = Díchumasaigh Brúigh +settings.protect_disable_push_desc = Ní cheadfar aon bhrú chuig an mbrainse seo. +settings.protect_enable_push = Cumasaigh Brúigh +settings.protect_enable_push_desc = Beidh cead ag aon duine a bhfuil rochtain scríofa aige/aici brú chuig an mbrainse seo (ach gan brú a bhrú). +settings.protect_enable_merge = Cumasaigh Cumaisc +settings.protect_enable_merge_desc = Beidh cead ag aon duine a bhfuil rochtain scríofa aige na hiarratais tarraingte a chumasc leis an mbrainse seo. +settings.protect_check_status_contexts = Cumasaigh Seiceáil Stádas +settings.protect_status_check_patterns_desc = Iontráil patrúin chun a shonrú cé na seiceálacha stádais a chaithfidh pas a fháil sular féidir brainsí a chumasc le brainse a chomhoibríonn leis an riail seo. Sonraíonn gach líne patrún. Ní féidir patrúin a bheith folamh. +settings.protect_check_status_contexts_desc = A cheangal ar sheiceálacha stádais pas a fháil roimh chumasc. Nuair a bheidh sé cumasaithe, ní mór gealltanais a bhrú ar dtús chuig brainse eile, ansin iad a chumasc nó a bhrú go díreach chuig brainse a thagann leis an riail seo tar éis do sheiceálacha stádais a bheith caite. Mura ndéantar comhthéacs ar bith a mheaitseáil, ní mór go n-éireodh leis an ngealltanas deiridh beag beann ar an gcomhthéacs. +settings.protect_check_status_contexts_list = Seiceálacha stádais a fuarthas sa tseachtain seo caite don stóras seo +settings.protect_status_check_matched = Comhoiriúnach +settings.protect_invalid_status_check_pattern = Patrún seiceála stádais neamhbhailí: "%s". +settings.protect_no_valid_status_check_patterns = Gan aon phatrúin seiceála stádais bailí. +settings.dismiss_stale_approvals = Déan seancheaduithe a dhíbhe +settings.dismiss_stale_approvals_desc = Nuair a bhrúitear gealltanais nua a athraíonn ábhar an iarratais tarraingthe chuig an mbrainse, déanfar sean-cheaduithe a dhíchur. +settings.ignore_stale_approvals = Déan neamhaird de sheancheaduithe +settings.ignore_stale_approvals_desc = Ná cuir faomhadh a rinneadh ar ghealltanais níos sine (athbhreithnithe seanchaite) san áireamh i dtreo cé mhéad faomhadh atá ag an PR. Ní bhaineann le hábhar má dhéantar athbhreithnithe seanchaite a dhíbhe cheana féin. +settings.require_signed_commits = Ceangaltais Sínithe a cheangal +settings.require_signed_commits_desc = Diúltaigh brú chuig an mbrainse seo má tá siad neamhshínithe nó neamh-fhíoraithe. +settings.protect_branch_name_pattern = Patrún Ainm Brainse Cosanta +settings.protect_patterns = Patrúin +settings.update_protect_branch_success = Tá cosaint brainse don riail "%s" nuashonraithe. +settings.remove_protected_branch_success = Baineadh cosaint brainse don riail "%s". +settings.remove_protected_branch_failed = Theip ar riail cosanta brainse "%s" a bhaint. +settings.protected_branch_deletion = Scrios Cosaint Brainse +settings.protected_branch_deletion_desc = Ligeann cosaint brainse a dhíchumasú d'úsáideoirí a bhfuil cead scríofa acu brú chuig an mbrainse. Lean ar aghaidh? +settings.block_rejected_reviews = Cuir bac ar chumasc ar léirmheasanna diúltaithe +settings.block_rejected_reviews_desc = Ní bheidh cumasc indéanta nuair a iarrann athbhreithnithe oifigiúla athruithe, fiú má tá go leor ceadaithe ann. +settings.block_on_official_review_requests = Cuir bac ar chumasc ar iarratais ar athbhreithniú oifigiúil +settings.block_on_official_review_requests_desc = Ní bheidh sé indéanta cumasc nuair a bhíonn iarratais oifigiúla ar athbhreithniú aige, fiú má tá go leor ceadaithe ann. +settings.block_outdated_branch = Cuir bac ar chumasc má tá an t-iarratas tarraingthe as dáta +settings.block_outdated_branch_desc = Ní bheidh cumasc indéanta nuair a bhíonn ceannbhrainse taobh thiar de bhronnbhrainse. +settings.default_branch_desc = Roghnaigh brainse stóras réamhshocraithe le haghaidh iarratas tarraingte agus geallann an cód: +settings.merge_style_desc = Stíleanna Cumaisc +settings.default_merge_style_desc = Stíl Cumaisc Réamhshocraithe +settings.choose_branch = Roghnaigh brainse… +settings.no_protected_branch = Níl aon bhrainsí cosanta ann. +settings.edit_protected_branch = Cuir in eagar +settings.protected_branch_required_rule_name = Ainm riail riachtanach +settings.protected_branch_required_approvals_min = Ní féidir ceaduithe riachtanacha a bheith diúltach. +settings.tags = Clibeanna +settings.tags.protection = Cosaint Clib +settings.tags.protection.pattern = Patrún Clib +settings.tags.protection.allowed = Ceadaithe +settings.tags.protection.allowed.users = Úsáideoirí ceadaithe +settings.tags.protection.allowed.teams = Foirne ceadaithe +settings.tags.protection.allowed.noone = Níl aon duine +settings.tags.protection.none = Níl aon chlibeanna cosanta ann. +settings.tags.protection.pattern.description = Is féidir leat ainm amháin nó patrún glob nó slonn rialta a úsáid chun clibeanna iolracha a mheaitseáil. Léigh tuilleadh sa treoir na gclibeanna cosanta. +settings.bot_token = Comhartha Bota +settings.chat_id = ID Comhrá +settings.thread_id = ID Snáithe +settings.matrix.homeserver_url = URL sheirbhíse baile +settings.matrix.room_id = ID seomra +settings.matrix.message_type = Cineál teachtaireachta +settings.archive.button = Cartlann Stóras +settings.archive.header = Cartlann an Stóras seo +settings.archive.text = Má dhéantar an stóras a chartlannú, beidh sé léite go hiomlán amháin. Beidh sé i bhfolach ón bpainéal. Aon duine (ní fiú tú!) beidh siad in ann tiomantas nua a dhéanamh, nó aon saincheisteanna nó iarratais a tharraingt a oscailt. +settings.archive.success = Rinneadh an stóras a chartlannú go rathúil. +settings.archive.error = Tharla earráid agus tú ag iarraidh an stóras a chartlannú. Féach an logáil le haghaidh tuilleadh sonraí. +settings.archive.error_ismirror = Ní féidir leat stóras scátháin a chartlannú. +settings.unarchive.button = Stóras gan cartlann +settings.unarchive.header = Díchartlannaigh an stóras seo +settings.unarchive.success = Rinneadh an stóras a dhíchartlann go rathúil. +settings.unarchive.error = Tharla earráid agus tú ag iarraidh an stóras a dhíchartlannú. Féach an logáil le haghaidh tuilleadh sonraí. +settings.update_avatar_success = Nuashonraíodh avatar an stóras. +settings.lfs = LFS +settings.lfs_filelist = Comhaid LFS a stóráiltear sa stóras seo +settings.lfs_no_lfs_files = Níl aon chomhaid LFS stóráilte sa stóras seo +settings.lfs_findcommits = Aimsigh gealltanais +settings.lfs_lfs_file_no_commits = Níor aimsíodh aon ghealltanais don chomhad LFS seo +settings.lfs_noattribute = Níl an tréith inghlasáilte sa bhrainse réamhshocraithe ag an gcosán seo +settings.lfs_delete = Scrios comhad LFS le OID %s +settings.lfs_findpointerfiles = Faigh comhaid pointeora +settings.lfs_locks = Glais +settings.lfs_invalid_locking_path = Cosan neamhbhailí: %s +settings.lfs_invalid_lock_directory = Ní féidir eolaire a ghlasáil: %s +settings.lfs_lock_already_exists = Tá an glas ann cheana féin: %s +settings.lfs_lock = Glas +settings.lfs_lock_path = Cosán comhad le haghaidh glasáil... +settings.lfs_locks_no_locks = Gan Glais +settings.lfs_lock_file_no_exist = Níl an comhad faoi ghlas sa bhrainse réamhshocraithe +settings.lfs_force_unlock = Díghlasáil Fórsa +settings.lfs_pointers.found = Aimsíodh %d pointeoir(í) blob - %d bainteach, %d neamhghaolmhar (%d in easnamh ón siopa) +settings.lfs_pointers.oid = OID +settings.lfs_pointers.inRepo = I Stóras +settings.lfs_pointers.exists = Ann sa siopa +settings.lfs_pointers.accessible = Inrochtana don Úsáideoir +settings.lfs_pointers.associateAccessible = Comhlach %d OID inrochtana +settings.rename_branch_failed_exist = Ní féidir brainse a athainmniú toisc go bhfuil spriocbhrainse %s ann. +settings.rename_branch_failed_not_exist = Ní féidir brainse %s a athainmniú toisc nach bhfuil sé ann. +settings.rename_branch_success = Ainmníodh brainse %s go rathúil go %s. +settings.rename_branch = Athainmnigh brainse +diff.browse_source = Brabhsáil Foinse +diff.parent = tuismitheoir +diff.commit = tiomantas +diff.git-notes = Nótaí +diff.options_button = Roghanna Diff +diff.download_patch = Ãoslódáil an comhad paiste +diff.download_diff = Ãoslódáil Comhad Diff +diff.show_split_view = Amharc Scoilt +diff.show_unified_view = Amharc Aontaithe +diff.whitespace_button = Spás bán +diff.whitespace_show_everything = Taispeáin gach athrú +diff.whitespace_ignore_all_whitespace = Déan neamhaird de spás bán nuair a dhéantar comparáid idir línte +diff.whitespace_ignore_amount_changes = Déan neamhaird de athruithe ar an méid spás bán +diff.whitespace_ignore_at_eol = Déan neamhaird ar athruithe ar spás bán ag EOL +diff.stats_desc = D'athraigh %d comhad le %d breiseanna agus %d scriosta +diff.stats_desc_file = %d athruithe: %d breiseanna agus scriosadh %d +diff.bin = BRUSCAIR +diff.bin_not_shown = Ní thaispeántar comhad dénártha. +diff.view_file = Féach ar an gComhad +diff.file_before = Roimhe +diff.file_after = Tar éis +diff.file_image_width = Leithead +diff.file_image_height = Airde +diff.file_byte_size = Méid +diff.file_suppressed = Tá difríocht comhad cosc orthu toisc go bhfuil sé ró-mhór +diff.file_suppressed_line_too_long = Cuirtear difríocht comhad faoi chois toisc go bhfuil líne amháin nó níos mó rófhada +diff.too_many_files = Níor taispeánadh roinnt comhad mar go bhfuil an iomarca comhad athraithe sa difríocht seo +diff.show_more = Taispeáin Tuilleadh +diff.load = Difríocht Luchtaigh +diff.generated = a ghintear +diff.vendored = curtha ar fáil +diff.comment.add_line_comment = Cuir trácht líne leis +diff.comment.placeholder = Fág trácht +diff.comment.add_single_comment = Cuir trácht aonair leis +diff.comment.add_review_comment = Cuir trácht leis +diff.comment.start_review = Tosaigh athbhreithniú +diff.comment.reply = Freagra +diff.review.header = Cuir isteach léirmheas +diff.review.placeholder = Trácht athbhreithnithe +diff.review.comment = Trácht +diff.review.approve = Ceadú +diff.review.self_reject = Ní féidir le húdair iarratais tarraing athruithe a iarraidh ar a n-iarratas tarraingthe +diff.review.reject = Iarr athruithe +diff.review.self_approve = Ní féidir le húdair iarratais tarraing a n-iarratas tarraingthe féin a chead +diff.committed_by = tiomanta ag +diff.protected = Cosanta +diff.image.side_by_side = Taobh le Taobh +diff.image.swipe = Scaoil +diff.image.overlay = Forleagan +diff.has_escaped = Tá carachtair Unicode i bhfolach ag an líne seo +diff.show_file_tree = Taispeáin crann comhad +diff.hide_file_tree = Folaigh crann comhad +releases.desc = Rian leaganacha tionscadal agus íoslódálacha. +release.releases = Eisiúintí +release.detail = Sonraí eisithe +release.tags = Clibeanna +release.new_release = Scaoileadh Nua +release.draft = Dréacht +release.prerelease = Réamh-eisiúint +release.stable = Cobhsaí +release.compare = Déan comparáid +release.edit = cuir in eagar +release.ahead.commits = Geallann %d +release.ahead.target = go %s ón scaoileadh seo +tag.ahead.target = chuig %s ón gclib seo +release.source_code = Cód Foinse +release.new_subheader = Eagraíonn eiseachtaí leaganacha tionscadail +release.edit_subheader = Eagraíonn eisiúintí leaganacha tionscadal. +release.tag_name = Ainm chlib +release.target = Sprioc +release.tag_helper = Roghnaigh clib atá ann cheana nó cruthaigh clib nua. +release.tag_helper_new = Clib nua. Cruthófar an chlib seo ón sprioc. +release.tag_helper_existing = Clib atá ann cheana. +release.title = Teideal scaoileadh +release.title_empty = Ní féidir leis an teideal a bheith folamh. +release.message = Déan cur síos ar an eisiúint seo +release.prerelease_desc = Marcáil mar Réamh-eisiúint +release.prerelease_helper = Marcáil an scaoileadh seo mí-oiriúnach le húsáid táirgeachta. +release.cancel = Cealaigh +release.publish = Foilsigh Eisiúint +release.save_draft = Sábháil Dréacht +release.edit_release = Eisiúint Nuashonraithe +release.delete_release = Scrios Scaoilte +release.delete_tag = Scrios Clib +release.deletion = Scrios Scaoilte +release.deletion_success = Tá an scaoileadh scriosta. +release.deletion_tag_desc = Scriosfar an chlib seo ón stóras. Ní athraítear inneachar agus stair na stórtha. Lean ort? +release.deletion_tag_success = Tá an chlib scriosta. +release.tag_name_already_exist = Tá eisiúint leis an ainm clib seo ann cheana féin. +release.tag_name_invalid = Níl ainm an chlib bailí. +release.tag_name_protected = Tá ainm an chlib cosanta. +release.tag_already_exist = Tá an t-ainm clib seo ann cheana féin. +release.downloads = Ãoslódálacha +release.add_tag_msg = Úsáid teideal agus ábhar an eisiúna mar theachtaireacht chlibe. +release.releases_for = Eisiúintí do %s +release.tags_for = Clibeanna do %s +branch.name = Ainm Brainse +branch.already_exists = Tá brainse leis an ainm "%s" ann cheana féin. +branch.delete_head = Scrios +branch.delete = `Scrios Brainse "%s"` +branch.delete_html = Scrios Brainse +branch.delete_desc = Tá brainse a scriosadh buan. Cé go bhféadfadh an brainse scriosta leanúint ar aghaidh ag bheith ann ar feadh tréimhse ghearr sula mbaintear í i ndáiríre, Nà FÉIDIR é a dhíchur i bhformhór Lean ar aghaidh? +branch.deletion_success = Tá brainse "%s" scriosta. +branch.deletion_failed = Theip ar scriosadh brainse "%s". +branch.delete_branch_has_new_commits = Ní féidir brainse “%s†a scriosadh toisc go bhfuil tiomáintí nua curtha leis tar éis a chumasc. +branch.create_branch = Cruthaigh brainse %s +branch.create_from = `ó "%s"` +branch.create_success = Tá brainse "%s" cruthaithe. +branch.branch_already_exists = Tá brainse "%s" sa stóras seo cheana. +branch.branch_name_conflict = Tagann an t-ainm brainse "%s" leis an mbrainse "%s" atá ann cheana féin. +branch.tag_collision = Ní féidir brainse "%s" a chruthú mar tá clib leis an ainm céanna sa stóras cheana féin. +branch.deleted_by = Scriosta ag %s +branch.restore_success = Tá brainse "%s" curtha ar ais. +branch.restore_failed = Theip ar chur ar ais brainse "%s". +branch.protected_deletion_failed = Tá brainse "%s" cosanta. Ní féidir é a scriosadh. +branch.default_deletion_failed = Is é brainse "%s" an brainse réamhshocraithe. Ní féidir é a scriosadh. +branch.restore = `Athchóirigh Brainse "%s"` +branch.download = `Brainse Ãosluchtaithe "%s"` +branch.rename = `Athainmnigh Brainse "%s"` +branch.included_desc = Tá an brainse seo mar chuid den bhrainse réamhshocraithe +branch.included = San áireamh +branch.create_new_branch = Cruthaigh brainse ón mbrainse: +branch.confirm_create_branch = Cruthaigh brainse +branch.warning_rename_default_branch = Tá tú ag athainmniú an bhrainse réamhshocraithe. +branch.rename_branch_to = Athainmnigh "%s" go: +branch.create_branch_operation = Cruthaigh brainse +branch.new_branch = Cruthaigh brainse nua +branch.new_branch_from = `Cruthaigh brainse nua ó "%s"` +branch.renamed = Ainmníodh brainse %s go %s. +tag.create_tag = Cruthaigh clib %s +tag.create_tag_operation = Cruthaigh clib +tag.confirm_create_tag = Cruthaigh clib +tag.create_tag_from = `Cruthaigh clib nua ó "%s"` +tag.create_success = Tá clib "%s" cruthaithe. +topic.manage_topics = Bainistigh topaicí +topic.done = Déanta +topic.count_prompt = Ní féidir leat níos mó ná 25 topaicí a roghnú +find_file.no_matching = Níl aon chomhad meaitseála le fáil +error.csv.too_large = Ní féidir an comhad seo a rinneadh toisc go bhfuil sé ró-mhór. +error.csv.unexpected = Ní féidir an comhad seo a rindreáil toisc go bhfuil carachtar ann gan súil leis i líne %d agus i gcolún %d. +error.csv.invalid_field_count = Ní féidir an comhad seo a rindreáil toisc go bhfuil líon mícheart réimsí i líne %d. +error.broken_git_hook = Is cosúil go bhfuil crúcaí git den stór seo briste. Lean an doiciméadúchán chun iad a cheartú, ansin brúigh roinnt gealltanas chun an stádas a athnuachan. + +[graphs] +component_loading = à lódáil %s... +component_loading_failed = Ní fhéadfaí %s a luchtú +component_loading_info = Seans go dtógfaidh sé seo beagán… +component_failed_to_load = Tharla earráid gan choinne. +code_frequency.what = minicíocht cód +contributors.what = ranníocaíochtaí +recent_commits.what = tiomantáin le déanaí + +[org] +org_name_holder = Ainm na hEagraíochta +org_full_name_holder = Ainm iomlán na hEagraíochta +org_name_helper = Ba cheart go mbeadh ainmneacha eagraíochta gearr agus i gcuimhne. +create_org = Cruthaigh Eagraíocht +members = Comhaltaí +teams = Foirne +code = Cód +lower_members = comhaltaí +lower_repositories = stórais +create_new_team = Foireann Nua +create_team = Cruthaigh Foireann +org_desc = Cur síos +team_name = Ainm Foirne +team_desc = Cur síos +team_name_helper = Ba chóir go mbeadh ainmneacha foirne gearr agus i gcuimhne. +team_desc_helper = Déan cur síos ar chuspóir nó ról na foirne. +team_access_desc = Rochtain stórais +team_permission_desc = Cead +team_unit_desc = Ceadaigh Rochtain ar Rannóga Stóras +team_unit_disabled = (Díchumasaithe) +form.name_reserved = Tá an t-ainm eagraíochta "%s" curtha in áirithe. +form.name_pattern_not_allowed = Ní cheadaítear an patrún "%s" in ainm eagraíochta. +form.create_org_not_allowed = Níl cead agat eagraíocht a chruthú. +settings = Socruithe +settings.options = Eagraíocht +settings.full_name = Ainm Iomlán +settings.email = Ríomhphost Teagmhála +settings.website = Láithreán Gréasáin +settings.location = Suíomh +settings.permission = Ceadanna +settings.repoadminchangeteam = Is féidir le riarthóir an stórais rochtain d'fhoirne a chur leis agus a bhaint +settings.visibility = Infheictheacht +settings.visibility.public = Poiblí +settings.visibility.limited_shortname = Teoranta +settings.visibility.private = Príobháideach (Infheicthe amháin do bhaill eagraíochta) +settings.visibility.private_shortname = Príobháideach +settings.update_settings = Nuashonrú Socruithe +settings.update_setting_success = Nuashonraíodh socruithe eagraíochta. +settings.change_orgname_prompt = Nóta: Athróidh ainm na heagraíochta ag athrú URL d'eagraíochta agus saorfar an sean-ainm. +settings.change_orgname_redirect_prompt = Déanfaidh an sean-ainm a atreorú go dtí go n-éilítear é. +settings.update_avatar_success = Nuashonraíodh avatar na heagraíochta. +settings.delete = Scrios Eagraíocht +settings.delete_account = Scrios an Eagraíocht seo +settings.delete_prompt = Bainfear an eagraíocht go buan. Nà FÉIDIR é seo a chealú! +settings.confirm_delete_account = Deimhnigh scriosadh +settings.delete_org_title = Scrios Eagraíocht +settings.delete_org_desc = Scriosfar an eagraíocht seo go buan. Lean ar aghaidh? +settings.hooks_desc = Cuir crúcaí gréasán in leis a spreagfar do gach stóras faoin eagraíocht seo. +settings.labels_desc = Cuir lipéid leis ar féidir iad a úsáid ar shaincheisteanna do gach stóras faoin eagraíocht seo. +members.membership_visibility = Infheictheacht Ballraíochta: +members.public = Infheicthe +members.public_helper = dhéanamh i bhfolach +members.private = I bhfolach +members.private_helper = a dhéanamh le feiceáil +members.member_role = Ról Comhalta: +members.owner = Úinéir +members.member = Comhalta +members.remove = Bain +members.remove.detail = Bain %[1]s de %[2]s? +members.leave = Fágáil +members.invite_desc = Cuir ball nua le %s: +members.invite_now = Tabhair cuireadh Anois +teams.join = Bígí +teams.leave = Fág +teams.can_create_org_repo = Cruthaigh stórais +teams.can_create_org_repo_helper = Is féidir le baill stóras nua a chruthú san eagraíocht. Gheobhaidh an cruthaitheoir rochtain riarthóra ar an stóras nua. +teams.none_access = Gan Rochtain +teams.general_access_helper = Déanfar ceadanna baill a chinneadh ag an tábla ceadanna thíos. +teams.read_access = Léigh +teams.write_access = Scríobh +teams.admin_access = Rochtain Riarthóra +teams.admin_access_helper = Is féidir le baill tarraingt agus brú chuig stórais foirne agus comhoibritheoirí a chur leo. +teams.no_desc = Níl aon tuairisc ag an bhfoireann seo +teams.settings = Socruithe +teams.owners_permission_desc = Tá rochtain iomlán ag úinéirí ar gach stórais agus tá rochtain ag an riarthóir ar an eagraíocht. +teams.members = Baill Foirne +teams.update_settings = Nuashonrú Socruithe +teams.delete_team = Scrios Foireann +teams.add_team_member = Cuir Comhalta Foirne leis +teams.invite_team_member = Tabhair cuireadh chuig %s +teams.invite_team_member.list = Cuirí ar Feitheamh +teams.delete_team_title = Scrios Foireann +teams.delete_team_desc = Cúlghairtear rochtain stórais óna baill a scriosadh foirne. Lean ar aghaidh? +teams.delete_team_success = Tá an fhoireann scriosta. +teams.read_permission_desc = Deonaíonn an fhoireann seo rochtain Léamh: is féidir le baill stórtha foirne a fheiceáil agus a chlónáil. +teams.write_permission_desc = Tugann an fhoireann seo rochtain do Scríobh: is féidir le baill léamh ó stórtha foirne agus iad a bhrú chucu. +teams.create_repo_permission_desc = Ina theannta sin, tugann an fhoireann seo cead Cruthaigh Stóras: is féidir le baill stórtha nua a chruthú san eagraíocht. +teams.repositories = Stórais Foirne +teams.remove_all_repos_title = Bain gach stórais foirne +teams.remove_all_repos_desc = Bainfidh sé seo gach stórais ón bhfoireann. +teams.add_all_repos_title = Cuir gach stórais leis +teams.add_all_repos_desc = Cuirfidh sé seo stórais uile na heagraíochta leis an bhfoireann. +teams.add_duplicate_users = Is ball foirne é an úsáideoir cheana féin. +teams.repos.none = Ní raibh rochtain ag an bhfoireann seo ar aon stóras. +teams.members.none = Níl aon bhaill ar an bhfoireann seo. +teams.specific_repositories = Stórais Sonrach +teams.specific_repositories_helper = Ní bheidh rochtain ag comhaltaí ach ar stórtha a cuireadh leis an bhfoireann go sainráite. Ní bhainfear na stórtha a cuireadh leis cheana le Gach stóras go huathoibríoch trí é seo a roghnú. +teams.all_repositories = Gach stórais +teams.all_repositories_helper = Tá rochtain ag an bhfoireann ar gach stórais. Má roghnaíonn sé seo, cuirfear na stórais go léir atá ann cheana leis an bhfoireann. +teams.invite.title = Tugadh cuireadh duit dul isteach i bhfoireann %s san eagraíocht %s. +teams.invite.by = Ar cuireadh ó %s +teams.invite.description = Cliceáil ar an gcnaipe thíos le do thoil chun dul isteach san fhoireann. + +[admin] +dashboard = Deais +self_check = Féin-sheiceáil +identity_access = Féiniúlacht & Rochtain +users = Cuntais Úsáideora +organizations = Eagraíochtaí +assets = Sócmhainní Cód +repositories = Stórais +hooks = Crúcaí Gréasán +integrations = Comhtháthaithe +authentication = Foinsí Fíordheimhnithe +emails = Ríomhphoist Úsáideoirí +config = Cumraíocht +notices = Fógraí Córais +config_summary = Achoimre +config_settings = Socruithe +monitor = Monatóireacht +first_page = Ar dtús +last_page = Deiridh +total = Iomlán: %d +settings = Socruithe Riaracháin +dashboard.statistic = Achoimre +dashboard.system_status = Stádas an Chórais +dashboard.operation_name = Ainm Oibríochta +dashboard.operation_switch = Athraigh +dashboard.operation_run = Rith +dashboard.clean_unbind_oauth = Glan naisc OAuth neamhcheangailte +dashboard.clean_unbind_oauth_success = Scriosadh gach nasc OAuth neamhcheangailte. +dashboard.task.started = Tasc Tosaigh: %[1]s +dashboard.task.process = Tasc: %[1]s +dashboard.task.cancelled = Tasc: %[1]s cealaithe: %[3]s +dashboard.task.error = Earráid sa Tasc: %[1]s: %[3]s +dashboard.task.finished = Tasc: Tá %[1]s tosaithe ag %[2]s críochnaithe +dashboard.task.unknown = Tasc anaithnid: %[1]s +dashboard.cron.started = Cron tosaithe: %[1]s +dashboard.cron.process = Cron: %[1]s +dashboard.cron.cancelled = Cron: %[1]s cealaithe: %[3]s +dashboard.cron.error = Earráid i gCron: %s: %[3]s +dashboard.cron.finished = Cron: %[1]s críochnaithe +dashboard.delete_inactive_accounts = Scrios gach cuntas neamhghníomhach +dashboard.delete_inactive_accounts.started = Tasc scriostha gach cuntas neamhghníomhachtaithe tosaithe. +dashboard.delete_repo_archives.started = Scrios gach tasc cartlann stórais a thosaigh. +dashboard.delete_missing_repos = Scrios gach stóras atá in easnamh ar a gcuid comhad Git +dashboard.delete_missing_repos.started = Scrios gach stóras atá in easnamh ar a dtasc comhaid Git a thosaigh. +dashboard.delete_generated_repository_avatars = Scrios abhatáranna stórtha ginte +dashboard.sync_repo_tags = Clibeanna sioncraigh ó shonraí git go bunachar sonraí +dashboard.update_mirrors = Scátháin a nuashonrú +dashboard.repo_health_check = Seiceáil sláinte gach stóras +dashboard.check_repo_stats = Seiceáil gach staitisticí stórais +dashboard.archive_cleanup = Scrios sean-chartlanna stórais +dashboard.deleted_branches_cleanup = Brainsí scriosta a ghlanadh +dashboard.update_migration_poster_id = Nuashonraigh ID póstaer imir +dashboard.git_gc_repos = Bailíonn truflais gach stórais +dashboard.reinit_missing_repos = Aththosaigh gach stórais Git atá in easnamh a bhfuil taifid ann dóibh +dashboard.sync_external_users = Sioncrónaigh sonraí úsáideoirí seachtracha +dashboard.cleanup_hook_task_table = Tábla hook_task glantacháin +dashboard.cleanup_packages = Pacáistí glanta in éag +dashboard.server_uptime = Aga fónaimh Freastalaí +dashboard.current_goroutine = Goroutines Reatha +dashboard.current_memory_usage = Úsáid Cuimhne Reatha +dashboard.total_memory_allocated = Cuimhne Iomlán Leithdháilte +dashboard.memory_obtained = Cuimhne Faighte +dashboard.pointer_lookup_times = Amanna Cuardaigh Pointeora +dashboard.memory_allocate_times = Leithdháiltí Cuimhne +dashboard.memory_free_times = Saorálann Cuimhne +dashboard.current_heap_usage = Úsáid Charn Reatha +dashboard.heap_memory_obtained = Cuimhne Charn Faighte +dashboard.heap_memory_idle = Díomhaoin Cuimhne Carn +dashboard.heap_memory_in_use = Cuimhne Carm In Úsáid +dashboard.heap_memory_released = Cuimhne Carn Eisithe +dashboard.heap_objects = Cuspóirí Carn +dashboard.bootstrap_stack_usage = Úsáid Staca Bootstrap +dashboard.stack_memory_obtained = Cuimhne Staca Faighte +dashboard.mspan_structures_usage = Úsáid Struchtúir MSpan +dashboard.mspan_structures_obtained = Struchtúir MSpan a Faightear +dashboard.mcache_structures_usage = Úsáid Struchtúir MCache +dashboard.mcache_structures_obtained = Struchtúir MCache a Faightear +dashboard.profiling_bucket_hash_table_obtained = Tábla Hash Buicéad Próifílithe a Faightear +dashboard.gc_metadata_obtained = Meiteashonraí GC faighte +dashboard.other_system_allocation_obtained = Leithdháileadh Córais Eile a Fuarthas +dashboard.next_gc_recycle = Athchúrsáil GC Eile +dashboard.total_gc_pause = Sos Iomlán GC +dashboard.last_gc_pause = Sos GC Deireanach +dashboard.gc_times = Amanna GC +dashboard.delete_old_actions = Scrios gach sean-ghníomhaíocht ón mbunachar +dashboard.delete_old_actions.started = Scrios na sean-ghníomhaíocht go léir ón mbunachar sonraí tosaithe. +dashboard.update_checker = Seiceoir nuashonraithe +dashboard.delete_old_system_notices = Scrios gach seanfhógra córais ón mbunachar sonraí +dashboard.gc_lfs = Bailigh truflais meta rudaí LFS +dashboard.rebuild_issue_indexer = Atógáil innéacsóir eisiúna +users.new_account = Cruthaigh cuntas Úsáideora +users.name = Ainm úsáideora +users.full_name = Ainm Iomlán +users.activated = Gníomhachtaithe +users.admin = Riarachán +users.restricted = Srianta +users.reserved = In áirithe +users.bot = Bota +users.remote = Iargúlta +users.2fa = 2FA +users.repos = Stórais +users.created = Cruthaithe +users.last_login = Sínigh Isteach Deiridh +users.new_success = Tá an cuntas úsáideora "%s" cruthaithe. +users.edit = Eagar +users.auth_source = Foinse Fíordheimhnithe +users.local = Ãitiúil +users.auth_login_name = Ainm Síniú Isteach Fíordheimhnithe +users.password_helper = Fág an pasfhocal folamh chun é a choinneáil gan athrú. +users.update_profile_success = Nuashonraíodh an cuntas úsáideora. +users.edit_account = Cuir Cuntas Úsáideora in Eagar +users.max_repo_creation = Uasmhéid Stóras +users.max_repo_creation_desc = (Cuir isteach -1 chun an teorainn réamhshocraithe domhanda a úsáid.) +users.update_profile = Nuashonraigh Cuntas Úsáideora +users.delete_account = Scrios Cuntas Úsáide +users.still_own_repo = Tá stórais amháin nó níos mó fós ag an úsáideoir seo. Scrios nó aistrigh na stórais seo ar dtús. +users.still_has_org = Is ball d'eagraíocht é an t-úsáideoir seo. Bain an t-úsáideoir ó aon eagraíochtaí ar dtús. +users.purge = Úsáideoir a Ghlanadh +users.still_own_packages = Tá pacáiste amháin nó níos mó fós ag an úsáideoir seo, scrios na pacáistí seo ar dtús. +users.deletion_success = Scriosadh an cuntas úsáideora. +users.reset_2fa = Athshocraigh 2FA +users.list_status_filter.menu_text = Scagaire +users.list_status_filter.reset = Athshocraigh +users.list_status_filter.is_active = Gníomhach +users.list_status_filter.not_active = Neamhghníomhach +users.list_status_filter.is_admin = Riarachán +users.list_status_filter.not_admin = Ní Riarachán +users.list_status_filter.is_restricted = Srianta +users.list_status_filter.not_restricted = Gan Srian +users.list_status_filter.is_prohibit_login = Cosc ar Logáil Isteach +users.list_status_filter.not_prohibit_login = Ceadaigh Logáil isteach +users.list_status_filter.is_2fa_enabled = 2FA Cumasaithe +users.list_status_filter.not_2fa_enabled = 2FA faoi mhíchumas +users.details = Sonraí Úsáideora +emails.primary = Bunscoile +emails.activated = Gníomhachtaithe +emails.filter_sort.email = Ríomhphost +emails.filter_sort.email_reverse = Ríomhphost (droim ar ais) +emails.updated = Nuashonraíodh an ríomhphost +emails.not_updated = Theip ar an seoladh ríomhphoist iarrtha a nuashonrú: %v +emails.duplicate_active = Tá an seoladh ríomhphoist seo gníomhach cheana féin d'úsáideoir difriúil. +emails.change_email_header = Nuashonraigh Airíonna Ríomhphoist +emails.change_email_text = An bhfuil tú cinnte gur mhaith leat an seoladh ríomhphoist seo a nuashonrú? +emails.delete = Scrios Ríomhphost +emails.delete_desc = An bhfuil tú cinnte gur mhaith leat an seoladh ríomhphoist seo a scriosadh? +emails.deletion_success = Tá an seoladh ríomhphoist scriosta. +emails.delete_primary_email_error = Ní féidir leat an ríomhphost príomhúil a scriosadh. +orgs.name = Ainm +orgs.teams = Foirne +orgs.members = Comhaltaí +orgs.new_orga = Eagraíocht Nua +repos.unadopted = Stórais Neamhghlactha +repos.owner = Úinéir +repos.name = Ainm +repos.private = Príobháideach +repos.issues = Saincheisteanna +repos.size = Méid +repos.lfs_size = Méid LFS +packages.total_size = Méid Iomlán: %s +packages.unreferenced_size = Méid gan tagairt: %s +packages.cleanup = Glan suas sonraí in éag +packages.cleanup.success = Glanadh suas sonraí in éag go rathúil +packages.owner = Úinéir +packages.creator = Cruthaitheoir +packages.name = Ainm +packages.version = Leagan +packages.type = Cineál +packages.repository = Stóráil +packages.size = Méid +packages.published = Foilsithe +defaulthooks = Réamhshocraithe Crúcaí Gréasán +defaulthooks.add_webhook = Cuir Crúca Gréasán Réamhshocraithe leis +defaulthooks.update_webhook = Nuashonraigh Réamhshocrú Crúca Gréasán +systemhooks = Córas Crúcaí Gréasán +systemhooks.add_webhook = Cuir Crúca Gréasán Córas leis +systemhooks.update_webhook = Nuashonraigh Córas Crúca Gréasán +auths.new = Cuir Foinse Fíordheimhni +auths.name = Ainm +auths.type = Cineál +auths.enabled = Cumasaithe +auths.syncenabled = Cumasaigh Sioncrónú Úsáideora +auths.updated = Nuashonraithe +auths.auth_type = Cineál Fíordheimhnithe +auths.auth_name = Ainm Fíordheimhnithe +auths.security_protocol = Prótacal Slándála +auths.domain = Fearann +auths.host = Óstach +auths.port = Calafort +auths.bind_dn = Ceangail DN +auths.bind_password = Ceangail Pasfhocal +auths.user_base = Bonn Cuardaigh Úsáideora +auths.user_dn = Úsáideoir DN +auths.attribute_username = Tréith Ainm Úsáideora +auths.attribute_name = Tréith Céad Ainm +auths.attribute_surname = Tréith Sloinne +auths.attribute_mail = Tréith ríomhphoist +auths.attribute_ssh_public_key = Tréith Eochair SSH Phoiblí +auths.attribute_avatar = Tréith Avatar +auths.attributes_in_bind = Faigh tréithe i gComhthéacs Bind DN +auths.allow_deactivate_all = Lig do thoradh cuardaigh folamh gach úsáideoir a dhíghníomhachtú +auths.use_paged_search = Úsáid Cuardach Leathanaigh +auths.search_page_size = Méid an Leathanaigh +auths.filter = Scagaire Úsáideora +auths.admin_filter = Scagaire Riaracháin +auths.restricted_filter = Scagaire Srianta +auths.verify_group_membership = Fíoraigh ballraíocht ghrúpa i LDAP (fág an scagaire folamh le scipeáil) +auths.group_search_base = Bonn Cuardaigh Grúpa DN +auths.group_attribute_list_users = Tréith Grúpa ina bhfuil Liosta Úsáideoirí +auths.user_attribute_in_group = Tréith Úsáideora atá Liostaithe i nGrúpa +auths.map_group_to_team = Léarscáil grúpaí LDAP chuig foirne na hEagraíochta (fág an réimse folamh le scipeáil) +auths.map_group_to_team_removal = Bain úsáideoirí ó fhoirne sioncronaithe mura mbaineann an t-úsáideoir leis an ngrúpa comhfhreagrach LDAP +auths.enable_ldap_groups = Cumasaigh grúpaí LDAP +auths.ms_ad_sa = MS AD Tréithe Cuardaigh +auths.smtp_auth = Cineál Fíordheimhnithe SMTP +auths.smtphost = Óstach SMTP +auths.smtpport = SMTP Calafort +auths.allowed_domains = Fearainn Ceadaithe +auths.force_smtps = Fórsa SMTPS +auths.force_smtps_helper = Úsáidtear SMTPS i gcónaí ar chalafort 465. Socraigh é seo chun SMTPS a chur i bhfeidhm ar chalafoirt eile. (Seachas sin úsáidfear STARTTLS ar chalafoirt eile má thacaíonn an t-óstach leis.) +auths.helo_hostname = Ainm Óstach HELO +auths.helo_hostname_helper = Ainm óstach a sheoltar le HELO. Fág bán chun an t-ainm óstach reatha a sheoladh. +auths.disable_helo = Díchumasaigh HELO +auths.pam_service_name = Ainm Seirbhíse PAM +auths.pam_email_domain = Fearann Ríomhphoist PAM (roghnach) +auths.oauth2_provider = Soláthraí OAuth2 +auths.oauth2_icon_url = URL deilbhín +auths.oauth2_clientID = Aitheantas Cliant (Eochair) +auths.oauth2_clientSecret = Rúnda Cliant +auths.openIdConnectAutoDiscoveryURL = URL Fionnachtana Uathoibríoch OpenID Connect +auths.oauth2_use_custom_url = Úsáid URLanna Saincheaptha in ionad URLanna Réamhshocraithe +auths.oauth2_tokenURL = URL Comhartha +auths.oauth2_authURL = Údaraigh URL +auths.oauth2_profileURL = URL Próifíl +auths.oauth2_emailURL = URL ríomhphoist +auths.skip_local_two_fa = Scipeáil 2FA áitiúil +auths.skip_local_two_fa_helper = Ciallaíonn fágáil gan socrú go mbeidh ar úsáideoirí áitiúla a bhfuil tacar 2FA acu 2FA a rith fós chun logáil isteach +auths.oauth2_tenant = Tionónta +auths.oauth2_scopes = Scóipeanna Breise +auths.oauth2_required_claim_name = Ainm Éilimh Riachtanach +auths.oauth2_required_claim_name_helper = Socraigh an t-ainm seo chun logáil isteach ón bhfoinse seo a shrianadh d'úsáideoirí a bhfuil éileamh acu leis an ainm seo +auths.oauth2_required_claim_value = Luach Éilimh Riachtanach +auths.oauth2_required_claim_value_helper = Socraigh an luach seo chun logáil isteach ón bhfoinse seo a shrianadh chuig úsáideoirí a bhfuil éileamh acu leis an ainm agus an luach seo +auths.oauth2_group_claim_name = Ainm éileamh ag soláthar ainmneacha grúpa don fhoinse seo (Roghnach) +auths.oauth2_admin_group = Luach Éilimh Grúpa d'úsáideoirí riarthóra. (Roghnach - teastaíonn ainm éilimh thuas) +auths.oauth2_restricted_group = Luach Éilimh Grúpa d'úsáideoirí srianta. (Roghnach - teastaíonn ainm éilimh thuas) +auths.oauth2_map_group_to_team = Map mhaígh grúpaí chuig foirne Eagraíochta. (Roghnach - éilíonn ainm an éilimh thuas) +auths.oauth2_map_group_to_team_removal = Bain úsáideoirí ó fhoirne sioncronaithe mura mbaineann an t-úsáideoir leis an ngrúpa comhfhreagrach. +auths.sspi_auto_create_users = Cruthaigh úsáideoirí go huathoibríoch +auths.sspi_auto_create_users_helper = Lig do mhodh auth SSPI cuntais nua a chruthú go huathoibríoch d'úsáideoirí a logálann isteach den chéad uair +auths.sspi_auto_activate_users = Gníomhachtaigh úsáideoirí go huathoibríoch +auths.sspi_auto_activate_users_helper = Lig modh auth SSPI úsáideoirí nua a ghníomhachtú go huathoibríoch +auths.sspi_strip_domain_names = Bain ainmneacha fearann ó ainm úsáideora +auths.sspi_strip_domain_names_helper = Má dhéantar iad a sheiceáil, bainfear ainmneacha fearainn ó ainmneacha logála isteach (m.sh. Beidh “DOMAIN\ user†agus "user@example.org" araon ní bheidh ach “úsáideoirâ€). +auths.sspi_separator_replacement = Deighilteoir le húsáid in ionad\,/agus @ +auths.sspi_separator_replacement_helper = An carachtar a úsáidfear chun na deighilteoirí a chur in ionad na n-ainmneacha logála síos-leibhéil (m.sh. an \ i "DOMAIN\úsáideoir") agus ainmneacha príomhoidí úsáideora (m.sh. an @ in "user@example.org"). +auths.sspi_default_language = Teanga úsáideora réamhshocraithe +auths.sspi_default_language_helper = Teanga réamhshocraithe d'úsáideoirí cruthaithe go huathoibríoch ag modh auth SSPI. Fág folamh más fearr leat teanga a bhrath go huathoibríoch. +auths.tips = Leideanna +auths.tips.oauth2.general = OAuth2 Fíordheimhniú +auths.tips.oauth2.general.tip = Agus fíordheimhniú OAuth2 nua á chlárú agat, ba chóir go mbeadh an URL glaonna ais/atreoraithe: +auths.tip.oauth2_provider = Soláthraí OAuth2 +auths.tip.nextcloud = `Cláraigh tomhaltóir OAuth nua ar do chás ag baint úsáide as an roghchlár seo a leanas "Socruithe -> Slándáil -> cliant OAuth 2.0"` +auths.tip.dropbox = Cruthaigh feidhmchlár nua ag %s +auths.tip.facebook = Cláraigh feidhmchlár nua ag %s agus cuir an táirge "Facebook Login" leis +auths.tip.github = Cláraigh feidhmchlár OAuth nua ar %s +auths.tip.gitlab_new = Cláraigh feidhmchlár nua ar %s +auths.tip.google_plus = Faigh dintiúir chliaint OAuth2 ó chonsól API Google ag %s +auths.tip.twitter = Téigh go %s, cruthaigh feidhmchlár agus cinntigh go bhfuil an rogha "Ceadaigh úsáid a bhaint as an bhfeidhmchlár seo chun logáil isteach le Twitter" cumasaithe +auths.tip.discord = Cláraigh feidhmchlár nua ar %s +auths.tip.gitea = Cláraigh feidhmchlár OAuth2 nua. Tá treoir le fáil ag %s +auths.tip.yandex = `Cruthaigh feidhmchlár nua ag %s. Roghnaigh na ceadanna seo a leanas ón rannán "Yandex.Passport API": "Rochtain ar sheoladh ríomhphoist", "Rochtain ar avatar úsáideora" agus "Rochtain ar ainm úsáideora, céad ainm agus sloinne, inscne"` +auths.tip.mastodon = Ionchur URL sampla saincheaptha don shampla mastodon is mian leat a fhíordheimhniú leis (nó bain úsáid as an gceann réamhshocraithe) +auths.edit = Cuir Foinse Fíordheimhnithe in Eagar +auths.activated = Tá an Foinse Fíordheimhnithe seo gníomhachtaithe +auths.new_success = Tá an fíordheimhniú "%s" curtha leis. +auths.update_success = Nuashonraíodh an fhoinse fíordheimhnithe. +auths.update = Nuashonraigh Foinse Fíordheimhnithe +auths.delete = Scrios Foinse Fíordheimhnithe +auths.delete_auth_title = Scrios Foinse Fíordheimhnithe +auths.delete_auth_desc = Má scriosann tú foinse fíordheimhnithe cuirtear cosc ​​ar úsáideoirí í a úsáid chun síniú isteach. Lean ort? +auths.still_in_used = Tá an fhoinse fíordheimhnithe fós in úsáid. Tiontaigh nó scrios aon úsáideoir a úsáideann an fhoinse fíordheimhnithe seo ar dtús. +auths.deletion_success = Tá an fhoinse fíordheimhnithe scriosta. +auths.login_source_exist = Tá an fhoinse fíordheimhnithe "%s" ann cheana. +auths.login_source_of_type_exist = Tá foinse fíordheimhnithe den chineál seo ann cheana féin. +auths.unable_to_initialize_openid = Ní féidir Soláthraí Ceangail OpenID a thionscnamh: %s +auths.invalid_openIdConnectAutoDiscoveryURL = URL Neamhbhailí Fionnachtana Uathoibríoch (ní mór gur URL bailí é seo ag tosú le http:// nó https://) +config.server_config = Cumraíocht Freastalaí +config.custom_conf = Cosán Comhad Cumraíochta +config.domain = Fearann ​​Freastalaí +config.offline_mode = Mód Ãitiúil +config.disable_router_log = Díchumasaigh Loga an Ródaire +config.run_mode = Mód Rith +config.git_version = Leagan Git +config.app_data_path = Cosán Sonraí Aip +config.repo_root_path = Cosán Fréimhe Stórála +config.lfs_root_path = Cosán Fréamh LFS +config.log_file_root_path = Cosán Logála +config.script_type = Cineál Script +config.ssh_config = Cumraíocht SSH +config.ssh_enabled = Cumasaithe +config.ssh_start_builtin_server = Úsáid Freastalaí Ionsuite +config.ssh_domain = Fearainn Freastalaí SSH +config.ssh_port = Calafort +config.ssh_listen_port = Éist Calafort +config.ssh_root_path = Cosán Fréimhe +config.ssh_key_test_path = Cosán Tástáil Eochair +config.ssh_minimum_key_size_check = Seiceáil Ãosta Méid Eochair +config.ssh_minimum_key_sizes = Méideanna Ãosta Eochrach +config.lfs_config = Cumraíocht LFS +config.lfs_enabled = Cumasaithe +config.lfs_content_path = Cosán Ãbhar LFS +config.db_config = Cumraíocht Bunachar Sonraí +config.db_type = Cineál +config.db_host = Óstach +config.db_name = Ainm +config.db_user = Ainm úsáideora +config.db_schema = Scéim +config.db_ssl_mode = SSL +config.db_path = Cosán +config.service_config = Cumraíocht Seirbhíse +config.register_email_confirm = Deimhniú Ríomhphost a éileamh chun Clárú +config.disable_register = Díchumasaigh Féin-Chlárú +config.allow_only_external_registration = Ceadaigh Clárú Trí Sheirbhísí Seachtracha amháin +config.enable_openid_signup = Cumasaigh Féinchlárú OpenID +config.enable_openid_signin = Cumasaigh Síniú isteach OpenID +config.show_registration_button = Taispeáin Cnaipe Cláraithe +config.mail_notify = Cumasaigh Fógraí Ríomhphoist +config.enable_captcha = Cumasaigh CAPTCHA +config.default_keep_email_private = Folaigh Seoltaí Ríomhphoist de réir Réamhshocrú +config.default_allow_create_organization = Ceadaigh Cruthú Eagraíochtaí de réir Réamhshocrú +config.enable_timetracking = Cumasaigh Rianú Ama +config.default_enable_timetracking = Cumasaigh Rianú Ama de réir Réamhshocrú +config.default_allow_only_contributors_to_track_time = Lig do Rannpháirtithe Amháin Rianú Am +config.no_reply_address = Fearann Ríomhphoist Folaithe +config.default_enable_dependencies = Cumasaigh Spleáchais Eisithe de réir Réamhshocrú +config.webhook_config = Cumraíocht Crúca Gréasán +config.queue_length = Fad scuaine +config.deliver_timeout = Teorainn Ama Seachadta +config.skip_tls_verify = Scipeáil Fíorú TLS +config.mailer_config = Cumraíocht Seoltóra +config.mailer_enabled = Cumasaithe +config.mailer_enable_helo = Cumasaigh HELO +config.mailer_name = Ainm +config.mailer_protocol = Prótacal +config.mailer_smtp_port = Calafort SMTP +config.mailer_user = Úsáideoir +config.mailer_use_sendmail = Úsáid Sendmail +config.mailer_sendmail_path = Cosán Sendmail +config.mailer_sendmail_args = Argóintí Breise chuig Sendmail +config.mailer_sendmail_timeout = Teorainn Ama Sendmail +config.mailer_use_dummy = Caochadán +config.test_email_placeholder = Ríomhphost (m.sh. test@example.com) +config.send_test_mail_submit = Seol +config.oauth_config = Cumraíocht OAuth +config.oauth_enabled = Cumasaithe +config.cache_config = Cumraíocht taisce +config.cache_adapter = Cuibheoir taisce +config.cache_interval = Eatramh Taisce +config.cache_conn = Ceangal Taisce +config.cache_item_ttl = Mír Taisce TTL +config.cache_test = Taisce Tástáil +config.cache_test_failed = Theip ar an taisce a thaiscéaladh: %v. +config.cache_test_slow = D'éirigh leis an tástáil taisce, ach tá an freagra mall: %s. +config.cache_test_succeeded = D'éirigh leis an tástáil taisce, fuair sé freagra i %s. +config.session_config = Cumraíocht Seisiúin +config.session_provider = Soláthraí Seisiúin +config.provider_config = Cumraíocht Soláthraí +config.cookie_name = Ainm Fianán +config.gc_interval_time = Am Eatramh GC +config.https_only = HTTPS Amháin +config.picture_config = Cumraíocht Pictiúr agus Avatar +config.picture_service = Seirbhís Pictiúr +config.disable_gravatar = Díchumasaigh Gravatar +config.enable_federated_avatar = Cumasaigh Avatars Cónaidhme +config.open_with_editor_app_help = Na heagarthóirí "Oscailte le" don roghchlár Clón. Má fhágtar folamh é, úsáidfear an réamhshocrú. Leathnaigh chun an réamhshocrú a fheiceáil. +config.git_config = Cumraíocht Git +config.git_gc_args = Argóintí GC +config.git_migrate_timeout = Teorainn Ama Imirce +config.git_mirror_timeout = Teorainn Ama Nuashonraithe Scátháin +config.git_clone_timeout = Teorainn Ama Oibríochta Clón +config.git_pull_timeout = Tarraing Am Oibríochta +config.git_gc_timeout = Teorainn Ama Oibriúcháin GC +config.log_config = Cumraíocht Logáil +config.logger_name_fmt = Logálaí: %s +config.disabled_logger = Díchumasaithe +config.access_log_mode = Mód Logáil Rochtana +config.access_log_template = Teimpléad Logáil Rochtana +config.xorm_log_sql = Logáil SQL +config.set_setting_failed = Theip ar shocrú %s a shocrú +monitor.stats = Staitisticí +monitor.cron = Tascanna Cron +monitor.name = Ainm +monitor.schedule = Sceideal +monitor.next = An chéad uair eile +monitor.previous = Am Roimhe Seo +monitor.execute_times = Forghníomhaíochtaí +monitor.process = Próisis reatha +monitor.stacktrace = Rian cruachta +monitor.processes_count = Próisis %d +monitor.download_diagnosis_report = Ãoslódáil tuairisc diagnóis +monitor.desc = Cur síos +monitor.start = Am Tosaigh +monitor.execute_time = Am Forghníomhaithe +monitor.last_execution_result = Toradh +monitor.process.cancel = Cealaigh próiseas +monitor.process.children = Leanaí +monitor.queues = Scuaineanna +monitor.queue = Scuaine: %s +monitor.queue.name = Ainm +monitor.queue.type = Cineál +monitor.queue.exemplar = Cineál Eiseamláire +monitor.queue.numberworkers = Líon na nOibrithe +monitor.queue.activeworkers = Oibrithe Gníomhacha +monitor.queue.maxnumberworkers = Líon Uasta na nOibrithe +monitor.queue.numberinqueue = Uimhir i scuaine +monitor.queue.review_add = Athbhreithniú / Cuir Oibrithe leis +monitor.queue.settings.title = Socruithe Linn +monitor.queue.settings.desc = Fásann linnte go dinimiciúil mar fhreagra ar a gcuid scuaine oibrithe a bhlocáil. +monitor.queue.settings.maxnumberworkers = Uaslíon na n-oibrithe +monitor.queue.settings.maxnumberworkers.placeholder = Faoi láthair %[1]d +monitor.queue.settings.maxnumberworkers.error = Caithfidh uaslíon na n-oibrithe a bheith ina uimhir +monitor.queue.settings.submit = Nuashonrú Socruithe +monitor.queue.settings.changed = Socruithe Nuashonraithe +monitor.queue.settings.remove_all_items = Bain gach +monitor.queue.settings.remove_all_items_done = Baineadh na míreanna go léir sa scuaine. +notices.system_notice_list = Fógraí Córais +notices.operations = Oibríochtaí +notices.select_all = Roghnaigh Gach +notices.deselect_all = Díroghnaigh Gach +notices.inverse_selection = Roghnú Inbhéartha +notices.delete_selected = Scrios Roghnaithe +notices.delete_all = Scrios Gach Fógra +notices.type = Cineál +notices.type_1 = Stóras +notices.type_2 = Tasc +notices.desc = Cur síos +notices.op = Oibríocht. +notices.delete_success = Scriosadh na fógraí córais. +self_check.no_problem_found = Níor aimsíodh aon fhadhb fós. +self_check.database_collation_mismatch = Bí ag súil le comhthiomsú a úsáid sa bhunachar sonraí: %s +self_check.database_inconsistent_collation_columns = Tá comhthiomsú %s in úsáid ag an mbunachar sonraí, ach tá comhthiomsuithe mímheaitseála á n-úsáid ag na colúin seo. D'fhéadfadh sé a bheith ina chúis le roinnt fadhbanna gan choinne. + +[action] +create_repo = stóras cruthaithe %s +rename_repo = stóras athainmnithe ó %[1]s go %[3]s +commit_repo = brú chuig %[3]s ag %[4]s +create_issue = `osclaíodh ceist %[3]s#%[2]s` +close_issue = `eagrán dúnta %[3]s#%[2]s` +reopen_issue = `athoscailt an cheist %[3]s#%[2]s` +create_pull_request = `iarratas tarraingthe cruthaithe %[3]s#%[2]s` +close_pull_request = `iarratas tarraingthe dúnta %[3]s#%[2]s` +reopen_pull_request = `iarratas tarraingthe athoscailte %[3]s#%[2]s` +comment_issue = `trácht ar cheist %[3]s#%[2]s` +comment_pull = `déan trácht ar iarratas tarraingthe %[3]s#%[2]s` +merge_pull_request = `iarratas tarraingthe cumaisc %[3]s#%[2]s` +auto_merge_pull_request = `iarratas tarraingthe cumasctha go huathoibríoch %[3]s#%[2]s` +transfer_repo = aistrithe stóras %s go %s +push_tag = brú %[3]s go %[4]s +delete_tag = scriosta clib %[2]s ó %[3]s +delete_branch = brainse scriosta %[2]s ó %[3]s +compare_branch = Déan comparáid +compare_commits = Déan comparáid idir tiomáintí %d +compare_commits_general = Déan comparáid idir tiomáintí +mirror_sync_push = geallann synced do %[3]s ag %[4]s ón scáthán +mirror_sync_create = sioncronaigh tagairt nua %[3]s do %[4]s ón scáthán +mirror_sync_delete = sioncronaithe agus scriosta an tagairt %[2]s ag %[3]s ón scáthán +approve_pull_request = `ceadaithe %[3]s#%[2]s` +reject_pull_request = `athruithe molta le haghaidh %[3]s#%[2]s` +publish_release = `scaoileadh %[4]s ag %[3]s` +review_dismissed = `léirmheas ó %[4]s le haghaidh %[3]s#%[2]s` +review_dismissed_reason = Cúis: +create_branch = brainse cruthaithe %[3]s i %[4]s +starred_repo = le %[2]s le réalta +watched_repo = thosaigh sé ag breathnú ar %[2]s + +[tool] +now = anois +future = todhchaí +1s = 1 soicind +1m = 1 nóiméad +1h = 1 uair an chloig +1d = 1 lá +1w = 1 seachtain +1mon = 1 mhí +1y = 1 bhliain +seconds = %d soicind +minutes = %d nóiméad +hours = %d uair an chloig +days = %d laethanta +weeks = %d seachtain +months = %d míonna +years = %d bliain +raw_seconds = soicind +raw_minutes = nóiméad + +[dropzone] +default_message = Scaoil comhaid nó cliceáil anseo chun iad a uaslódáil. +invalid_input_type = Ní féidir leat comhaid den chineál seo a uaslódáil. +file_too_big = Sáraíonn méid comhaid ({{filesize}} MB) an t-uasmhéid de ({{maxFilesize}} MB). +remove_file = Bain an comhad + +[notification] +notifications = Fógraí +unread = Gan léamh +read = Léigh +no_unread = Gan aon fhógraí neamh-léite. +no_read = Gan aon fhógraí léite. +pin = Fógra bioráin +mark_as_read = Marcáil mar léite +mark_as_unread = Marcáil mar neamh-léite +mark_all_as_read = Marcáil gach ceann mar léite +subscriptions = Síntiúis +watching = Ag féachaint +no_subscriptions = Gan síntiúis + +[gpg] +default_key = Sínithe leis an eochair réamhshocraithe +error.extract_sign = Theip ar an síniú a bhaint +error.generate_hash = Theip ar hash gealltanas a ghiniúint +error.no_committer_account = Níl aon chuntas nasctha le seoladh ríomhphoist an tiomnóra + +[units] +unit = Aonad +error.no_unit_allowed_repo = Níl cead agat rochtain a fháil ar aon chuid den tiomantas seo. +error.unit_not_allowed = Níl cead agat an rannán stóras seo a rochtain. + +[packages] +title = Pacáistí +desc = Bainistigh pacáistí stórais. +empty = Níl aon phacáistí ann fós. +empty.documentation = Le haghaidh tuilleadh eolais ar chlárlann na bpacáistí, féach ar na doiciméid. +empty.repo = An ndearna tú uaslódáil ar phacáiste, ach nach bhfuil sé léirithe anseo? Téigh go socruithe pacáiste agus nasc leis an stóras seo é. +registry.documentation = Le haghaidh tuilleadh eolais ar chlárlann %s, féach ar na doiciméid. +filter.type = Cineál +filter.type.all = Gach +filter.no_result = Níor thug do scagaire aon torthaí. +filter.container.tagged = Clibeáilte +filter.container.untagged = Gan chlib +published_by = Foilsithe %[1]s ag %[3]s +published_by_in = Foilsithe ag %[1]s ag %[3]s in %[5]s +installation = Suiteáil +about = Maidir leis an bpacáiste seo +requirements = Riachtanais +dependencies = Spleithiúlachtaí +keywords = Eochairfhocail +details = Sonraí +details.author = Údar +details.license = Ceadúnas +assets = Sócmhainní +versions = Leaganacha +versions.view_all = Féach ar gach +dependency.id = ID +dependency.version = Leagan +search_in_external_registry = Cuardaigh i %s +alpine.registry = Socraigh an chlár seo tríd an url a chur i do chomhad /etc/apk/repositories: +alpine.registry.key = Ãoslódáil eochair RSA poiblí na clárlainne isteach san fhillteán /etc/apk/keys/ chun an síniú innéacs a fhíorú: +alpine.registry.info = Roghnaigh $branch agus $repository ón liosta thíos. +alpine.install = Chun an pacáiste a shuiteáil, rith an t-ordú seo a leanas: +alpine.repository = Eolas Stórais +alpine.repository.branches = Brainsí +alpine.repository.repositories = Stórais +alpine.repository.architectures = Ailtireachtaí +cargo.registry = Socraigh an clárlann seo sa chomhad cumraíochta lasta (mar shampla ~/.cargo/config.toml): +cargo.install = Chun an pacáiste a shuiteáil ag baint úsáide as Cargo, reáchtáil an t-ordú seo a leanas: +chef.registry = Socraigh an clárlann seo i do chomhad ~/.chef/config.rb: +chef.install = Chun an pacáiste a shuiteáil, rith an t-ordú seo a leanas: +composer.registry = Socraigh an chlár seo i do chomhad ~/.composer/config.json: +composer.install = Chun an pacáiste a shuiteáil ag baint úsáide as Cumadóir, reáchtáil an t-ordú seo a leanas: +composer.dependencies = Spleithiúlachtaí +composer.dependencies.development = Spleithiúlachtaí Forbartha +conan.details.repository = Stóras +conan.registry = Socraigh an clárlann seo ón líne ordaithe: +conan.install = Chun an pacáiste a shuiteáil ag úsáid Conan, reáchtáil an t-ordú seo a leanas: +conda.registry = Socraigh an chlár seo mar stóras Conda i do chomhad .condarc: +conda.install = Chun an pacáiste a shuiteáil ag úsáid Conda, reáchtáil an t-ordú seo a leanas: +container.details.type = Cineál Ãomhá +container.details.platform = Ardán +container.pull = Tarraing an íomhá ón líne ordaithe: +container.digest = Díleáigh +container.multi_arch = Córas Oibriúcháin / Ailtireacht +container.layers = Sraitheanna Ãomhá +container.labels = Lipéid +container.labels.key = Eochair +container.labels.value = Luach +cran.registry = Cumraigh an chlárlann seo i do chomhad Rprofile.site: +cran.install = Chun an pacáiste a shuiteáil, rith an t-ordú seo a leanas: +debian.registry = Socraigh an clárlann seo ón líne ordaithe: +debian.registry.info = Roghnaigh $distribution agus $component ón liosta thíos. +debian.install = Chun an pacáiste a shuiteáil, rith an t-ordú seo a leanas: +debian.repository = Eolas Stóras +debian.repository.distributions = Dáiltí +debian.repository.components = Comhpháirteanna +debian.repository.architectures = Ailtireachtaí +generic.download = Ãoslódáil pacáiste ón líne ordaithe: +go.install = Suiteáil an pacáiste ón líne ordaithe: +helm.registry = Socraigh an clárlann seo ón líne ordaithe: +helm.install = Chun an pacáiste a shuiteáil, rith an t-ordú seo a leanas: +maven.registry = Socraigh an clárlann seo i do chomhad pom.xml tionscadail: +maven.install = Chun an pacáiste a úsáid cuir na nithe seo a leanas sa bhloc spleáchais sa chomhad pom.xml: +maven.install2 = Rith tríd an líne ordaithe: +maven.download = Chun an spleáchas a íoslódáil, rith tríd an líne ordaithe: +nuget.registry = Socraigh an clárlann seo ón líne ordaithe: +nuget.install = Chun an pacáiste a shuiteáil ag úsáid NuGet, reáchtáil an t-ordú seo a leanas: +nuget.dependency.framework = Spriocchreat +npm.registry = Socraigh an chlárlann seo i do chomhad .npmrc do thionscadail: +npm.install = Chun an pacáiste a shuiteáil ag úsáid npm, reáchtáil an t-ordú seo a leanas: +npm.install2 = nó cuir leis an gcomhad package.json é: +npm.dependencies = Spleithiúlachtaí +npm.dependencies.development = Spleithiúlachtaí Forbartha +npm.dependencies.bundle = Spleáchais Chuachta +npm.dependencies.peer = Spleithiúlachtaí Piaraí +npm.dependencies.optional = Spleáchais Roghnacha +npm.details.tag = Clib +pub.install = Chun an pacáiste a shuiteáil ag úsáid Dart, reáchtáil an t-ordú seo a leanas: +pypi.requires = Teastaíonn Python +pypi.install = Chun an pacáiste a shuiteáil ag úsáid pip, reáchtáil an t-ordú seo a leanas: +rpm.registry = Socraigh an clárlann seo ón líne ordaithe: +rpm.distros.redhat = ar dháileadh bunaithe ar RedHat +rpm.distros.suse = ar dháileadh bunaithe ar SUSE +rpm.install = Chun an pacáiste a shuiteáil, rith an t-ordú seo a leanas: +rpm.repository = Eolas Stóras +rpm.repository.architectures = Ailtireachtaí +rpm.repository.multiple_groups = Tá an pacáiste seo ar fáil i ngrúpaí éagsúla. +rubygems.install = Chun an pacáiste a shuiteáil ag baint úsáide as gem, reáchtáil an t-ordú seo a leanas: +rubygems.install2 = nó cuir leis an Gemfile é: +rubygems.dependencies.runtime = Spleáchais Rith-Ama +rubygems.dependencies.development = Spleáchais Forbartha +rubygems.required.ruby = Éilíonn leagan Ruby +rubygems.required.rubygems = Éilíonn leagan RubyGem +swift.registry = Socraigh an clárlann seo ón líne ordaithe: +swift.install = Cuir an pacáiste i do chomhad Package.swift: +swift.install2 = agus reáchtáil an t-ordú seo a leanas: +vagrant.install = Chun bosca Vagrant a chur leis, reáchtáil an t-ordú seo a leanas: +settings.link = Nasc an pacáiste seo le stóras +settings.link.description = Má nascann tú pacáiste le stóras, liostaítear an pacáiste i liosta pacáistí an stórais. +settings.link.select = Roghnaigh Stóras +settings.link.button = Nuashonraigh Nasc Stórais +settings.link.success = D'éirigh le nasc an stórais a nuashonrú. +settings.link.error = Theip ar an nasc stóras a nuashonrú. +settings.delete = Scrios pacáiste +settings.delete.description = Tá pacáiste a scriosadh buan agus ní féidir é a chur ar ais. +settings.delete.notice = Tá tú ar tí %s (%s) a scriosadh. Tá an oibríocht seo dochúlaithe, an bhfuil tú cinnte? +settings.delete.success = Tá an pacáiste scriosta. +settings.delete.error = Theip ar an pacáiste a scriosadh. +owner.settings.cargo.title = Innéacs Clárlann Lasta +owner.settings.cargo.initialize = Innéacs a chur i dtosach +owner.settings.cargo.initialize.description = Tá gá le stóras innéacs speisialta Git chun an clárlann Cargo a úsáid. Tríd an rogha seo, cruthófar an stóras (nó athchruthófar é) agus cumrófar é go huathoibríoch. +owner.settings.cargo.initialize.error = Níorbh fhéidir an t-innéacs Cargo a thúsú: %v +owner.settings.cargo.initialize.success = Cruthaíodh an t-innéacs Cargo go rathúil. +owner.settings.cargo.rebuild = Innéacs Atógáil +owner.settings.cargo.rebuild.description = Is féidir atógáil a bheith úsáideach mura bhfuil an t-innéacs sioncronaithe leis na pacáistí Cargo stóráilte. +owner.settings.cargo.rebuild.error = Níorbh fhéidir an t-innéacs Cargo a atógáil: %v +owner.settings.cargo.rebuild.success = D'éirigh leis an innéacs Cargo a atógáil. +owner.settings.cleanuprules.add = Cuir Riail Glantacháin leis +owner.settings.cleanuprules.edit = Cuir Riail Glantacháin in eagar +owner.settings.cleanuprules.preview = Réamhamharc Riail Glantacháin +owner.settings.cleanuprules.preview.overview = Tá pacáistí %d beartaithe a bhaint. +owner.settings.cleanuprules.preview.none = Ní hionann riail glantacháin agus pacáistí ar bith. +owner.settings.cleanuprules.enabled = Cumasaithe +owner.settings.cleanuprules.pattern_full_match = Cuir patrún i bhfeidhm ar ainm an phacáiste iomlán +owner.settings.cleanuprules.keep.title = Coinnítear leaganacha a mheaitseálann leis na rialacha seo, fiú má mheaitseálann siad riail bhaint thíos. +owner.settings.cleanuprules.keep.count = Coinnigh an ceann is déanaí +owner.settings.cleanuprules.keep.count.1 = 1 leagan in aghaidh an phacáiste +owner.settings.cleanuprules.keep.count.n = Leaganacha %d in aghaidh an phacáiste +owner.settings.cleanuprules.keep.pattern = Coinnigh leaganacha meaitseála +owner.settings.cleanuprules.keep.pattern.container = Coinnítear an leagan is déanaí le haghaidh pacáistí Coimeádán i gcónaí. +owner.settings.cleanuprules.remove.title = Baintear leaganacha a mheaitseálann leis na rialacha seo, mura deir riail thuas iad a choinneáil. +owner.settings.cleanuprules.remove.days = Bain leaganacha níos sine ná +owner.settings.cleanuprules.remove.pattern = Bain leaganacha meaitseála +owner.settings.cleanuprules.success.update = Nuashonraíodh an riail ghlantacháin. +owner.settings.cleanuprules.success.delete = Scriosadh an riail glantacháin. +owner.settings.chef.title = Clárlann Chef +owner.settings.chef.keypair = Gin péire eochair +owner.settings.chef.keypair.description = Tá eochairphéire riachtanach le fíordheimhniú a dhéanamh ar chlárlann an Chef. Má tá péire eochrach ginte agat roimhe seo, má ghinfidh tú eochairphéire nua, scriosfar an seanphéire eochair. + +[secrets] +secrets = Rúin +description = Cuirfear rúin ar aghaidh chuig gníomhartha áirithe agus ní féidir iad a léamh ar mhalairt. +none = Níl aon rúin ann fós. +creation = Cuir Rúnda leis +creation.name_placeholder = carachtair alfanumair nó íoslaghda amháin nach féidir a thosú le GITEA_ nó GITHUB_ +creation.value_placeholder = Ionchur ábhar ar bith. Fágfar spás bán ag tús agus ag deireadh ar lár. +creation.success = Tá an rún "%s" curtha leis. +creation.failed = Theip ar an rún a chur leis. +deletion = Bain rún +deletion.description = Is buan rún a bhaint agus ní féidir é a chealú. Lean ort? +deletion.success = Tá an rún bainte. +deletion.failed = Theip ar rún a bhaint. + +[actions] +actions = Gníomhartha +runners = Reathaitheoirí +runners.new = Cruthaigh reathaí nua +runners.new_notice = Conas reathaí a thosú +runners.status = Stádas +runners.id = ID +runners.name = Ainm +runners.owner_type = Cineál +runners.description = Cur síos +runners.labels = Lipéid +runners.last_online = Am Ar Líne Deiridh +runners.runner_title = Reathaí +runners.task_list = Tascanna le déanaí ar an reathaí seo +runners.task_list.no_tasks = Níl aon tasc ann fós. +runners.task_list.run = Rith +runners.task_list.status = Stádas +runners.task_list.repository = Stóras +runners.task_list.commit = Tiomantas +runners.task_list.done_at = Déanta ag +runners.edit_runner = Cuir Reathaí in Eagar +runners.update_runner = Nuashonrú Athruithe +runners.update_runner_success = Nuashonraíodh an Reathaí +runners.update_runner_failed = Theip ar an reathaí a nuashonrú +runners.delete_runner = Scrios an reathaí seo +runners.delete_runner_success = Scriosadh an reathaí go rathúil +runners.delete_runner_failed = Theip ar an reathaí a scriosadh +runners.delete_runner_header = Deimhnigh an reathaí seo a scriosadh +runners.delete_runner_notice = Má tá tasc ar siúl ar an reathaí seo, cuirfear deireadh leis agus marcáil mar theip. Féadfaidh sé sreabhadh oibre tógála a bhriseadh. +runners.none = Níl aon reathaí ar fáil +runners.status.unspecified = Anaithnid +runners.status.idle = Díomhaoin +runners.status.active = Gníomhach +runners.status.offline = As líne +runners.version = Leagan +runners.reset_registration_token = Athshocraigh comhartha clár +runners.reset_registration_token_success = D'éirigh le hathshocrú comhartha clárúcháin an dara háit +runs.all_workflows = Gach Sreafaí Oibre +runs.commit = Tiomantas +runs.scheduled = Sceidealaithe +runs.pushed_by = bhrú ag +runs.invalid_workflow_helper = Tá comhad cumraíochta sreabhadh oibre nebhailí. Seiceáil do chomhad cumraithe le do thoil: %s +runs.no_matching_online_runner_helper = Gan aon reathaí ar líne a mheaitseáil le lipéad: %s +runs.no_job_without_needs = Caithfidh post amháin ar a laghad a bheith sa sreabhadh oibre gan spleáchas. +runs.no_job = Caithfidh post amháin ar a laghad a bheith sa sreabhadh oibre +runs.actor = Aisteoir +runs.status = Stádas +runs.actors_no_select = Gach aisteoir +runs.status_no_select = Gach stádas +runs.no_results = Níor mheaitseáil aon torthaí. +runs.no_workflows = Níl aon sreafaí oibre ann fós. +runs.no_runs = Níl aon rith ag an sreabhadh oibre fós. +runs.empty_commit_message = (teachtaireacht tiomantas folamh) +runs.expire_log_message = Glanadh logaí toisc go raibh siad ró-sean. +workflow.disable = Díchumasaigh sreabhadh oibre +workflow.enable = Cumasaigh sreabhadh oibre +workflow.disabled = Tá sreabhadh oibre díchumasaithe +need_approval_desc = Teastaíonn faomhadh chun sreafaí oibre a rith le haghaidh iarratas tarraingt forc. +variables = Athróga +variables.creation = Cuir Athróg leis +variables.none = Níl aon athróga ann fós. +variables.deletion = Bain athróg +variables.deletion.description = Tá athróg a bhaint buan agus ní féidir é a chur ar ais. Lean ar aghaidh? +variables.description = Cuirfear athróga chuig gníomhartha áirithe agus ní féidir iad a léamh ar mhalairt eile. +variables.id_not_exist = Níl athróg le ID %d ann. +variables.edit = Cuir Athróg in Eagar +variables.deletion.failed = Theip ar athróg a bhaint. +variables.deletion.success = Tá an athróg bainte. +variables.creation.failed = Theip ar athróg a chur leis. +variables.creation.success = Tá an athróg "%s" curtha leis. +variables.update.failed = Theip ar athróg a chur in eagar. +variables.update.success = Tá an t-athróg curtha in eagar. + +[projects] +deleted.display_name = Tionscadal scriosta +type-1.display_name = Tionscadal Aonair +type-2.display_name = Tionscadal Stórais +type-3.display_name = Tionscadal Eagrúcháin + +[git.filemode] +changed_filemode = %[1]s → %[2]s +directory = Eolaire +normal_file = Comhad gnáth +executable_file = Comhad infheidhmithe +symbolic_link = Nasc siombalach +submodule = Fo-mhodúl diff --git a/options/locale/locale_gl.ini b/options/locale/locale_gl.ini index 94e915e3bf..75763775eb 100644 --- a/options/locale/locale_gl.ini +++ b/options/locale/locale_gl.ini @@ -1,6 +1,3 @@ - - - [common] home = Inicio dashboard = Panel de Control @@ -11,18 +8,18 @@ sign_in = Iniciar sesión sign_in_with_provider = Iniciar Sesión con %s sign_in_or = ou sign_out = Pechar Sesión -sign_up = Rexístrate -link_account = Vincular Conta +sign_up = Rexistrarse +link_account = Vincular conta register = Rexistro -version = Vesión -powered_by = Desenvolvido por %s +version = Versión +powered_by = Impulsado por %s page = Páxina template = Modelo notifications = Notificacións -active_stopwatch = Activar Rastrexador de Tempo +active_stopwatch = Rastreador de tempo activo create_new = Crear… -user_profile_and_more = Perfil e Configuración… -signed_in_as = Inicia Sesión como +user_profile_and_more = Perfil e configuración… +signed_in_as = Sesión iniciada como enable_javascript = Este sitio web require JavaScript. toc = Táboa de Contidos licenses = Licenzas @@ -32,17 +29,17 @@ email = Enderezo Electrónico password = Contrasinal re_type = Confirme o contrasinal captcha = CAPTCHA -twofa = Autenticación de Dous Factores -passcode = Código de Acceso -webauthn_insert_key = Insira a súa Chave de Seguranza -webauthn_press_button = Preme o botón da súa Chave de Seguranza… +twofa = Autenticación de dobre factor +passcode = Código de acceso +webauthn_insert_key = Insira a súa chave de seguridade +webauthn_press_button = Prema o botón da súa chave de seguridade… webauthn_use_twofa = Use o Código de Dous Factores do seu Teléfono -webauthn_error = Non se Puido Ler a súa Chave de Seguranza. -webauthn_unsupported_browser = O seu Navegador non Soporta Actualmente WebAuthn. -webauthn_error_unknown = Produciuse un Erro Descoñecido.Téntao de novo. -webauthn_error_unable_to_process = O Servidor non Puido Procesar a súa Solicitude. -webauthn_error_duplicated = A Chave de Seguranza non está Permitida para esta Solicitude. Asegúrese de que a Chave non Estea Rexistrada. -webauthn_error_empty = Debes Definir un Nome para esta Chave. +webauthn_error = Non se puido ler a súa clave de seguridade. +webauthn_unsupported_browser = O seu navegador non soporta WebAuthn actualmente. +webauthn_error_unknown = Produciuse un erro descoñecido. Ténteo de novo. +webauthn_error_unable_to_process = O servidor non puido procesar a súa solicitude. +webauthn_error_duplicated = A clave de seguridade non está permitida para esta solicitude. Asegúrese de que a clave non estea xa rexistrada. +webauthn_error_empty = Debe definir un nome para esta clave. webauthn_reload = Recarga repository = Repositorio organization = Organización @@ -52,21 +49,21 @@ new_migrate = Nova Migración new_mirror = Novo Espello new_fork = Nova Bifurcación do Repositorio new_org = Nova Organización -new_project = Novo Proxecto -new_project_column = Nova Columna +new_project = Novo proxecto +new_project_column = Nova columna manage_org = Xestionar Organizacións -admin_panel = Administración do Sitio +admin_panel = Administración da páxina account_settings = Axustes da Conta settings = Configuración your_profile = Perfil your_starred = Destacado -your_settings = Configuracións +your_settings = Configuración all = Todo sources = Fontes mirrors = Espellos collaborative = Colaborativo forks = Derivacións -pull_requests = Pull Requests +pull_requests = Solicitudes de fusión milestones = Fitos ok = OK cancel = Cancelar @@ -74,57 +71,57 @@ retry = Volve Tentar rerun = Volve Executar rerun_all = Volve Executar Todos os Traballos add = Engadir -add_all = Engadir Todo -remove_all = Quitar Todo -remove_label_str = Eliminar Elemento "%s" +add_all = Engadir todo +remove_all = Quitar todo +remove_label_str = Eliminar elemento "%s" edit = Editar enabled = Activado locked = Bloqueado copy = Copiar copy_url = Copiar URL -copy_branch = Copiar o Nome da Rama +copy_branch = Copiar o nome da rama copy_success = Copiado! -copy_error = Erro na Copia +copy_error = Erro na copia write = Escribir -preview = Vista Previa +preview = Vista previa loading = Cargando… error = Erro -go_back = Volver Atrás +go_back = Volver atrás never = Nunca unknown = Descoñecido rss_feed = Feed RSS unpin = Desprender artifacts = Artefactos -confirm_delete_artifact = Estás seguro de que queres eliminar o Artefacto '%s' ? +confirm_delete_artifact = Está seguro de querer eliminar o artefacto "%s"? archived = Arquivado concept_system_global = Global access_token = Token de Acceso activities = Actividades save = Gardar -copy_content = Copiar Contido +copy_content = Copiar contido language = Linguaxe copy_hash = Copiar hash twofa_scratch = Código Scratch de Dous Factores -webauthn_sign_in = Preme o botón da súa Chave de Seguranza. Se a súa Chave de Seguranza non ten ningún botón, insírela de novo. -issues = Problemas +webauthn_sign_in = Prema o botón da súa chave de seguridade. Se a súa chave de seguridade non ten ningún botón, volva inserila. +issues = Incidencias disabled = Desactivado -error404 = A páxina á que estás tentando acceder Non Existe ou Non tes Autorización para vela. -tracked_time_summary = Resumo do tempo de seguimento baseado nos filtros da lista de problemas -webauthn_error_insecure = WebAuthn só Admite Conexións Seguras. Para probar a través de HTTP, pode usar a orixe "localhost" ou "127.0.0.1" -webauthn_error_timeout = Alcanzouse o tempo de espera antes de que se Pidese Ler a súa Chave. Volve cargar esta Páxina e Téntao de Novo. +error404 = A páxina á que estás tentando acceder non existe ou non tes autorización para vela. +tracked_time_summary = Resumo do tempo de seguimento baseado nos filtros da lista de incidencias +webauthn_error_insecure = WebAuthn só admite conexións seguras. Para probar a través de HTTP, pode usar a orixe "localhost" ou "127.0.0.1" +webauthn_error_timeout = Alcanzouse o límite de tempo antes de que se puidera ler a súa clave. Volva cargar esta páxina e ténteo de novo. remove = Quitar -view = Vista +view = Ver copy_type_unsupported = Este tipo de ficheiro non se pode copiar concept_user_organization = Organización -show_timestamps = Mostrar M0arcas de Tempo -show_log_seconds = Mostrar Segundos -download_logs = Descargar Rexistros +show_timestamps = Mostrar marcas de tempo +show_log_seconds = Mostrar segundos +download_logs = Descargar rexistros name = Nome value = Valor -confirm_delete_selected = Confirmar a eliminación de todos os elementos seleccionados? +confirm_delete_selected = Confirmar a eliminación de tódolos elementos seleccionados? show_full_screen = Mostrar Pantalla Completa -more_items = Máis items -toggle_menu = Alternar Menú +more_items = Máis elementos +toggle_menu = Alternar menú filter = Filtro filter.clear = Borrar filtros filter.is_archived = Arquivado @@ -143,6 +140,14 @@ pin = Aproximada filter.private = Privado copy_generic = Copiar ao portapapeis test = Test +copy_path = Copiar ruta +error413 = Esgotou a súa cota. +new_repo.title = Novo repositorio +new_migrate.title = Nova migración +new_org.title = Nova organización +new_repo.link = Novo repositorio +new_migrate.link = Nova migración +new_org.link = Nova organización [aria] navbar = Barra de Navegación @@ -157,6 +162,7 @@ more = Máis number_of_contributions_in_the_last_12_months = %s de contribucións nos últimos 12 meses contributions_few = contribucións contributions_one = contribución +contributions_format = {contributions} no {day} de {month} do {year} [editor] buttons.heading.tooltip = Engadir Título @@ -169,20 +175,56 @@ buttons.list.unordered.tooltip = Engadir unha lista de marcadores buttons.enable_monospace_font = Activa o tipo de letra monoespazo buttons.disable_monospace_font = Desactivar o tipo de letra monoespazo buttons.ref.tooltip = Referencia un problema ou pull request +buttons.indent.tooltip = Aniña os elementos nun nivel +buttons.unindent.tooltip = Desaniñar os elementos nun nivel +table_modal.placeholder.content = Contido +table_modal.label.rows = Filas +table_modal.label.columns = Columnas +buttons.list.ordered.tooltip = Engade unha lista numerada +buttons.list.task.tooltip = Engade unha lista de tarefas +buttons.mention.tooltip = Menciona a un usuario ou equipo +buttons.switch_to_legacy.tooltip = Utilizar o editor herdado +buttons.new_table.tooltip = Engadir táboa +table_modal.header = Engadir táboa +table_modal.placeholder.header = Cabeceira +link_modal.header = Engadir ligazón +link_modal.url = Url +link_modal.description = Descrición [search] search = Buscar... -type_tooltip = Tipo de busca +type_tooltip = Tipo de procura 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... +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... +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... +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... [startpage] platform = Multiplataforma app_desc = Um servizo Git autoxestionado e fácil de usar install = Fácil de instalar -platform_desc = Forgejo execútase en calquera lugar onde Go poida compilar para: Windows, MacOS, Linux, ARM, etc. Escolla seu preferido! -install_desc = Simplemente executa o binario para a túa plataforma, envíao con < un target="_blank" rel="noopener noreferrer" href="%[2]s">Docker ou consígueo empaquetado. +install_desc = Simplemente executa o binario para a túa plataforma, envíao con Docker ou consígueo empaquetado. +license = Código aberto [error] occurred = Ocorreu un erro @@ -226,4 +268,26 @@ sqlite_helper = Ruta do ficheiro para a base de datos SQLite3.
      Introduza unha reinstall_confirm_message = A reinstalación cunha base de datos Forgejo existente pode causar varios problemas. Na maioría dos casos, deberías usar o teu "app.ini" existente para executar Forgejo. Se sabes o que estás facendo, confirma o seguinte: reinstall_confirm_check_1 = É posible que se perdan os datos cifrados pola SECRET_KEY en app.ini: é posible que os usuarios non poidan iniciar sesión con 2FA/OTP e que os espellos non funcionen correctamente. Ao marcar esta caixa, confirmas que o ficheiro app.ini actual contén a SECRET_KEY correcta. disable_gravatar.description = Desactiva o uso de Gravatar ou outras fontes de avatares de terceiros. As imaxes predeterminadas utilizaranse para os avatares dos usuarios a menos que carguen o seu propio avatar na instancia. -federated_avatar_lookup = Activar avatares federados \ No newline at end of file +federated_avatar_lookup = Activar avatares federados +repo_path = Ruta raíz do repositorio +run_user = O usuario co que executar +password = Contrasinal +repo_path_helper = Os repositorios Git remotos gardaránse neste directorio. +lfs_path = Ruta raíz de Git LFS +install = Instalación +db_title = Configuración da base de datos +db_name = Nome da base de datos +db_schema = Esquema +db_schema_helper = Déixao baleiro para a base de datos por defecto ("public"). +app_name = Título da instancia +user = Nome de usuario +general_title = Opcións xerais +app_name_helper = Escribe o nome da túa instancia aqui. Será amosado en cada páxina. +mailer_user = Usuario SMTP +mailer_password = Contrasinal SMTP +title = Configuración inicial +db_type = Tipo de base de datos +app_slogan = Slogan da instancia +app_slogan_helper = Escribe o slogan da túa instancia aqui. Ou deixao baleiro para desabilitala. +domain = Dominio do servidor +ssh_port = Porto do servidor SSH \ No newline at end of file diff --git a/options/locale/locale_he.ini b/options/locale/locale_he.ini new file mode 100644 index 0000000000..bff7682a95 --- /dev/null +++ b/options/locale/locale_he.ini @@ -0,0 +1,666 @@ + + + +[common] +webauthn_error_unable_to_process = שרת ×–×” נכשל בעיבוד בקשתך. +help = עזרה +logo = לוגו +sign_in_with_provider = כניסה דרך %s +sign_in_or = ×ו +sign_out = יצי××” מהחשבון +sign_up = הרשמה +link_account = חיבור חשבון +register = הרשמה +version = גרסה +page = דף +template = תבנית +language = שפה +notifications = הודעות +active_stopwatch = סטופר +create_new = חדש… +user_profile_and_more = פרופיל והגדרות… +signed_in_as = ×©×œ×•× +enable_javascript = ×תר ×–×” משתמש בJavaScript. +toc = תוכן ×”×¢× ×™× ×™× +licenses = רישיונות +return_to_forgejo = חזרה לפורג'ו +more_items = עוד ×פשרויות +username = ×©× ×ž×©×ª×ž×© +email = כתובת ×ימייל +password = סיסמה +access_token = קוד גישה +captcha = CAPTCHA +twofa_scratch = קוד ×ימות דו־שלבי +passcode = קוד כניסה +webauthn_error_unknown = שגי××” ×œ× ×™×“×•×¢×”, ×פשר לנסות שוב. +webauthn_error_empty = ×©× ×”×ž×¤×ª×— ×”×•× ×©×“×” חובה. +webauthn_error_timeout = קרי×ת מפתחך לקחה יותר מדי זמן. ×פשר לטעון מחדש ×ת הדף ולנסות שוב. +organization = ×רגון +mirror = מר××” +new_mirror = מר××” חדשה +new_fork = מזלוג חדש של קרפיף ×–×” +new_project = פרויקט חדש +new_project_column = עמודה חדשה +admin_panel = לוח ניהול מערכת +your_profile = פרופיל +your_starred = כיכבת +new_org.title = ×רגון חדש +all = הכל +sources = מקורות +collaborative = שיתופי +forks = ×ž×–×œ×•×’×™× +issues = סוגיות +milestones = מטרות +ok = ×ישור +cancel = ביטול +rerun = הרצה חוזרת +add = הוספה +remove_all = הסרת הכל +edit = עריכה +locked = נעול +copy = העתקה +copy_url = העתקת קישור +copy_hash = העתקת קוד גיבוב +copy_branch = העתקת ×©× ×¢× ×£ +copy_success = הועתק! +write = כתיבה +preview = תצוגה מקדימה +loading = נטען… +error = שגי××” +error404 = דף ×–×” ×œ× ×§×™×™× ×ו ש×ין לך ×ילו גישה. +never = ××£ ×¤×¢× +unknown = ×œ× ×™×“×•×¢ +rss_feed = פיד RSS +pin = הצמדה +archived = ×רכיון +concept_user_organization = ×רגון +show_full_screen = מסך ×ž×œ× +confirm_delete_selected = למחוק ×ת כל ×”×¤×¨×™×˜×™× ×”×ž×¡×•×ž× ×™×? +name = ×©× +value = ערך +filter = מסנן +filter.clear = ניקוי ×ž×¡× × ×™× +filter.is_archived = ב×רכיון +filter.not_archived = מחוץ ל×רכיון +filter.not_fork = ×œ×”×•×¦×™× ×ž×–×œ×•×’×™× +filter.is_mirror = רק מר×ות +filter.not_mirror = ×œ×”×•×¦×™× ×ž×¨×ות +filter.not_template = ×œ×”×•×¦×™× ×ª×‘× ×™×•×ª +filter.public = ציבורי +filter.private = פרטי +home = בית +sign_in = כניסה +remove = הסרה +test = בדיקה +copy_error = העתקה נכשלה +go_back = ×חורה +unpin = ביטול הצמדה +show_timestamps = הצגת ×–×ž× ×™× +show_log_seconds = הצגת שניות +download_logs = הורדת ×œ×•×’×™× +filter.is_fork = רק ×ž×–×œ×•×’×™× +filter.is_template = רק תבניות +twofa = ×ימות דו־שלבי +pull_requests = בקשות מיזוג +powered_by = רץ על %s +copy_generic = העתקה לCtrl + C +webauthn_unsupported_browser = הדפדפן שלך ×œ× ×ª×•×ž×š בWebAuthn. +webauthn_error_insecure = הפרוטוקול WebAuthn ×œ× ×ª×•×ž×š ×‘×—×™×‘×•×¨×™× ×œ× ×ž×ובטחי×, למעט דרך "localhost" ×ו "127.0.0.1" +settings = הגדרות +your_settings = הגדרות +new_org.link = ×רגון חדש +mirrors = מר×ות +activities = פעילויות +retry = לנסות שוב +save = שמירה +add_all = הוספת הכל +copy_content = העתקת תוכן +copy_type_unsupported = ××™ ×פשר להעתיק ×§×‘×¦×™× ×ž×¡×•×’ ×–×” +concept_system_global = גלובלי +concept_user_individual = ×ישי +webauthn_insert_key = יש להכניס ×ת מפתח ×בטחך +webauthn_press_button = × × ×œ×œ×—×•×¥ על הכפתור שעל מפתח ×”×בטחה… +webauthn_error = קרי×ת מפתח ×”×בטחה נכשלה. +repository = קרפיף +new_repo.title = קרפיף חדש +new_migrate.title = ×™×‘×•× ×§×¨×¤×™×£ +new_repo.link = קרפיף חדש +new_migrate.link = ×™×‘×•× ×§×¨×¤×™×£ +enabled = מופעל +disabled = כבוי +copy_path = העתקת ×ž×™×§×•× ×§×•×‘×¥ +invalid_data = הבנת הקלט נכשלה: %v +concept_code_repository = קרפיף +webauthn_sign_in = יש ללחוץ על הכפתור שעל מפתח ×”×בטחה. ×× ×ין כפתור, ×פשר ×œ×”×•×¦×™× ×ת המפתח ולחבר ×ותו שוב. +webauthn_error_duplicated = מפתח ×”×בטחה ×œ× ×™×›×•×œ לשמש לבקשה זו. × × ×œ×•×•×“× ×©×”×ž×¤×ª×— ×œ× ×¨×©×•×. +dashboard = מבט על +remove_label_str = הסרת "%s" +explore = ×§×˜×œ×•×’×™× +view = עוד מידע +artifacts = ××¨×˜×™×¤×§×˜×™× +confirm_delete_artifact = למחוק ×ת ×”×רטיפקט "%s"? +toggle_menu = הצגת\הסתרת תפריט +re_type = סיסמה (שוב) + +[search] +search = חיפוש... +type_tooltip = סוג חיפוש +fuzzy = מקורב +union = מילות מפתח +exact = מדויק +exact_tooltip = תוצ×ות ית×ימו במדויק לתוכן תיבת החיפוש +regexp = רג'קס +user_kind = חיפוש ×נשי×... +code_kind = חיפוש קוד... +team_kind = חיפוש צוותי×... +no_results = ×œ× × ×ž×¦×ו תוצ×ות. +union_tooltip = תוצ×ות יכללו לפחות מילת מפתח ×חת; ×פשר להפריד מילות מפתח ×¢× ×¨×•×•×—×™× +org_kind = חיפוש ×רגוני×... +package_kind = חיפוש חבילות... +project_kind = חיפוש פרוייקטי×... +branch_kind = חיפוש ענפי×... +commit_kind = חיפוש קומיטי×... +issue_kind = חיפוש סוגיות... +fuzzy_tooltip = תוצ×ות ית×ימו לתוכן תיבת החיפוש בקירוב; מומלץ כנגד שגי×ות כתיב +repo_kind = חיפוש קרפיפי×... +code_search_by_git_grep = תוצ×ות החיפוש יוצרו על ידי "git grep"; יכול להיות שיתקבלו תוצ×ות טובות יותר ×× ×ž× ×”×œ×™ המערכת יפעילו ×ת המפתחן. +runner_kind = חיפוש מריצי×... +keyword_search_unavailable = חיפוש מילות מפתח ×œ× ×–×ž×™×Ÿ. × × ×œ×“×•×•×— למנהלי המערכת. +code_search_unavailable = חיפוש קוד ×œ× ×–×ž×™×Ÿ. × × ×œ×“×•×•×— למנהלי המערכת. +pull_kind = חיפוש בקשות מיזוג... + +[heatmap] +number_of_contributions_in_the_last_12_months = % תרומות ב־12 ×”×—×•×“×©×™× ×”××—×¨×•× ×™× +contributions_zero = ×פס תרומות +contributions_format = {contributions} ב{day} ל{month} {year} +contributions_one = תרומה +contributions_few = תרומות +less = פחות +more = יותר + +[error] +server_internal = שגי×ת שרת פנימית +not_found = המטרה ×œ× × ×ž×¦××”. +network_error = שגי×ת ×ינטרנט +occurred = קרתה שגי××” + +[startpage] +lightweight = קל +install = קל להתקנה +license = קוד פתוח +platform_desc = פורג'ו רץ על מערכות הפעלה פתוחות כמו לינוקס וFreeBSD, ועל ×רכיטקטורות מעבד שונות. +lightweight_desc = פורג'ו צורך כמות מינימלית של מש××‘×™× ×•×™×›×•×œ לרוץ על ×ž×™× ×™Ö¾×ž×—×©×‘×™× ×œ× ×™×§×¨×™× ×›×ž×• הר×ספרי הפיי. + +[editor] +buttons.list.unordered.tooltip = הוספת רשימה ×œ× ×ž×ž×•×¡×¤×¨×ª +buttons.switch_to_legacy.tooltip = מעבר לעורך הישן +buttons.heading.tooltip = הוספת כותרת +buttons.bold.tooltip = הדגשת טקסט +buttons.italic.tooltip = הטיית טקסט +buttons.quote.tooltip = ציטוט +buttons.code.tooltip = הוספת קוד +buttons.link.tooltip = הוספת קישור +buttons.list.ordered.tooltip = הוספת רשימה ממוספרת +buttons.list.task.tooltip = הוספת רשימת משימות +buttons.mention.tooltip = תיוג ××“× ×ו צוות +buttons.ref.tooltip = ריפרור לסוגיה ×ו בקשת מיזוג +buttons.enable_monospace_font = הפעלת גופן קבוע־רוחב +buttons.disable_monospace_font = כיבוי גופן קבוע־רוחב +buttons.new_table.tooltip = הוספת טבלה +table_modal.header = הוספת טבלה +table_modal.placeholder.header = כותרת +table_modal.placeholder.content = תוכן +table_modal.label.rows = שורות +table_modal.label.columns = עמודות + +[filter] +string.desc = סדר ×לפבתי יורד +string.asc = סדר ×לפבתי עולה + +[install] +db_schema_helper = תוכן ריק משמע ערך ברירת המחדל ("public") של מסד המידע. +title = הגדרה ר×שונית +install = התקנה +db_title = הגדרות מסד מידע +db_type = סוג מסד מידע +user = ×©× ×ž×©×ª×ž×© +password = סיסמה +db_name = ×©× ×ž×¡×“ המידע +db_schema = סכימה +ssl_mode = SSL +err_empty_admin_password = סיסמה של מנהל מערכת ×œ× ×™×›×•×œ×” להיות ריקה. +err_empty_admin_email = כתובת ×ימייל של מנהל מערכת ×”×™× ×—×•×‘×”. +general_title = הגדרות כלליות +app_name = ×©× ×©×¨×ª ×–×” +err_empty_db_path = הכתובת למסד המידע SQLite3 ×œ× ×™×›×•×œ×” להיות ריקה. +err_admin_name_is_reserved = ×©× ×ž×©×ª×ž×© חשבון המערכת ×œ× ×–×ž×™×Ÿ, ×©× ×”×ž×©×ª×ž×© שמור +err_admin_name_is_invalid = ×©× ×ž×©×ª×ž×© מנהל המערכת ×œ× ×–×ž×™×Ÿ +domain = דומיין השרת +domain_helper = דומיין ×ו host address לשרת ×–×”. +http_port = פורט ×”Ö¾HTTP (×”××–× ×”) +http_port_helper = הפורט שישמש ×ת דף ×”×ינטרנט (×–×” שדפדפני ×ינטרנט × ×™×’×©×™× ×ליו). +app_url = כתובת (URL) בסיס +log_root_path_helper = ×™×•×ž× ×™× (logfiles) ייוצ×ו לתיקייה זו. +optional_title = הגדרות ×œ× ×—×•×‘×” +email_title = הגדרות ×ימייל +smtp_from = ××™×ž×™×™×œ×™× ×™×©×œ×—×• ×›Ö¾ +register_confirm = ×ישור ×ימייל חובה ×œ×¨×™×©×•× +mail_notify = הפעלת נוטיפיקציות דרך ×ימייל +offline_mode = הפעלת מצב לוק×לי +disable_registration = השבתת הרשמה עצמית +allow_only_external_registration = ×פשור הרשמה רק דרך ×©×™×¨×•×ª×™× ×—×™×¦×•× ×™×™× +openid_signup.description = חשבונות יוכלו להיווצר דרך OpenID ×× ×”×¨×©×ž×” עצמית מופעלת. +enable_captcha.description = כדי ליצור חשבונות חדשי×, ×™×”×™×” צריך לעבור ×תגר CAPTCHA (טוב כנגד ספ×× ×•×‘×•×˜×™×; פוגע בנגישות ופחות ×פקטיבי כנגד AI מודרני). +default_keep_email_private = הסתרת כתובות ×ימייל כברירת מחדל +default_allow_create_organization = ×פשור יצירת ××¨×’×•× ×™× ×›×‘×¨×™×¨×ª מחדל +default_enable_timetracking = הפעלת מדידת זמן כברירת מחדל +admin_title = הגדרות חשבון מנהל מערכת +admin_name = ×©× ×ž×©×ª×ž×© של מנהל מערכת +admin_password = סיסמה +install_btn_confirm = ×¡×™×•× ×”×ª×§× ×ª פורג'ו +test_git_failed = בדיקת פקודת "git" נכשלה: %v +sqlite3_not_available = גרסת פורג'ו זו ×œ× ×ª×•×ž×›×ª ב־SQLite3. × × ×œ×”×•×¨×™×“ ×ת ×”×רטיפקט הרשמי מ %s (*ל×* ×ת גרסת ×”"gobuild"). +invalid_db_setting = הגדרות מסד המידע שגויות: %v +invalid_db_table = טבלת מסד המידע "%s" שגויה: %v +run_user = משתמש שפורג'ו ירוץ תחת +mailer_password = סיסמת שרת ×”Ö¾SMTP +mailer_user = ×©× ×ž×©×ª×ž×© בשרת ×”Ö¾SMTP +federated_avatar_lookup = הפעלת תמונות פרופיל מבוזרות +disable_gravatar = השבתת Gravatar +disable_gravatar.description = שימוש בגר×ווט×ר, ×ו כל מקור צד־שלישי ×חר לתמונות פרופיל, יושבת. ××œ× ×× ×›×Ÿ לחשבון יש תמונה שהועלתה ידנית, פורג'ו ישתמש בתמונות ברירת המחדל הלוק×ליות. +openid_signin = הפעלת כניסה דרך OpenID +no_admin_and_disable_registration = ××™ ×פשר ×œ×—×¡×•× ×”×¨×©×ž×” עצמית בלי ליצור חשבון מנהל מערכת. +app_name_helper = ×©× ×”×תר נכנס ×›×ן. ×”×•× ×™×•×¦×’ בכל ×ž×§×•× ×‘×תר, בצד ימין למעלה (×ו ב×נגלית, שמ×ל למעלה). +app_slogan = סלוגן ×”×תר +app_slogan_helper = סלוגן ×”×תר נכנס ×›×ן. פורג'ו ×™×ª×¢×œ× ×ž×¡×œ×•×’×Ÿ ריק. +ssh_port = פורט שרת ×”Ö¾SSH +ssh_port_helper = מספר הפורט ששרת ×”Ö¾SSH ישתמש בו. ערך ריק יכבה ×ת התמיכה ב־SSH. +smtp_addr = שרת SMTP +smtp_from_helper = כתובת ×”×ימייל שפורג'ו ישלח ממנה הודעות למשתמשי×. ×פשר להכניס כתובת ×מייל פשוטה ×ו להישמתש בפורמט "ש×" <×ימייל@דוגמה.קו×>. +server_service_title = הגדרות שרת ×•×©×™×¨×•×ª×™× ×¦×“ שלישי +offline_mode.description = CDNÖ¾×™× ×¦×“ שלישי יושבתו וכל המש××‘×™× ×™×•×’×©×• מהמחשב הנוכחי, ×œ×œ× ×’×™×©×” ל×ינטרנט. +disable_registration.description = רק מנהלי מערכת יוכלו ליצור חשבונות משתמש חדשי×. מ×וד ×œ× ×ž×•×ž×œ×¥ להפעיל הרשמה עצמית ××œ× ×× ×›×Ÿ בכוונתך ליצור שרת ציבורי, דבר הכולל התעסקות בכמויות עצומות של ספ×× ×•×”×ª×§×¤×•×ª DDoS. +allow_only_external_registration.description = חשבונות ×—×“×©×™× ×œ× ×™×›×•×œ×• להיווצר לוק×לית, ××œ× ×¨×§ דרך ×©×™×¨×•×ª×™× ×¦×“Ö¾×©×œ×™×©×™ שקונפגו מר×ש. +openid_signup = הפעלת הרשמה עצמית דרך OpenID +enable_captcha = הפעלת CAPTCHA בתהליך ×”×¨×™×©×•× +require_sign_in_view = שרת פרטי +require_sign_in_view.description = גישה לתוכן השרת ×ª×™×—×¡× ×œ×œ× ×›× ×™×¡×” לחשבון, למעט דפי ×”×¨×™×©×•× ×•×”×›× ×™×¡×”. +default_keep_email_private.description = כתובות ×”×ימייל של חשבונות ×—×“×©×™× ×œ× ×™×•×¦×’×• על ×”×¤×¨×•×¤×™×œ×™× ×”×¦×™×‘×•×¨×™×™× ×©×œ×”× (××œ× ×× ×›×Ÿ ישנו ×–×ת בעצמ×), כדי למנוע זליגה של מידע פרטי מיד ל×חר ההרשמה. +default_allow_create_organization.description = חשבונות ×—×“×©×™× ×™×•×›×œ×• ליצור ××¨×’×•× ×™× ×œ×œ× ×ישור מנהל המערכת. +err_admin_name_pattern_not_allowed = ×©× ×ž×©×ª×ž×© מנהל המערכת ×œ× ×–×ž×™×Ÿ, ×©× ×”×ž×©×ª×ž×© עונה על תבנית שמורה +run_user_helper = ×©× ×”×ž×©×ª×ž×© של משתמש מערכת ההפעלה שפורג'ו ירוץ תחתיו. למשתמש חייבת להיות גישה לקרפיפי×. +log_root_path = כתובת לוגינג +smtp_port = פורט SMTP +default_enable_timetracking.description = תכונת מדידת הזמן של פורג'ו תופעל ×œ×§×¨×¤×™×¤×™× ×—×“×©×™× ×›×‘×¨×™×¨×ª מחדל. +admin_setting.description = יצירת חשבון מנהל המערכת ×”×™× ×œ× ×—×•×‘×”; ×œ×œ× ×—×©×‘×•×Ÿ מורשה, החשבון הר×שון שיווצר יקבל הרש×ות ×דמיניסטרציה. +config_location_hint = הגדרות ×לו ישמרו ב־: +confirm_password = סיסמה (שוב) +admin_email = כתובת ×ימייל +require_db_desc = פורג'ו דורש MySQL, PostgreSQL, ×ו TiDB (דרך פרוטוקול MySQL). + +[aria] +navbar = סרגל הניווט +footer.software = על תוכנה זו +footer.links = ×§×™×©×•×¨×™× +footer = סיומת עמוד + +[mail] +repo.transfer.subject_to_you = %s רוצה להעביר ×ת הקרפיף "%s" ×ליך +repo.collaborator.added.text = הוספת בתור פועל לקרפיף: +issue_assigned.issue = @%[1]s שייך ×ותך לסוגיה %[2]s בקרפיף %[3]s. +issue_assigned.pull = @%[1]s שייך ×ותך לבקשת המיזוג %[2]s בקרפיף %[3]s. +repo.transfer.subject_to = %s רוצה להעביר ×ת הקרפיף "%s" ל־%s + +[form] +RepoName = ×©× ×§×¨×¤×™×£ +repository_force_private = פרטיות כפויה מופעלת: ×§×¨×¤×™×¤×™× ×¤×¨×˜×™×™× ×œ× ×™×›×•×œ×™× ×œ×”×¢×©×•×ª ציבוריי×. +repo_name_been_taken = כבר יש קרפיף ×‘×©× ×–×”. +repository_files_already_exist = כבר יש ×§×‘×¦×™× ×‘×§×¨×¤×™×£ ×–×”. יש לדבר ×¢× ×ž× ×”×œ המערכת כדי לתקן ×ת הבעיה. +AccessToken = קוד גישה +Content = תוכן +SSPIDefaultLanguage = שפת ברירת מחדל + +[projects] +deleted.display_name = פרויקט נמחק + +[home] +my_repos = ×§×¨×¤×™×¤×™× +my_orgs = ××¨×’×•× ×™× +show_archived = ב×רכיון +show_only_unarchived = ×œ× ×›×•×œ×œ ×ת ×”×רכיון +show_private = פרטי +filter_by_team_repositories = סינון לפי קרפיפי צוות +uname_holder = ×©× ×ž×©×ª×ž×© ×ו כתובת ×ימייל +filter = ×ž×¡× × ×™× ××—×¨×™× +feed_of = פיד של "%s" +show_both_archived_unarchived = כולל ×’× ×ž×ª×•×š ×•×’× ×ž×—×•×¥ ×”×רכיון +show_only_archived = כולל רק מה×רכיון +issues.in_your_repos = בקרפיפיך + +[explore] +repos = ×§×¨×¤×™×¤×™× +stars_one = כוכב ×חד +stars_few = %d ×›×•×›×‘×™× +code = קוד +code_last_indexed_at = ×ונדקס ל×חרונה %s +users = ×× ×©×™× +forks_few = %d ×ž×–×œ×•×’×™× +organizations = ××¨×’×•× ×™× +relevant_repositories_tooltip = ×ž×–×œ×•×’×™× ×•×§×¨×¤×™×¤×™× ×œ×œ× ×ª×™×ור, נוש×, וסמל ×œ× ×ž×•×¦×’×™×. +relevant_repositories = רק ×§×¨×¤×™×¤×™× ×¨×œ×•×•× ×˜×™× ×ž×•×¦×’×™×; ×פשר להציג תוצ×ות ×œ× ×ž×¡×•× × ×•×ª. +forks_one = מזלוג ×חד + +[auth] +change_unconfirmed_email_error = שינוי כתובת ×”×ימייל כשל: %v +resend_mail = שליחת מייל ×ימות חדש +send_reset_mail = שליחת מייל שחזור חשבון +reset_password = שחזור חשבון +invalid_code = קוד ×”×ימות שלך ×œ× ×ª×§×£, ×ו שעבר יותר מדי זמן מ××– שהונפק. +invalid_password = הסיסמה ×œ× ×ª×•×מת ×ת הסיסמה ש×יתה יצרת ×ת חשבונך. +reset_password_helper = שחזור חשבון +reset_password_wrong_user = נכנסת ×›Ö¾%s, ×בל הקישור נועד לשחזור החשבון של %s +password_too_short = הסיסמה חייבת להיות ב×ורך %d ×ª×•×•×™× ×•×ž×¢×œ×”. +non_local_account = חשבונות ×־לוק××œ×™×™× ×œ× ×™×›×•×œ×™× ×œ×¢×“×›×Ÿ ×ת ×¡×™×¡×ž×ª× ×“×¨×š ×תר ×”×ינטרנט של פורג'ו. +verify = ×ימות +use_onetime_code = שימוש בקוד חד־פעמי +disable_register_mail = ×ישור הרשמה דרך ×ימייל מושבת. +remember_me = ×–×” המכשיר שלי ו×× ×™ רוצה לשמור עליו ×ת הסיסמה שלי ×œ×¤×¢× ×”×‘××” +hint_login = כבר יש לך חשבון? כניסה +sign_up_successful = החשבון נוצר בהצלחה. ×‘×¨×•×›×™× ×”×‘××™×! +create_new_account = הרשמה +disable_register_prompt = הרשמה מושבתת. יש לדבר ×¢× ×ž× ×”×œ×™ המערכת. +manual_activation_only = יש לדבר ×¢× ×ž× ×”×œ×™ המערכת כדי ×œ×”×©×œ×™× ×ת הפעלת חשבונך. +forgot_password_title = שכחתי ×ת הסיסמה +sign_up_button = הרשמה +must_change_password = עדכן סיסמתך +prohibit_login = חשבונך הושעה +change_unconfirmed_email = ×× × ×ª×ª ×ת כתובת ×”×ימייל ×”×œ× × ×›×•× ×” כשנרשמת, ×פשר לשנות ×ותה ×›×ן, ומייל ×ימות חדש ישלח לכתובת החדשה. +forgot_password = שכחת ×ת הסיסמה? +hint_register = ×ין לך חשבון? הרשמה +active_your_account = הפעלת חשבונך +prohibit_login_desc = חשבנוך הושעה משרת ×–×”. ×פשר לבקש ממנהלי המערכת לתת לך גישה. +invalid_code_forgot_password = קוד ×”×ימות שלך ×œ× ×ª×§×£, ×ו שעבר יותר מדי זמן מ××– שהונפק. ×פשר לנסות שוב. +allow_password_change = הכרחת המשתמש לעדכן ×ת סיסמת חשבונו (מומלץ) +account_activated = חשבונך הופעל +resent_limit_prompt = כבר ביקשת מייל ×ימות בשלושת הדקות ×”×חרונות. × × ×œ×—×›×•×ª ולנסות שוב. +has_unconfirmed_mail = ×©×œ×•× %s, חשבונך משויך לכתובת ×ימייל ×œ× ×ž×ומתת (%s). ×× ×œ× ×§×™×‘×œ×ª הודעת ×ימות ב×ימייל, ×ו ש×תה צריך חדשה, × × ×œ×œ×—×•×¥ על הכפתור למטה. + +[settings] +key_content = תוכן +principal_content = תוכן +add_gpg_key_success = מפתח ×”Ö¾GPG "%s" הוסף לחשבונך. +gpg_key_deletion_success = מפתח ×”Ö¾GPG הוסר מחשבונך. +valid_until_date = תקף עד ×”Ö¾%s +can_write_info = שינוי +ssh_disabled = SSH מושבת +ssh_externally_managed = מפתח SSH ×–×” מנוהל חיצונית +repo_and_org_access = גישה ×œ×§×¨×¤×™×¤×™× ×•××¨×’×•× ×™× +permissions_public_only = ציבורי בלבד +permissions_access_all = הכל (ציבורי, פרטי, מוגבל) +manage_access_token = קודי גישה +generate_new_token = קוד גישה חדש +token_name = ×©× ×§×•×“ הגישה +access_token_deletion = מחיקת קוד גישה +delete_token_success = קוד הגישה נמחק. ×פליקציות שהשתמשו בו ×œ× ×™×›×•×œ×•×ª לגשת לחשבון שלך יותר. +permission_no_access = ×©×•× ×’×™×©×” +permission_read = קרי××” +permission_write = קרי××” ושינוי +permissions_list = הרש×ות: +edit_oauth2_application = עריכת ×פליקצית OAuth2 +remove_oauth2_application = הסרת ×פליקצית OAuth2 +remove_oauth2_application_success = ×”×פליקציה נמחקה. +create_oauth2_application_button = יצירת ×פליקציה +create_oauth2_application_success = יצרת ×פליקציית OAuth2 חדשה בהצלחה. +update_oauth2_application_success = ערכת ×פליקציית OAuth2 בהצלחה. +oauth2_application_name = ×©× ×”×פליקציה +oauth2_redirect_uris = קישורי הפניה מחדש. כל קישור בשורה משל עצמו. +save_application = שמירה +oauth2_application_edit = עריכה +revoke_oauth2_grant = הסרת גישה +ssh_key_deletion_success = מפתח ×”Ö¾SSH הוסר מחשבונך. +delete_key = הסרה +ssh_key_deletion = הסרת מפתח SSH +gpg_key_deletion = הסרת מפתח GPG +ssh_key_deletion_desc = הסרת מפתח SSH מבטלת ×ת גישתו לחשבונך. להמשיך? +gpg_key_deletion_desc = הסרת מפתח GPG הופכת ×§×•×ž×™×˜×™× ×©× ×—×ª×ž×• בעזרתו לל×־מ×ומתי×. להמשיך? +show_openid = הצגה על פרופילך +hide_openid = הסתרה מפרופילך +generate_token_name_duplicate = כבר קיימת ×פליקציה ×‘×©× %s. +delete_token = מחיקה +generate_token_success = קוד הגישה החדש נוצר, ×•×œ× ×™×•×¦×’ שוב. +add_key_success = מפתח ×”Ö¾SSH "%s" הוסף לחשבונך. +added_on = הוסף ב־%s +last_used = שומש ל×חרונה ב +select_permissions = בחירת הרש×ות +key_name = ×©× ×”×ž×¤×ª×— +key_state_desc = מפתח ×–×” שומש בשבוע ×”×חרון +ssh_signonly = SSH מושבת; מפתחות ×לו ישמשו רק כדי ×œ×—×ª×•× ×§×•×ž×™×˜×™×. +manage_oauth2_applications = ניהול ×פליקציות OAuth2 +create_oauth2_application = יצירת ×פליקציית OAuth2 חדשה +can_read_info = קרי××” +valid_forever = תקף לנצח +revoke_key = הסרת גישה +at_least_one_permission = קודי גישה ×¦×¨×™×›×™× ×œ×¤×—×•×ª הרש××” ×חת +access_token_deletion_desc = ×פליקציות שמשתמשות בקוד הגישה ×”×–×” ×œ× ×™×•×›×œ×• לגשת לחשבון שלך יותר. זוהי פעולה בלתי־הפיכה. להמשיך? +delete_account = מחיקת החשבון +confirm_delete_account = כן, ×× ×™ רוצה למחוק ×ת החשבון שלי +delete_account_desc = למחוק ×ת חשבון משתמש ×–×” לנצח? +email_notifications.enable = הפעלת הודעות ×ימייל +email_notifications.disable = השבתת הודעות ×ימייל +email_notifications.submit = בחירת ×ימייל מועדף +visibility.public = ציבורי +visibility = סוג חשבון +visibility.public_tooltip = נגיש ×œ×›×•×œ× +visibility.limited = מוגבל +visibility.limited_tooltip = נגיש רק למי שיש לו חשבון +visibility.private = פרטי +blocked_since = ×—×¡×•× ×›×‘×¨ %s +user_block_success = המשתמש נחס×. +user_unblock_success = החסימה בוטלה. +user_block_yourself = ××™ ×פשר ×œ×—×¡×•× ×ת החשבון של עצמך. +delete_prompt = פעולה זו בלתי הפיכה ותמחוק ×ת החשבון שלך לחלוטין. +email_notifications.onmention = שליחת ××™×ž×™×™×œ×™× ×¨×§ עבור ×זכור (mention\ping) מפורש +delete_account_title = מחייקת חשבון משתמש +visibility.private_tooltip = נגיש רק למי שחבר ב×רגון ש×תה חלק ממנו +delete_with_all_comments = חשבונך נוצר לפני פחות מ־%s; כל התגובות שלך (לסוגיות, בקשות מיזוג, וכולי) ימחקו. +update_avatar = עדכון תמונת פרופיל +delete_current_avatar = מחיקת תמונת הפרופיל הנוכחית +uploaded_avatar_not_a_image = הקובץ שהועלה ×œ× ×ª×ž×•× ×”. + +[repo] +new_advanced = הגדרות מתקדמות +new_advanced_expand = +owner = ×‘×¢×œ×™× +repo_name = ×©× ×”×§×¨×¤×™×£ +repo_name_helper = שמות ×§×¨×¤×™×¤×™× ×˜×•×‘×™× ×”× ×–×›×™×¨×™×, ×§×¦×¨×™× ×•×™×™×—×•×“×™×™×. +fork_branch = ×”×¢× ×£ שיועתק למזלוג +all_branches = כל ×”×¢× ×¤×™× +use_template = קרפיף חדש מתבנית זו +repo_desc = תי×ור +repo_desc_helper = תי×ור קצר (×œ× ×—×•×‘×”) +issue_labels = תוויות +issue_labels_helper = תוויות לדוגמה נפוצות ומומלצות ש×פשר להת××™× ×œ×“×¨×™×©×•×ª הפרויקט הספציפי +license = רישיון +license_helper_desc = רישיונות מכתיבות מה ××—×¨×™× ×™×›×•×œ×™× ×•×œ× ×™×›×•×œ×™× ×œ×¢×©×•×ª ×¢× ×”×§×•×“ שלך. ×יך לבחור רישיון? +object_format = ××œ×’×•×¨×™×ª× ×’×™×‘×•×‘ +readme = קר×Ö¾×ותי +readme_helper = תבנית קובץ קר×Ö¾×ותי (README) +readme_helper_desc = ×›×ן ×פשר לכתוב ×ת התי×ור ×”×ž×œ× ×©×œ הפרויקט שלך, וכל דבר שברצונך ש×× ×©×™× ×™×“×¢×• עליו. +auto_init = תיחול הקרפיף +auto_init_description = פורג'ו מ×פשר להוסיף קבצי קר×Ö¾×ותי, .gitignore, ורשיונות בקומיט הר×שון של הקרפיף שלך. +create_repo = קרפיף חדש +mirror_public_key = מפתח SSH ציבורי +mirror_use_ssh.not_available = ×ימות על־בסיס SSH ×œ× ×–×ž×™×Ÿ. +mirror_denied_combination = ××™ ×פשר להשתמש ב×ימות על־בסיס ×’× ×¡×™×¡×ž×” ×•×’× ×ž×¤×ª×— ציבורי; חובה לבחור רק ב×פשרות ×חת. +mirror_sync = מסונכרן +mirror_address = שכפול מכתובת ×ינטרנט (URL) +mirror_lfs_desc = שיקוף ×חסון ×§×‘×¦×™× ×’×“×•×œ×™× (LFS) +mirror_last_synced = סונכרן ל×חרונה +stargazers = ×ž×›×›×‘×™× +forks = ×ž×™×–×œ×•×’×™× +stars = ×›×•×›×‘×™× +reactions_more = ועוד %d +unit_disabled = מנהלי המערכת השביתו תכונת קרפיף ×–×ת. +language_other = ×חרת +adopt_preexisting_content = קרפיף חדש מ־â€%s +delete_preexisting_label = מחיקה +delete_preexisting = מחיקת ×§×‘×¦×™× ×§×™×™×ž×™× +delete_preexisting_content = מחיקת ×§×‘×¦×™× ×‘Ö¾%s +summary_card_alt = קלף תקציר הקרפיף %s +tree_path_not_found_branch = הכתובת %[1]s ×œ× ×§×™×™×ž×ª בענף %[2]s +transfer.accept = ×ישור העברת הקרפיף +tree_path_not_found_tag = הכתובת %[1]s ×œ× ×§×™×™×ž×ª בתגית %[2]s +transfer.reject = דחיית העברת הקרפיף +transfer.reject_desc = ביטול העברת הקרפיף ל־"%s" +transfer.no_permission_to_reject = ×ין לך הרש××” לדחות ×ת העברת הקרפיף הזו. +desc.private = פרטי +desc.public = ציבורי +desc.internal = פנימי +desc.archived = ב×רכיון +archive.issue.nocomment = קרפיף ×–×” ב×רכיון. ××™ ×פשר להגיב לסוגיות. +archive.pull.noreview = קרפיף ×–×” ב×רכיון. ××™ ×פשר לבקר בקשות מיזוג. +form.reach_limit_of_creation_n = החשבון של ×”×‘×¢×œ×™× ×›×‘×¨ ×”×’×™×¢ לכמות ×”×§×¨×¤×™×¤×™× ×”×ž×§×¡×™×ž×œ×™×ª (%s). +form.name_reserved = ×©× ×”×§×¨×¤×™×£ "%s" שמור. +migrate_items_wiki = ויקי +migrate_items_issues = סוגיות +migrate_items_pullrequests = בקשות מיזוג +migrate.clone_address = ×™×™×‘×•× \ שכפול מ־URL +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.git.description = ×™×™×‘×•× ×§×¨×¤×™×£ מכל שירות גיט שהו×. +migrate.forgejo.description = ×™×™×‘×•× ×ž×™×“×¢ מקודברג ×ו שרת פורג'ו ×חר. +migrate.gitea.description = ×™×™×‘×•× ×ž×™×“×¢ מ־gitea.com ×ו שרת גיט××” ×חר. +migrate.gogs.description = ×™×™×‘×•× ×ž×™×“×¢ מ־notabug.org ×ו שרת גוגס ×חר. +migrate.onedev.description = ×™×™×‘×•× ×ž×™×“×¢ מ־code.onedev.io ×ו שרת OneDev ×חר. +migrate.codebase.description = ×™×™×‘×•× ×ž×™×“×¢ מ־codebasehq.com. +migrate.migrating_topics = ×™×™×‘×•× × ×•×©××™× +migrate.migrating_milestones = ×™×™×‘×•× ×בני דרך +editor.delete_this_file = מחיקת קובץ +editor.name_your_file = ×©× ×”×§×•×‘×¥â€¦ +editor.or = ×ו +editor.cancel_lower = ביטול +editor.add_tmpl = הוספת "<%s>" +editor.add_tmpl.filename = ×©× ×”×§×•×‘×¥ +editor.add = הוספתי ×ת %s +editor.update = עידכנתי ×ת %s +editor.delete = מחקתי ×ת %s +editor.propose_file_change = הצעת השינוי +editor.directory_is_a_file = ××™ ×פשר ליצור ×ת התיקייה "%s"; כבר ×§×™×™× ×§×•×‘×¥ תחת ×ותו ש×. +default_branch_label = ברירת מחדל +default_branch = ×¢× ×£ ברירת המחדל +migrate_options_mirror_helper = קרפיף ×–×” ×™×”×™×” מר××” +migrate_options_lfs = ×™×™×‘×•× ×חסון ×§×‘×¦×™× ×’×“×•×œ×™× (LFS) +migrate_options = ×פשרויות ×™×™×‘×•× +migrate.migrating_labels = ×™×™×‘×•× ×ª×•×•×™×•×ª +migrate.migrating_releases = ×™×™×‘×•× ×’×¨×¡×ות +editor.file_delete_success = הקובץ "%s" נמחק. +editor.commit_message_desc = תי×ור ×רוך ×œ× ×—×•×‘×”â€¦ +already_forked = כבר מזלגת ×ת %s +download_tar = הורדה ×›Ö¾.tag.gz +open_with_editor = פתיחה ×¢× %s +download_zip = הורדה ×›Ö¾.zip +repo_lang = שפה +repo_gitignore_helper = תבנית .gitignore +editor.new_branch_name_desc = ×©× ×”×¢× ×£ החדש… +editor.cancel = ביטול +editor.filename_cannot_be_empty = ×©× ×”×§×•×‘×¥ ×œ× ×™×›×•×œ להיות ריק. +editor.new_branch_name = ×©× ×”×¢× ×£ ש×ליו הקומיט ידחף +editor.filename_is_invalid = ×©× ×”×§×•×‘×¥ ×œ× ×ª×§×™×Ÿ: "%s". +editor.invalid_commit_mail = כתובת ×ימייל זו ×œ× ×—×•×§×™×ª למטרות יצירת קומיטי×. +editor.branch_does_not_exist = ×”×¢× ×£ "%s" ×œ× ×§×™×™× ×‘×§×¨×¤×™×£ ×–×”. +editor.branch_already_exists = ×”×¢× ×£ "%s" כבר ×§×™×™× ×‘×§×¨×¤×™×£ ×–×”. +repo_gitignore_helper_desc = מ×ילו ×§×‘×¦×™× ×’×™×˜ יתעל×. התפריט כולל רשימות ×§×‘×¦×™× ×”×ž×©×•×™×›×•×ª לשפות ×ו ספריות נפוצות. ××¨×˜×™×¤×§×˜×™× ×˜×™×¤×•×¡×™×™× ×›×œ×•×œ×™× ×‘.gitignore כברירת מחדל. +object_format_helper = ××œ×’×•×¨×™×ª× ×”×’×™×‘×•×‘ שהקרפיף ישתמש בו. ××™ ×פשר לשנות ×ת הבחירה הזו. ל־SHA1 הת×ימות הטובה ביותר ×¢× ×ª×•×›× ×•×ª ×חרות. +mirror_sync_on_commit = סנכרון ×›×©×§×•×ž×™×˜×™× ×ž×’×™×¢×™× ×œ×©×¨×ª המקומי +author_search_tooltip = ×ž×§×¡×™×ž×•× 30 חשבונות ×ž×•×¦×’×™× +tree_path_not_found_commit = הכתובת %[1]s ×œ× ×§×™×™×ž×ª בקומיט %[2]s +form.reach_limit_of_creation_1 = החשבון של ×”×‘×¢×œ×™× ×›×‘×¨ ×”×’×™×¢ לכמות ×”×§×¨×¤×™×¤×™× ×”×ž×§×¡×™×ž×œ×™×ª (×חד). +new_from_template = קרפיף חדש מתבנית +fork_no_valid_owners = קרפיף ×–×” ×œ× ×ž×©×•×™×š ×œ×‘×¢×œ×™× ×ª×§×¤×™×; ××™ ×פשר למזלגו. +template.webhooks = WebhookÖ¾×™× +template.topics = נוש××™× +stars_remove_warning = פעולה זו תסיר מהקרפיף ×ת כל הכוכבי×. +owner_helper = ××¨×’×•× ×™× ×©×›×‘×¨ יצרו ×ת כמות ×”×§×¨×¤×™×¤×™× ×”×ž×§×¡×™×ž×œ×™×ª ×œ× ×ž×•×¦×’×™× ×‘×ª×¤×¨×™×˜. +fork_to_different_account = מזלוג לחשבון ×חר +archive.pull.nocomment = קרפיף ×–×” ב×רכיון. ××™ ×פשר להגיב לבקשות מיזוג. +migrate_items_releases = גרס×ות +migrate.permission_denied = ×ין לך הרש××” ×œ×™×™×‘× ×§×¨×¤×™×¤×™× ×ž×”×©×¨×ª הנוכחי. +fork_repo = מזלוג +watchers = ×ž× ×•×™×™× +transfer.accept_desc = העברה ל "%s" +desc.template = תבנית +archive.title = קרפיף ×–×” ב×רכיון. ×פשר ×œ×§×¨×•× ×§×‘×¦×™× ×•×œ×©×›×¤×œ ×ותו, ×בל ××™ ×פשר לדחוף ×ליו ×ו לפתוח סוגיות. +archive.title_date = קרפיך ×–×” ב×רכיון כבר %s. ×פשר לצפות ×‘×§×‘×¦×™× ×•×œ×©×›×¤×œ ×ותו, ×בל ××™ ×פשר לדחוף ×ליו ×ו לפתוח סוגיות. +form.name_pattern_not_allowed = התבנית "%s" ×œ× ×—×•×§×™×ª בתוך ×©× ×©×œ קרפיף. +mirror_use_ssh.helper = פורג'ו ישקף ×ת הקרפיף דרך התמיכה המובנית של גיט ב־SSH, ויצור בשבילך זוג מפתחות ×וטומטית. ב×חריותך ×œ×•×•×“× ×©×œ×ž×¤×ª×— הציבורי שיווצר ×™×”×™×” גישה לקרפיף היעד. ××™ ×פשר להשתמש בכניסה על־בסיס סיסמה ×¢× ×פשרות זו. +mirror_lfs = ×חסון ×§×‘×¦×™× ×’×“×•×œ×™× (LFS) +migrate_items_labels = תוויות +migrate_repo = ×™×™×‘×•× ×§×¨×¤×™×£ +transfer.no_permission_to_accept = ×ין לך הרש××” ל×שר ×ת העברת הקרפיף הזו. +form.string_too_long = הטקסט הנתון ×רוך מ־%d תווי×. +migrate_items_milestones = ×בני דרך +migrate.failed = ×”×™×™×‘×•× × ×›×©×œ: %v +migrate.migrate_items_options = פורג'ו צריך קוד גישה כדי ×œ×™×™×‘× ×ž×™×“×¢ נוסף +migrate.github.description = ×™×™×‘×•× ×ž×™×“×¢ מ־github.com ×ו שרת GitHub Enteprise. +migrate.gitlab.description = ×™×™×‘×•× ×ž×™×“×¢ מ־gitlab.com ×ו משרתי GitLab ×חרי×. +migrate.gitbucket.description = ×™×‘×•× ×ž×™×“×¢ משרת GitBucket. +migrate.migrating_git = ×™×™×‘×•× ×”×§×¨×¤×™×£ עצמו +editor.filename_help = ×פשר להפריד בין תיקיות ×¢× ×¡×œ×שי×, ו"למחוק" תיקיות ×¢× backspace, ×›×ילו זוהי תיבת טקסט רגילה. +editor.filename_is_a_directory = ××™ ×פשר ×œ×§×¨×•× ×œ×§×•×‘×¥ "%s"; כבר קיימת תיקייה תחת ×ותו ש×. +editor.file_editing_no_longer_exists = הקובץ הנערך שהיה ידוע ×›Ö¾"%s" ×œ× ×§×™×™× ×™×•×ª×¨ בקרפיף ×–×”. +editor.fail_to_update_file = יצירת\שינוי הקובץ "s" נכשלה. +editor.push_rejected_summary = הודעת דחייה מל××”: +editor.add_subdir = הוספת תיקייה… +editor.upload_file_is_locked = הקובץ "%s" ננעל ×¢"×™ %s. +editor.upload_files_to_dir = העל×ת ×§×‘×¦×™× ×œ"%s" +editor.commit_email = כתובת ×”×ימייל המשויכת לקומיט +commits.commits = ×§×•×ž×™×˜×™× +commits.nothing_to_compare = ×¢× ×¤×™× ×לו ×–×”×™×. +commits.search_branch = ×¢× ×£ ×–×” +commits.message = מסר +commits.date = ת×ריך +commits.signed_by = × ×—×ª× ×¢"×™ +commits.signed_by_untrusted_user = בעל חתימה ×œ× ×ž×”×™×ž× ×ª +commits.gpg_key_id = מזהה מפתח ×”Ö¾GPG +commits.ssh_key_fingerprint = טביעת ×צבע מפתח ×”Ö¾SSH +commitstatus.error = שגי××” +commitstatus.failure = כישלון +commitstatus.pending = ×‘×ª×”×œ×™×›×™× +commitstatus.success = הצלחה +ext_issues = סוגיות חיצוניות +projects = ×¤×¨×•×™×§×˜×™× +projects.desc = ×¤×¨×•×™×§×˜×™× ×¢×•×–×¨×™× ×‘× ×™×”×•×œ ו×רגון סוגיות ובקשות מיזוג. +projects.title = כותרת +projects.description_placeholder = תי×ור... +projects.description = תי×ור (×œ× ×—×•×‘×”) +projects.create = פרויקט חדש +projects.new = פרויקט חדש +editor.commit_id_not_matching = תוכן קובץ ×–×” השתנה מ××– שהתחלת לערוך. ×פשר לשמור ×ת ×”×©×™× ×•×™×™× ×œ×¢× ×£ חדש ולפתוח בקשת מיזוג במקו×. +editor.file_deleting_no_longer_exists = מחיקת הקובץ שהיה ידוע ×›Ö¾"%s" נכשלה; הקובץ ×œ× ×§×™×™× ×™×•×ª×¨ בקרפיף ×–×”. +editor.file_already_exists = כבר יש קובץ תחת ×”×©× "%s" בקרפיף ×–×”. +editor.unable_to_upload_files = העל×ת ×”×§×‘×¦×™× ×œÖ¾"%s" נכשלה: %v +commits.author = מחבר +editor.file_changed_while_editing = תוכן קובץ ×–×” השתנה מ××– שהתחלת לערוך. ×פשר לר×ות מה היו ×”×©×™× ×•×™×™× ×ו ליצור ×ת הקומיט שוב כדי לדרוס ×ות×. +commits.signed_by_untrusted_user_unmatched = בעל חתימה ×œ× ×ž×”×™×ž× ×ª ×©×œ× ×ª×•×מת ×ת מחבר הקומיט +editor.no_changes_to_show = ×ין ×©×™× ×•×™×™× ×œ×”×¦×™×’. +editor.fail_to_update_file_summary = הודעת שגי××”: +commits.search_all = כל ×”×¢× ×¤×™× +issues.create = סוגייה חדשה +issues.edit = עריכה +issues.cancel = ביטול +issues.save = שמירה +issues.label_title = ×©× +issues.label_description = תי×ור +issues.label_color = צבע +issues.label_exclusive = בחירה בודדת +issues.label_archive = ל×רכיון +issues.label_archived_filter = הצגת תוויות מה×רכיון +issues.label_archive_tooltip = תוויות ב×רכיון ×œ× ×ž×•×¦×¢×•×ª בחיפוש על־בסיס תווית כברירת מחדל. + +[translation_meta] +test = ו×הבת לרעך כמוך \ No newline at end of file diff --git a/options/locale/locale_hi.ini b/options/locale/locale_hi.ini index f89a8483dd..59f66b4d0f 100644 --- a/options/locale/locale_hi.ini +++ b/options/locale/locale_hi.ini @@ -1,6 +1,42 @@ - - - [common] -dashboard = डैशबोरà¥à¤¡ -home = घर \ No newline at end of file +dashboard = नियंतà¥à¤°à¤£ ककà¥à¤· +home = मà¥à¤–à¥à¤¯ पृषà¥à¤  +help = सहायता +logo = चिहà¥à¤¨ +explore = अनà¥à¤µà¥‡à¤·à¤£ करें +sign_in = पà¥à¤°à¤µà¥‡à¤¶ करें +sign_in_with_provider = %s के साथ पà¥à¤°à¤µà¥‡à¤¶ करें +sign_in_or = या +sign_out = बाहर निकलें +sign_up = पंजीकरण +register = पंजीकरण +version = संसà¥à¤•रण +powered_by = दà¥à¤µà¤¾à¤°à¤¾ संचालित %s +page = पृषà¥à¤  +template = सांचा +language = भाषा +active_stopwatch = सकà¥à¤°à¤¿à¤¯ समय टà¥à¤°à¥ˆà¤•र +create_new = बनाà¤à¤â€¦ +signed_in_as = साइन इन किया गया है +link_account = खाता लिंक करें +notifications = सूचनाà¤à¤ +tracked_time_summary = समसà¥à¤¯à¤¾à¤“ं की सूची के फ़िलà¥à¤Ÿà¤° के आधार पर टà¥à¤°à¥ˆà¤• किठगठसमय का सारांश +user_profile_and_more = पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤² और सेटिंगà¥à¤¸â€¦ +enable_javascript = इस पनà¥à¤¨à¥‡ के लिये जावा चाहिठ+toc = विषय सूची +licenses = लाइसेंस +return_to_forgejo = फ़ोरà¥à¤œà¥‡à¤—ो पे वापस जाà¤à¤‚ +more_items = और वसà¥à¤¤à¥à¤à¤‚ +username = यूजरनाम +email = ईमेल पता +password = पासवरà¥à¤¡ +re_type = पासवरà¥à¤¡ पकà¥à¤•ा करें +captcha = कैपà¥à¤šà¤¾ +twofa = टू-फैकà¥à¤Ÿà¤° ऑथेंटिकेशन +twofa_scratch = टू-फैकà¥à¤Ÿà¤° सà¥à¤•à¥à¤°à¥ˆà¤š कोड +passcode = पास कोड +repository = भंडार +organization = संगठन +mirror = छवि +settings = सेटिंगà¥à¤¸ +your_settings = आपकी सेटिंगà¥à¤¸ \ No newline at end of file diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index 85b9105128..ea8732f422 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -20,15 +20,15 @@ user_profile_and_more=Profil és beállítások… signed_in_as=Bejelentkezve mint toc=Tartalomjegyzék licenses=Licencek -return_to_forgejo=Vissza a Forgejo-hoz +return_to_forgejo=Vissza a Forgejóhoz username=Felhasználónév -email=E-mail cím +email=E-mail-cím password=Jelszó re_type=Jelszó megerÅ‘sítése captcha=CAPTCHA twofa=KétlépcsÅ‘s hitelesítés -twofa_scratch=KétlépcsÅ‘s bejelentkezés egyszer használatos kódja +twofa_scratch=KétlépcsÅ‘s hitelesítés egyszer használatos kódja passcode=Jelkód @@ -98,13 +98,13 @@ filter.is_archived = Archivált logo = Logó sign_in_with_provider = Bejelentkezés %s fiókkal webauthn_insert_key = Helyezze be biztonsági kulcsát -webauthn_press_button = Kérem nyomja meg a biztonsági kulcsán található gombot… +webauthn_press_button = Nyomja meg a biztonsági kulcsán található gombot… access_token = Hozzáférési token webauthn_error = A biztonsági kulcsának beolvasása sikertelen volt. webauthn_unsupported_browser = A böngészÅ‘je jelenleg nem támogatja a WebAuthn protokollt. -webauthn_error_unknown = Egy ismeretlen hiba jelentkezett. Kérem próbálja újra. -webauthn_error_unable_to_process = A szerver nem tudta feldolgozni kérését. -webauthn_error_empty = Ennek a kulcsnak nevet kell adnia. +webauthn_error_unknown = Ismeretlen hiba történt. Próbálja újra. +webauthn_error_unable_to_process = A kiszolgáló nem tudta feldolgozni a kérését. +webauthn_error_empty = Nevet kell adnia ennek a kulcsnak. new_project_column = Új oszlop never = Soha unknown = Ismeretlen @@ -126,16 +126,53 @@ more_items = További elemek view = Megtekintés ok = OK copy_generic = Másolás vágólapra -copy_url = URL másolása -webauthn_error_insecure = A WebAuthn csak biztonságos kapcsolatokat támogat. HTTP-n keresztüli tesztelés esetén használja a "localhost" vagy "127.0.0.1"-es elérési pontokat +copy_url = Webcím másolása +webauthn_error_insecure = A WebAuthn csak biztonságos kapcsolatokat támogat. HTTP-n keresztüli tesztelés esetén használja a „localhost†vagy a „127.0.0.1†forrást. +filter.clear = SzűrÅ‘k törlése +enable_javascript = Az oldal működéséhez engedélyezni kell a JavaScriptet. +webauthn_sign_in = Nyomja meg a biztonsági kulcsán található gombot. Ha nincs rajta gomb, próbálja meg újra behelyezni. +webauthn_use_twofa = KétlépcsÅ‘s hitelesítési kód használata telefonról +webauthn_error_timeout = IdÅ‘túllépés a kulcs beolvasása során. Töltse be újra ezt az oldalt, és próbálkozzon újra. +copy_branch = Elágazás nevének másolása +test = Tesztelés +copy_type_unsupported = Ezt a fájltípust nem lehet másolni +copy_error = Sikertelen másolás +invalid_data = Érvénytelen adatok: %v +unpin = Rögzítés feloldása +concept_user_individual = Egyéni +toggle_menu = Menü megjelenítése/elrejtése +concept_system_global = Globális +error413 = Felhasználta a kvótáját. +remove_label_str = „%s†eltávolítása +rerun_all = Minden feladat újrafuttatása +rerun = Újrafuttatás +show_full_screen = Teljes képernyÅ‘ +rss_feed = RSS csatorna +copy = Másolás +retry = Újra +new_repo.title = Új tároló +new_repo.link = Új tároló +new_migrate.title = Új migráció +new_migrate.link = Új migráció +new_org.title = Új szervezet +new_org.link = Új szervezet +filter.is_fork = Másolatok +webauthn_error_duplicated = A biztonsági kulcs nem engedélyezett ehhez a kéréshez. GyÅ‘zÅ‘djön meg róla, hogy a kulcs nincs-e már regisztrálva. +filter.is_mirror = Tükrök [aria] footer.links = Hivatkozások footer = Lábléc +navbar = Navigációs eszközsor +footer.software = A programról [heatmap] less = Kevesebb more = Több +number_of_contributions_in_the_last_12_months = %s hozzájárulás az elmúlt 12 hónapban +contributions_zero = Nincsenek hozzájárulások +contributions_one = hozzájárulás +contributions_few = hozzájárulás [editor] buttons.heading.tooltip = Fejléc hozzáadása @@ -145,6 +182,12 @@ buttons.italic.tooltip = DÅ‘lt szöveg hozzáadása buttons.quote.tooltip = Szöveg idézése buttons.link.tooltip = Hivatkozás hozzáadása buttons.indent.tooltip = Elemek behúzása egy szinttel +buttons.mention.tooltip = Felhasználó vagy csapat említése +buttons.list.ordered.tooltip = Számozott lista hozzáadása +buttons.list.task.tooltip = Feladatlista hozzáadása +buttons.list.unordered.tooltip = Felsorolás hozzáadása +buttons.switch_to_legacy.tooltip = A régi szerkesztÅ‘ használata +buttons.unindent.tooltip = Elemek behúzásának csökkentése egy szinttel [filter] string.asc = A - Z @@ -154,12 +197,12 @@ string.desc = Z - A occurred = Hiba történt server_internal = BelsÅ‘ szerverhiba network_error = Hálózati hiba +not_found = A cél nem található. [startpage] app_desc=Fájdalommentes, saját gépre telepíthetÅ‘ Git szolgáltatás install=Könnyen telepíthetÅ‘ platform=Keresztplatformos -platform_desc=A Forgejo minden platformon fut, ahol a Go fordíthat: Windows, macOS, Linux, ARM, stb. Válassza azt, amelyet szereti! lightweight=Könnyűsúlyú license=Nyílt forráskódú @@ -340,7 +383,6 @@ authorization_failed=Az engedélyezés nem sikerült sspi_auth_failed=SSPI hitelesítés sikertelen [mail] - activate_account=Kérjük aktiválja a fiókját activate_email=E-mail cím megerÅ‘sítése @@ -449,7 +491,7 @@ avatar=Profilkép ssh_gpg_keys=SSH / GPG kulcsok social=Közösségi fiókok applications=Alkalmazások -orgs=Szervezetek kezelése +orgs=Szervezetek repos=Tárolók delete=Fiók törlése twofa=KétlépcsÅ‘s hitelesítés @@ -621,6 +663,7 @@ email_notifications.submit=E-mail beállítások megadása visibility.public=Nyilvános visibility.private=Privát +appearance = Megjelenés [repo] owner=Tulajdonos @@ -744,6 +787,7 @@ file_too_large=Ez a fájl túl nagy ahhoz, hogy megjelenítsük. video_not_supported_in_browser=A böngészÅ‘ nem támogatja a HTML5 video tag-et. audio_not_supported_in_browser=A böngészÅ‘ nem támogatja a HTML5 audio tag-et. stored_lfs=Git LFS-el eltárolva +stored_annex=Git Annex-el eltárolva symbolic_link=Szimbolikus hivatkozás commit_graph=Commit gráf commit_graph.hide_pr_refs=Pull request-ek elrejtése @@ -756,6 +800,7 @@ editor.upload_file=Fájl feltöltése editor.edit_file=Fájl szerkesztése editor.preview_changes=Változások elÅ‘nézete editor.cannot_edit_lfs_files=LFS fájlok nem szerkeszthetÅ‘ek a webes felületen. +editor.cannot_edit_annex_files=Annex fájlok nem szerkeszthetÅ‘ek a webes felületen. editor.cannot_edit_non_text_files=Bináris fájlok nem szerkeszthetÅ‘ek a webes felületen. editor.edit_this_file=Fájl szerkesztése editor.this_file_locked=Zárolt állomány @@ -765,9 +810,9 @@ editor.name_your_file=Fájl elnevezése… editor.or=vagy editor.cancel_lower=Mégse editor.commit_changes=Változások Véglegesítése -editor.add_tmpl='' hozzáadása +editor.add_tmpl='<%s>' hozzáadása editor.commit_message_desc=Opcionális hosszabb leírás hozzáadása… -editor.commit_directly_to_this_branch=Mentés egyenesen a(z) %s ágba. +editor.commit_directly_to_this_branch=Mentés egyenesen a(z) %[1]s ágba. editor.create_new_branch=Hozzon létre egy új ágat ennek a commit-nak és indíts egy egyesítési kérést. editor.propose_file_change=Változtatás ajánlása editor.new_branch_name_desc=Új ág neve… @@ -988,7 +1033,7 @@ pulls.filter_branch=Ãgra szűrés pulls.no_results=Nincs találat. pulls.nothing_to_compare=Ezek az ágak egyenlÅ‘ek. Nincs szükség egyesítési kérésre. pulls.create=Egyesítési kérés létrehozása -pulls.title_desc_few=egyesíteni szeretné %[1]d változás(oka)t a(z) %[2]s-ból %[3]s-ba +pulls.title_desc_few=egyesíteni szeretné %[1]d változás(oka)t a(z) %[2]s-ból %[3]s-ba pulls.merged_title_desc_few=egyesítve %[1]d változás(ok) a %[2]s-ból %[3]s-ba %[4]s pulls.tab_conversation=Beszélgetés pulls.tab_commits=Commit-ok @@ -1227,6 +1272,8 @@ topic.done=Kész +milestones.filter_sort.name = Név + [graphs] [org] @@ -1641,6 +1688,9 @@ config.cache_item_ttl = Gyorsítótárelem TTL értéke config.app_data_path = Alkalmazásadatok elérési útja +config_summary = Összefoglaló +config_settings = Beállítások + [action] create_repo=létrehozott tárolót: %s rename_repo=átnevezte a(z) %[1]s tárolót %[3]s-ra/re @@ -1704,9 +1754,6 @@ owner.settings.cleanuprules.enabled=Engedélyezett [secrets] [actions] - - - runners.name=Név runners.owner_type=Típus runners.description=Leírás @@ -1723,9 +1770,11 @@ runs.commit=Commit [projects] [git.filemode] -; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … symbolic_link=Szimbolikus hivatkozás submodule = Almodul +executable_file = Futtatható fájl +normal_file = Ãltalános fájl +directory = Könyvtár @@ -1740,4 +1789,15 @@ 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 \ No newline at end of file +exact = Pontos +code_search_by_git_grep = A kódkeresés jelenleg a "git grep" parancsot használja. Lehet, hogy jobb találatok is lennének, ha a webhely adminisztrátora bekapcsolja a forráskód indexelését. +milestone_kind = Mérföldkövek keresése... +fuzzy_tooltip = A keresési kifejezéshez hasonló találatok mutatása +fuzzy = Hasonlók +union = Kulcsszavakra +union_tooltip = A szóközzel elválasztott kulcsszavak bármelyikét tartalmazó találatok mutatása +branch_kind = Ãgak keresése... +no_results = Nincsenek megfelelÅ‘ találatok. +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 36f1265c3e..fc9d934ce6 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -84,21 +84,98 @@ concept_code_repository=Repositori name=Nama +re_type = Konfirmasi Kata Sandi +webauthn_insert_key = Masukkan kunci keamanan anda +webauthn_sign_in = Tekan tombol pada kunci keamanan Anda. Jika kunci keamanan Anda tidak memiliki tombol, masukkan kembali. +webauthn_press_button = Silakan tekan tombol pada kunci keamanan Anda… +webauthn_use_twofa = Gunakan kode dua faktor dari telepon Anda +webauthn_error = Tidak dapat membaca kunci keamanan Anda. +webauthn_unsupported_browser = Browser Anda saat ini tidak mendukung WebAuthn. +webauthn_error_unknown = Terdapat kesalahan yang tidak diketahui. Mohon coba lagi. +webauthn_error_insecure = `WebAuthn hanya mendukung koneksi aman. Untuk pengujian melalui HTTP, Anda dapat menggunakan "localhost" atau "127.0.0.1"` +webauthn_error_unable_to_process = Server tidak dapat memproses permintaan Anda. +webauthn_error_duplicated = Kunci keamanan tidak diperbolehkan untuk permintaan ini. Pastikan bahwa kunci ini belum terdaftar sebelumnya. +webauthn_error_empty = Anda harus menetapkan nama untuk kunci ini. +webauthn_error_timeout = Waktu habis sebelum kunci Anda dapat dibaca. Mohon muat ulang halaman ini dan coba lagi. +new_project = Proyek Baru +new_project_column = Kolom Baru +ok = Oke +retry = Coba lagi +rerun = Jalankan ulang +rerun_all = Jalankan ulang semua job +remove_label_str = `Hapus item "%s"` +view = Tampilan +test = Pengujian +locked = Terkunci +copy = Salin +copy_url = Salin URL +copy_hash = Salin hash +copy_content = Salin konten +copy_branch = Salin nama branch +copy_success = Tersalin! +copy_error = Gagal menyalin +copy_type_unsupported = Tipe berkas ini tidak dapat disalin +error = Gangguan +error404 = Halaman yang akan kamu akses tidak dapat ditemukan atau kamu tidak memiliki akses untuk melihatnya. +go_back = Kembali +invalid_data = Data invalid: %v +never = Tidak Pernah +unknown = Tidak diketahui +rss_feed = Umpan Berita +pin = Sematkan +unpin = Lepas sematan +artifacts = Artefak +archived = Diarsipkan +concept_system_global = Global +concept_user_individual = Perorangan +show_full_screen = Tampilkan layar penuh +download_logs = Unduh Logs +confirm_delete_selected = Konfirmasi untuk menghapus semua item yang dipilih? +value = Nilai +filter = Saring +filter.is_archived = Diarsipkan +filter.not_archived = Tidak Diarsipkan +filter.public = Publik +filter.private = Pribadi + [aria] +navbar = Bar Navigasi +footer = Footer +footer.links = Tautan [heatmap] +number_of_contributions_in_the_last_12_months = %s Kontribusi pada 12 bulan terakhir +less = Lebih sedikit +more = Lebih banyak [editor] +buttons.heading.tooltip = Tambahkan heading +buttons.bold.tooltip = Tambahkan teks Tebal +buttons.italic.tooltip = Tambahkan teks Miring +buttons.quote.tooltip = Kutip teks +buttons.code.tooltip = Tambah Kode +buttons.link.tooltip = Tambahkan tautan +buttons.list.unordered.tooltip = Tambah daftar titik +buttons.list.ordered.tooltip = Tambah daftar angka +buttons.list.task.tooltip = Tambahkan daftar tugas +buttons.mention.tooltip = Tandai pengguna atau tim +buttons.ref.tooltip = Merujuk pada isu atau permintaan tarik +buttons.switch_to_legacy.tooltip = Gunakan editor versi lama +buttons.enable_monospace_font = Aktifkan font monospace +buttons.disable_monospace_font = Non-Aktifkan font monospace [filter] +string.asc = A - Z +string.desc = Z - A [error] +occurred = Terjadi kesalahan +not_found = Target tidak dapat ditemukan. [startpage] app_desc=Sebuah layanan hosting Git sendiri yang tanpa kesulitan install=Mudah dipasang platform=Lintas platform -platform_desc=Forgejo bisa digunakan di mana Go bisa dijalankan: Windows, macOS, Linux, ARM, dll. Silahkan pilih yang Anda suka! lightweight=Ringan lightweight_desc=Forgejo hanya membutuhkan persyaratan minimal dan bisa berjalan pada Raspberry Pi yang murah. Bisa menghemat listrik! license=Sumber Terbuka @@ -125,6 +202,9 @@ require_sign_in_view=Harus Login Untuk Melihat Halaman admin_password=Kata Sandi admin_email=Alamat Email +email_title = Pengaturan email +smtp_from = Kirim Email Sebagai + [home] uname_holder=Nama Pengguna atau Alamat Surel password_holder=Kata Sandi @@ -142,6 +222,8 @@ show_private=Pribadi issues.in_your_repos=Dalam repositori anda +show_archived = Diarsipkan + [explore] repos=Repositori users=Pengguna @@ -207,7 +289,6 @@ authorization_failed=Otorisasi gagal sspi_auth_failed=Autentikasi SSPI gagal [mail] - activate_account=Silakan aktifkan akun anda activate_email=Verifikasi alamat surel anda @@ -494,6 +575,8 @@ email_notifications.submit=Pasang Pengaturan Email visibility.private=Pribadi +visibility.public = Publik + [repo] owner=Pemilik repo_name=Nama Repositori @@ -598,6 +681,7 @@ file_permalink=Permalink file_too_large=Berkas terlalu besar untuk ditampilkan. stored_lfs=Tersimpan dengan GIT LFS +stored_annex=Tersimpan dengan GIT Annex commit_graph=Grafik Komit blame=Salahkan normal_view=Pandangan Normal @@ -609,6 +693,7 @@ editor.upload_file=Unggah Berkas editor.edit_file=Sunting Berkas editor.preview_changes=Tinjau Perubahan editor.cannot_edit_lfs_files=Berkas LFS tidak dapat disunting dalam antarmuka web. +editor.cannot_edit_annex_files=Berkas Annex tidak dapat disunting dalam antarmuka web. editor.cannot_edit_non_text_files=Berkas biner tidak dapat disunting dalam antarmuka web. editor.edit_this_file=Sunting Berkas editor.this_file_locked=Berkas terkunci @@ -621,9 +706,9 @@ editor.filename_help=Tambahkan direktori dengan mengetikkan nama direktori diiku editor.or=atau editor.cancel_lower=Batalkan editor.commit_changes=Perubahan komitmen -editor.add_tmpl=Tambahkan '' +editor.add_tmpl=Tambahkan '<%s>' editor.commit_message_desc=Tambahkan deskripsi opsional yang panjang… -editor.commit_directly_to_this_branch=Komitmen langsung ke %s cabang. +editor.commit_directly_to_this_branch=Komitmen langsung ke %[1]s cabang. editor.create_new_branch=Membuat new branch untuk tarik komit ini mulai permintaan. editor.create_new_branch_np=Buat cabang baru untuk komit ini. editor.propose_file_change=Usul perubahan berkas @@ -752,7 +837,7 @@ pulls.compare_changes=Permintaan Tarik Baru pulls.filter_branch=Penyaringan cabang pulls.no_results=Hasil tidak ditemukan. pulls.create=Buat Permintaan Tarik -pulls.title_desc_few=ingin menggabungkan komit %[1]d dari %[2]s menuju %[3]s +pulls.title_desc_few=ingin menggabungkan komit %[1]d dari %[2]s menuju %[3]s pulls.merged_title_desc_few=commit %[1]d telah digabungkan dari %[2]s menjadi %[3]s %[4]s pulls.tab_conversation=Percakapan pulls.tab_commits=Melakukan @@ -957,6 +1042,12 @@ branch.deleted_by=Dihapus oleh %s +desc.public = Publik +desc.archived = Diarsipkan +commitstatus.error = Gangguan +projects.new = Proyek Baru +milestones.filter_sort.name = Nama + [graphs] [org] @@ -1011,6 +1102,8 @@ teams.delete_team_success=Tim sudah di hapus. teams.repositories=Tim repositori teams.search_repo_placeholder=Cari repositori… +settings.visibility.public = Publik + [admin] dashboard=Dasbor organizations=Organisasi @@ -1269,6 +1362,9 @@ notices.op=Op. notices.delete_success=Laporan sistem telah dihapus. +config_settings = Pengaturan +users.list_status_filter.menu_text = Saring + [action] create_repo=repositori dibuat %s rename_repo=ganti nama gudang penyimpanan dari %[1]s ke %[3]s @@ -1332,9 +1428,6 @@ owner.settings.cleanuprules.enabled=Aktif [secrets] [actions] - - - runners.name=Nama runners.owner_type=Jenis runners.description=Deskripsi @@ -1347,8 +1440,56 @@ runs.commit=Memperbuat +runs.no_matching_online_runner_helper = Tidak ada runner online yang cocok dengan label: %s +runs.actor = Aktor +runs.status = Status +runs.actors_no_select = Semua aktor +runs.status_no_select = Semua status +runs.no_results = Tidak ada hasil yang cocok. +runs.no_workflows = Belum ada alur kerja. +runs.no_runs = Alur kerja belum berjalan. +runs.empty_commit_message = (pesan commit kosong) +workflow.disable = Nonaktifkan Alur Kerja +workflow.enable = Aktifkan Alur Kerja +workflow.disabled = Alur kerja dinonaktifkan. +need_approval_desc = Butuh persetujuan untuk menjalankan alur kerja untuk pull request fork. +variables = Variabel +variables.creation = Tambah Variabel +variables.none = Belum ada variabel. +variables.deletion = Hapus variabel +variables.deletion.description = Menghapus variabel bersifat permanen dan tidak dapat dibatalkan. Lanjutkan? +variables.description = Variabel akan diteruskan ke beberapa tindakan dan tidak dapat dibaca sebaliknya. +variables.id_not_exist = Variabel dengan ID %d tidak ada. +variables.edit = Edit Variabel +variables.deletion.failed = Gagal menghapus variabel. +variables.deletion.success = Variabel telah dihapus. +variables.creation.failed = Gagal menambahkan variabel. +variables.creation.success = Variabel "%s" telah ditambahkan. +variables.update.failed = Gagal mengedit variabel. +variables.update.success = Variabel telah diedit. + [projects] +type-1.display_name = Proyek Individu +type-2.display_name = Proyek Repositori +type-3.display_name = Proyek Organisasi [git.filemode] -; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … +changed_filemode = %[1]s → %[2]s +directory = Directory +normal_file = Normal file +executable_file = Executable file +symbolic_link = Symbolic link +submodule = Submodule +[search] +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... +code_search_unavailable = Pencarian kode saat ini tidak tersedia. Silahkan hubungi administrator. +branch_kind = Cari cabang... diff --git a/options/locale/locale_is-IS.ini b/options/locale/locale_is-IS.ini index e34da348a5..9c39b9d830 100644 --- a/options/locale/locale_is-IS.ini +++ b/options/locale/locale_is-IS.ini @@ -3,7 +3,7 @@ home=Forsíða dashboard=Stjórnborð explore=Vafra help=Hjálp -sign_in=Skrá Inn +sign_in=Skrá inn sign_in_or=eða sign_out=Skrá Út sign_up=Nýskráning @@ -15,9 +15,9 @@ page=Síða template=Sniðmát language=Tungumál notifications=Tilkynningar -active_stopwatch=Virk Tímamæling +active_stopwatch=Virk tímamæling create_new=Skapa… -user_profile_and_more=Notandasíða og Stillingar… +user_profile_and_more=Notandasíða og stillingar… signed_in_as=Skráð(ur) inn sem toc=Efnisyfirlit licenses=Hugbúnaðarleyfi @@ -111,6 +111,12 @@ concept_code_repository=Hugbúnaðarsafn name=Heiti value=Gildi +sign_in_with_provider = Skrá inn með %s +enable_javascript = Þessi síða krefst JavaScript. + +filter = Sía +filter.is_archived = Safnvistað +filter.public = Opinbert [aria] @@ -131,7 +137,6 @@ network_error=Netkerfisvilla app_desc=Þrautalaus og sjálfhýst Git þjónusta install=Einföld uppsetning platform=Fjölvettvangur -platform_desc=Forgejo virkar hvar sem að Go gerir: Linux, macOS, Windows, ARM o. s. frv. Veldu það sem þú vilt! lightweight=Létt lightweight_desc=Forgejo hefur lágar lágmarkskröfur og getur keyrt á ódýrum Raspberry Pi. Sparaðu orku! license=Frjáls Hugbúnaður @@ -679,6 +684,7 @@ file_view_rendered=Skoða Unnið file_copy_permalink=Afrita Varanlega Slóð stored_lfs=Geymt með Git LFS +stored_annex=Geymt með Git Annex commit_graph.hide_pr_refs=Fela Sameiningarbeiðnir commit_graph.monochrome=Einlitað commit_graph.color=Litað @@ -697,7 +703,7 @@ editor.delete_this_file=Eyða Skrá editor.name_your_file=Nefndu skrána þína… editor.or=eða editor.cancel_lower=Hætta við -editor.add_tmpl=Bæta við „“ +editor.add_tmpl=Bæta við „<%s>“ editor.create_new_branch=Búðu til nýja grein og sameiningarbeiðni fyrir þetta framlag. editor.create_new_branch_np=Búðu til nýja grein fyrir þetta framlag. editor.new_branch_name_desc=Heiti nýjar greinar… @@ -889,7 +895,7 @@ pulls.new=Ný Sameiningarbeiðni pulls.view=Skoða Sameiningarbeiðni pulls.compare_changes=Ný Sameiningarbeiðni pulls.create=Skapa Sameiningarbeiðni -pulls.title_desc_few=vill sameina %[1]d framlög frá %[2]s í %[3]s +pulls.title_desc_few=vill sameina %[1]d framlög frá %[2]s í %[3]s pulls.tab_conversation=Umræða pulls.tab_commits=Framlög pulls.tab_files=Skráum Breytt @@ -1117,6 +1123,8 @@ topic.done=à lagi +milestones.filter_sort.name = Heiti + [graphs] [org] @@ -1286,6 +1294,9 @@ notices.type_2=Verkefni notices.desc=Lýsing +config_summary = Yfirlit +config_settings = Stillingar + [action] create_issue=`opnaði vandamál %[3]s#%[2]s` reopen_issue=`enduropnaði vandamál %[3]s#%[2]s` @@ -1351,9 +1362,6 @@ pypi.requires=Þarfnast Python [secrets] [actions] - - - runners.id=Auðkenni runners.name=Heiti runners.owner_type=Tegund @@ -1373,5 +1381,5 @@ runs.commit=Framlag [projects] [git.filemode] -; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … +[search] diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index 0860176b18..3c5e834260 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -166,6 +166,7 @@ new_migrate.title = Nuova migrazione new_org.title = Nuova organizzazione new_migrate.link = Nuova migrazione new_org.link = Nuova organizzazione +copy_path = Copia percorso [aria] footer.links = Collegamenti @@ -199,6 +200,15 @@ buttons.enable_monospace_font = Attiva font monospace buttons.disable_monospace_font = Disattiva font monospace buttons.indent.tooltip = Annida elementi di un livello buttons.unindent.tooltip = Disannida elementi di un livello +buttons.new_table.tooltip = Aggiungi tabella +table_modal.header = Aggiungi tabella +table_modal.placeholder.header = Intestazione +table_modal.placeholder.content = Contenuto +table_modal.label.rows = File +table_modal.label.columns = Colonne +link_modal.header = Aggiungi collegamento +link_modal.url = Url +link_modal.description = Descrizione [filter] string.asc = A - Z @@ -217,11 +227,10 @@ server_internal = Errore interno del server app_desc=Un servizio auto-ospitato per Git pronto all'uso install=Facile da installare platform=Multipiattaforma -platform_desc=Forgejo funziona ovunque Go possa essere compilato: Windows, macOS, Linux, ARM, etc. Scegli ciò che ami! lightweight=Leggero lightweight_desc=Forgejo ha requisiti minimi bassi e può funzionare su un economico Raspberry Pi. Risparmia l'energia della tua macchina! license=Open Source -license_desc=Ottieni Forgejo! Partecipa per contribuire a rendere questo progetto ancora migliore. Non aver paura di diventare un collaboratore! +license_desc=Ottieni Forgejo! Partecipa per contribuire a rendere questo progetto ancora più bello. Non aver paura di diventare collaborante! install_desc = Semplicemente avvia l'eseguibile per la tua piattaforma, distribuiscilo con Docker, oppure scarica il pacchetto. [install] @@ -340,7 +349,7 @@ allow_dots_in_usernames = Consenti l'uso del punto nel nome utente. Non impatta config_location_hint = Queste opzioni di configurazione saranno salvate in: allow_only_external_registration = Permetti la registrazione solo tramite servizi esterni app_slogan = Slogan dell'istanza -app_slogan_helper = Inserire qui lo slogan dell'istanza. Lasciare vuoto per disabilitare. +app_slogan_helper = Inserisci qui lo slogan della tua istanza. Lasciala vuota per disabilitarlo. [home] uname_holder=Nome utente o indirizzo e-mail @@ -406,10 +415,10 @@ remember_me=Ricorda questo dispositivo forgot_password_title=Password dimenticata forgot_password=Password dimenticata? sign_up_now=Hai bisogno di un account? Registrati adesso. -confirmation_mail_sent_prompt=Una nuova email di conferma è stata inviata a %s. Per favore controlla la tua posta in arrivo nelle prossime %s per completare il processo di registrazione. +confirmation_mail_sent_prompt=Una nuova e-mail di conferma è stata inviata a %s. Per completare la registrazione, controlla la tua posta in arrivo e clicca sul link in allegato entro i prossimi %s secondi. Se la tua e-mail è errata o incorretta, puoi accedere all'account e richiedere un'altra e-mail di conferma ad un'altro indirizzo. must_change_password=Aggiorna la tua password allow_password_change=Richiede all'utente di cambiare la password (scelta consigliata) -reset_password_mail_sent_prompt=Una email di conferma è stata inviata a %s. Per favore controlla la tua posta in arrivo nelle prossime %s per completare il processo di reset della password. +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 @@ -471,6 +480,11 @@ openid_signin_desc = Inserisci il tuo URI OpenID. Per esempio: alice.openid.exam password_pwned = La password che hai scelto è in un elenco di password rubate precedentemente esposte a violazioni di dati pubblici. Riprova con una password diversa e valuta di modificare questa password anche altrove. tab_signup = Registrati tab_signin = Accedi +back_to_sign_in = Torna alla schermata d'accesso +sign_in_openid = Procedi con OpenID +hint_login = Hai già un'utenza? Accedi! +hint_register = Non hai un'utenza? Registrati ora. +sign_up_button = Registrati ora. [mail] view_it_on=Visualizza su %s @@ -503,15 +517,15 @@ issue_assigned.issue=@%[1]s ti ha assegnato la segnalazione %[2]s nel repositori issue.x_mentioned_you=@%s ti ha menzionato: issue.action.force_push=%[1]s force-pushed il %[2]s da %[3]s a %[4]s. issue.action.push_1=@%[1]s ha spinto %[3]d commit a %[2]s -issue.action.push_n=@%[1]s ha spinto %[3]d commit a %[2]s +issue.action.push_n=@%[1]s ha immesso %[3]d commit presso %[2]s issue.action.close=@%[1]s chiuso #%[2]d. issue.action.reopen=@%[1]s riaperto #%[2]d. issue.action.merge=@%[1]s unito #%[2]d in %[3]s. -issue.action.approve=@%[1]s ha approvato questa pull request. -issue.action.reject=@%[1]s ha richiesto modifiche su questa pull request. -issue.action.review=@%[1]s ha commentato questa pull request. -issue.action.review_dismissed=@%[1]s ha respinto l'ultima recensione da %[2]s per questa pull request. -issue.action.ready_for_review=@%[1]s ha contrassegnato questa pull request pronta per la revisione. +issue.action.approve=@%[1]s ha approvato questa richiesta di modifica. +issue.action.reject=@%[1]s ha richiesto modifiche su questa richiesta. +issue.action.review=@%[1]s ha commentato questa richiesta di modifica. +issue.action.review_dismissed=@%[1]s ha respinto l'ultima revisione di %[2]s per questa richiesta di modifica. +issue.action.ready_for_review=@%[1]s ha contrassegnato questa richiesta di modifica come pronta per la revisione. issue.action.new=@%[1]s creato #%[2]d. issue.in_tree_path=In %s: @@ -528,8 +542,8 @@ repo.transfer.subject_to_you=%s ti vorrebbe trasferire il repositorio "%s" repo.transfer.to_you=tu repo.transfer.body=Per accettare o respingerla visita %s o semplicemente ignorarla. -repo.collaborator.added.subject=%s ti ha aggiunto a %s come collaboratorÉ™ -repo.collaborator.added.text=Sei statÉ™ aggiuntÉ™ come collaboratorÉ™ al repositorio: +repo.collaborator.added.subject=%s ti ha aggiunto a %s come collaborante +repo.collaborator.added.text=Sei statÉ™ aggiuntÉ™ come collaborante al repositorio: reply = o rispondi direttamente a questa email admin.new_user.subject = Il nuovo utente %s si è appena registrato admin.new_user.user_info = Informazioni utente @@ -539,6 +553,21 @@ activate_email.title = %s, verifica il tuo indirizzo email admin.new_user.text = Clicca qui per gestire questo utente dal pannello di amministrazione. team_invite.text_1 = %[1]s ti ha invitato a far parte del team %[2]s nell'organizzazione %[3]s. team_invite.text_3 = Nota: Questo invito è destinato a %[1]s. Se non ti aspettavi questo invito, puoi ignorare questa email. +primary_mail_change.subject = La tua mail principale è stata cambiata +removed_security_key.no_2fa = Non ci sono più altri metodi di autenticazione a due fattori configurati, ergo non c'è più bisogno di accedere alla tua utenza tramite tale autenticazione. +primary_mail_change.text_1 = La mail principale della tua utenza è appena stata cambiata in %[1]s. Ciò significa che questo indirizzo di posta elettronica non riceverà più notifiche mail da quest'utenza. +totp_disabled.subject = La TOTP è stata disabilitata +totp_disabled.no_2fa = Non ci sono più altri metodi d'autenticazione a due fattori configurati, ergo non c'è più bisogno di accedere alla tua utenza con tale autenticazione. +removed_security_key.subject = È stata rimossa una chiave di sicurezza +removed_security_key.text_1 = La chiave di sicurezza "%[1]s" è appena stata rimossa dalla tua utenza. +totp_disabled.text_1 = La password a tempo usa e getta (TOTP) della tua utenza è appena stata disabilitata. +totp_enrolled.subject = Hai attivato la TOTP come metodo d'autenticazione a due fattori +totp_enrolled.text_1.no_webauthn = Hai appena attivato la TOTP per la tua utenza. Ciò significa che dovrai usarla come metodo d'autenticazione a due fattori per tutti i tuoi accessi futuri. +totp_enrolled.text_1.has_webauthn = Hai appena attivato la TOTP per la tua utenza. Ciò significa che dovrai usare come metodo d'autenticazione a due fattori per i tuoi accessi futuri tale TOTP o una delle tue chiavi di sicurezza. +password_change.subject = La tua password è stata modificata +password_change.text_1 = La password della tua utenza è appena stata modificata. +account_security_caution.text_1 = Se sei statÉ™ tu, puoi ignorare questa mail. +account_security_caution.text_2 = Se non sei statÉ™ tu, la tua utenza è compromessa. Contatta l'amministrazione del sito. [modal] @@ -671,7 +700,7 @@ joined_on = Membro dal %s block_user = Blocca utente block_user.detail_1 = Questo utente non ti seguirà più. block_user.detail_2 = Quest'utente non potrà interagire né con i tuoi repositori, né con le segnalazioni che hai aperto, né con i tuoi commenti. -block_user.detail_3 = Non sarete in grado di aggiungervi come collaboratorÉœ del repositorio. +block_user.detail_3 = Non sarete in grado di aggiungervi come collaboranti del repositorio. code = Codice block = Blocca unblock = Sblocca @@ -741,9 +770,9 @@ comment_type_group_deadline=Scadenza comment_type_group_dependency=Dipendenza comment_type_group_lock=Stato blocco comment_type_group_review_request=Richiesta di revisione -comment_type_group_pull_request_push=Aggiunti commit +comment_type_group_pull_request_push=Commit aggiunti comment_type_group_project=Progetto -comment_type_group_issue_ref=Riferimento del problema +comment_type_group_issue_ref=Riferimento alla segnalazione saved_successfully=Le impostazioni sono state salvate correttamente. privacy=Privacy keep_activity_private_popup=La tua attività sarà visibile solo a te e agli amministratori dell'istanza @@ -778,7 +807,7 @@ activate_email=Invia Attivazione activations_pending=Attivazioni in sospeso delete_email=Rimuovi email_deletion=Rimuovi indirizzo Email -email_deletion_desc=L'indirizzo email e le relativa informazioni verranno rimosse dal tuo account. I Git commits di questa email rimarranno invariati. Continuare? +email_deletion_desc=L'indirizzo e-mail e altre informazioni relative a questa utenza verranno rimosse. I commit di git associati a questo indirizzo e-mail rimarranno invariati. Continuare? email_deletion_success=L'indirizzo email è stato eliminato. theme_update_success=Il tema è stato aggiornato. theme_update_error=Il tema selezionato non esiste. @@ -980,7 +1009,7 @@ valid_until_date = Valido fino a %s ssh_signonly = SSH è attualmente disabilitato quindi queste chiavi sono usate solo per la firma di verifica dei commit. social_desc = Questi profili social possono essere usati per accedere al tuo profilo. Assicurati di riconoscerli tutti. permission_write = Leggi e scrivi -access_token_desc = I permessi token selezionati limitano l'autorizzazione solo alle corrispondenti vie API. Leggi la documentazione per ulteriori informazioni. +access_token_desc = I permessi token selezionati limitano l'autorizzazione solo alle corrispondenti vie API. Leggi la documentazione per ulteriori informazioni. create_oauth2_application_success = Hai correttamente creato una nuova applicazione OAuth2. update_oauth2_application_success = Hai correttamente aggiornato l'applicazione OAuth2. oauth2_redirect_uris = URI per la reindirizzazione. Usa una nuova riga per ogni URI. @@ -1010,7 +1039,7 @@ oauth2_application_locked = Forgejo preregistra alcune applicazioni OAuth2 all'a hooks.desc = Aggiungi richiami HTTP che saranno innescati per tutti i progetti che possiedi. repos_none = Non possiedi alcun progetto. blocked_users_none = Non ci sono utenti bloccati. -keep_email_private_popup = Questo nasconderà il tuo indirizzo e-mail nel tuo profilo, nelle pull request e quando modifichi un file usando l'interfaccia web. I commit inoltrati non saranno modificati. Usa %s nei commit per associarli al tuo profilo. +keep_email_private_popup = Questo nasconderà il tuo indirizzo e-mail nel tuo profilo, nelle richieste di modifica e quando modifichi un file usando l'interfaccia web. I commit inoltrati non saranno modificati. Usa %s nei commit per associarli al tuo profilo. verify_gpg_key_success = La chiave GPG "%s" è stata verificata. added_on = Aggiunto su %s additional_repo_units_hint = Suggerisci l'attivazione di unità aggiuntive nel repositorio @@ -1022,6 +1051,8 @@ pronouns = Pronomi pronouns_custom = Personalizzato pronouns_unspecified = Non specificato language.title = Lingua predefinita +language.description = Questa lingua verrà salvata nella tua utenza e verrà usata come predefinita ogni volta che farai l'accesso. +language.localization_project = Aiutaci a tradurre Forgejo nella tua lingua! Più informazioni. [repo] owner=Proprietario @@ -1168,7 +1199,7 @@ migrate.migrating_failed_no_addr=Migrazione non riuscita. migrate.github.description=Migrare i dati da github.com o da server GitHub Enterprise. migrate.git.description=Migra un repositorio solo da qualsiasi servizio Git. migrate.gitlab.description=Migrare i dati da gitlab.com o da altre istanze di GitLab. -migrate.gitea.description=Migrare i dati da gitea.com o altre istanze di Gitea/Forgejo. +migrate.gitea.description=Migrare i dati da gitea.com o altre istanze di Gitea. migrate.gogs.description=Migrare i dati da notabug.org o da altre istanze Gogs. migrate.onedev.description=Migrare i dati da code.onedev.io o da altre istanze OneDev. migrate.codebase.description=Migrare i dati da codebasehq.com. @@ -1246,6 +1277,7 @@ view_git_blame=Visualizza git incolpa video_not_supported_in_browser=Il tuo browser non supporta le etichette "video" di HTML5. audio_not_supported_in_browser=Il tuo browser non supporta le etichette "audio" di HTML5. stored_lfs=Memorizzati con Git LFS +stored_annex=Memorizzati con Git Annex symbolic_link=Link Simbolico commit_graph=Grafico dei commit commit_graph.select=Seleziona rami @@ -1264,6 +1296,7 @@ editor.upload_file=Carica file editor.edit_file=Modifica file editor.preview_changes=Anteprima modifiche editor.cannot_edit_lfs_files=I file LFS non possono essere modificati nell'interfaccia web. +editor.cannot_edit_annex_files=I file Annex non possono essere modificati nell'interfaccia web. editor.cannot_edit_non_text_files=I file binari non possono essere modificati tramite interfaccia web. editor.edit_this_file=Modifica file editor.this_file_locked=Il file è bloccato @@ -1277,13 +1310,13 @@ editor.or=o editor.cancel_lower=Annulla editor.commit_signed_changes=Conferma modifiche firmate editor.commit_changes=Conferma le modifiche -editor.add_tmpl=Aggiungi "" +editor.add_tmpl=Aggiungi "<%s>" editor.patch=Applica Patch editor.patching=Patching: editor.new_patch=Nuova Patch editor.commit_message_desc=Aggiungi una descrizione estesa facoltativa… editor.signoff_desc=Aggiungi "firmato da" dal committer alla fine del messaggio di log di commit. -editor.commit_directly_to_this_branch=Fai un commit direttamente sul ramo %s. +editor.commit_directly_to_this_branch=Fai un commit direttamente sul ramo %[1]s. editor.create_new_branch=Crea un nuovo ramo per questo commit e avvia una richiesta di modifica. editor.create_new_branch_np=Crea un nuovo ramo per questo commit. editor.propose_file_change=Proponi la modifica del file @@ -1317,8 +1350,8 @@ commits.date=Data commits.older=Più vecchio commits.newer=Più recente commits.signed_by=Firmato da -commits.signed_by_untrusted_user=Firmato da un utente non attendibile -commits.signed_by_untrusted_user_unmatched=Firmato da un utente non attendibile che non corrisponde al committer +commits.signed_by_untrusted_user=Firmato da un*utente non attendibile +commits.signed_by_untrusted_user_unmatched=Firmato da un*utente non attendibile che non corrisponde al committente commits.gpg_key_id=ID chiave GPG commits.ssh_key_fingerprint=Impronta chiave SSH @@ -1379,18 +1412,18 @@ issues.new.open_projects=Apri progetti issues.new.closed_projects=Progetti chiusi issues.new.no_items=Nessun elemento issues.new.milestone=Traguardo -issues.new.no_milestone=Nessuna pietra miliare -issues.new.clear_milestone=Milestone pulita +issues.new.no_milestone=Nessun traguardo +issues.new.clear_milestone=Rimuovi traguardo issues.new.open_milestone=Traguardi aperti issues.new.closed_milestone=Traguardi chiusi issues.new.assignees=Assegnatari issues.new.clear_assignees=Cancella assegnatari issues.new.no_assignees=Nessun assegnatario issues.new.no_reviewers=Nessun revisore -issues.choose.get_started=Cominciare +issues.choose.get_started=Comincia issues.choose.open_external_link=Apri issues.choose.blank=Default -issues.choose.blank_about=Crea un problema dal modello predefinito. +issues.choose.blank_about=Crea una segnalazione dal modello predefinito. issues.no_ref=Nessun ramo/etichetta specificati issues.create=Crea segnalazione issues.new_label=Nuova etichetta @@ -1408,7 +1441,7 @@ issues.remove_labels=rimosso le %s etichette %s issues.add_remove_labels=aggiunto %s e rimosso %s etichette %s issues.add_milestone_at=`aggiunta alle pietre miliari %s %s` issues.add_project_at=`aggiunto questo al progetto %s %s` -issues.change_milestone_at=`pietra miliare modificata da %s a %s %s` +issues.change_milestone_at=`ha modificato il traguardo da %s a %s %s` issues.change_project_at=`ha modificato il progetto da %s a %s %s` issues.remove_milestone_at=`rimossa dalle pietre miliari %s %s` issues.remove_project_at=`rimosso questo dal progetto %s %s` @@ -1456,19 +1489,19 @@ issues.filter_sort.fewestforks=Minor numero di fork issues.action_open=Apri issues.action_close=Chiuso issues.action_label=Etichetta -issues.action_milestone=Pietra Miliare -issues.action_milestone_no_select=Nessuna pietra miliare +issues.action_milestone=Traguardo +issues.action_milestone_no_select=Nessun Traguardo issues.action_assignee=Assegnatario issues.action_assignee_no_select=Nessun assegnatario issues.opened_by=aperta %[1]s da %[3]s -pulls.merged_by=di %[3]s è stato fuso %[1]s -pulls.merged_by_fake=di %[2]s è stato fuso %[1]s +pulls.merged_by=di %[3]s è stata fusa %[1]s +pulls.merged_by_fake=di %[2]s è stata fusa %[1]s issues.closed_by=di %[3]s è stato chiuso %[1]s issues.opened_by_fake=aperta %[1]s da %[2]s issues.closed_by_fake=di %[2]s è stato chiuso %[1]s issues.previous=Pagina precedente issues.next=Pagina successiva -issues.open_title=Aperta +issues.open_title=Aperte issues.closed_title=Chiuso issues.draft_title=Bozza issues.num_comments=%d commenti @@ -1483,14 +1516,14 @@ issues.close_comment_issue=Commenta e chiudi issues.reopen_issue=Riapri issues.reopen_comment_issue=Commenta e riapri issues.create_comment=Commento -issues.closed_at=`chiuso questo probleam %[2]s` +issues.closed_at=`ha chiuso questa segnalazione %[2]s` issues.reopened_at=`ha riaperto questa segnalazione %[2]s` issues.commit_ref_at=`ha fatto riferimento a questa segnalazione dal commit %[2]s` issues.ref_issue_from=`ha fatto riferimento a questa segnalazione %[4]s %[2]s` issues.ref_pull_from=`ha fatto riferimento a questa richiesta di modifica %[4]s %[2]s` issues.ref_closing_from=`ha fatto riferimento a questa segnalazione da una richiesta di modifica %[4]s che la chiuderà, %[2]s` issues.ref_reopening_from=`ha fatto riferimento a questa segnalazione da una richiesta di modifica %[4]s che la riaprirà, %[2]s` -issues.ref_closed_from=`chiuso questo problema %[4]s %[2]s` +issues.ref_closed_from=`chiuso questa segnalazione %[4]s %[2]s` issues.ref_reopened_from=`ha riaperto questa segnalazione %[4]s %[2]s` issues.ref_from=`da %[1]s` issues.author=Autore @@ -1528,32 +1561,32 @@ issues.subscribe=Iscriviti issues.unsubscribe=Annulla iscrizione issues.lock=Blocca conversazione issues.unlock=Sblocca conversazione -issues.lock.unknown_reason=Impossibile bloccare un problema con un motivo sconosciuto. +issues.lock.unknown_reason=Impossibile bloccare una segnalazione senza un motivo. issues.lock_duplicate=Un issue non può essere bloccato due volte. -issues.unlock_error=Impossibile sbloccare un problema che non è bloccato. -issues.lock_with_reason=ha bloccato come %s e limitato la conversazione ai collaboratori %s -issues.lock_no_reason=ha bloccato e limitato la conversazione ai collaboratori %s +issues.unlock_error=Impossibile sbloccare una segnalazione che non è bloccata. +issues.lock_with_reason=ha bloccato come %s e limitato la conversazione allÉœ collaboranti %s +issues.lock_no_reason=ha bloccato e limitato la conversazione allÉœ collaboranti %s issues.unlock_comment=ha sbloccato questa conversazione %s issues.lock_confirm=Blocca issues.unlock_confirm=Sblocca issues.lock.notice_1=- Altri utenti non possono aggiungere nuovi commenti a questa segnalazione. -issues.lock.notice_2=- Tu e altri collaboratori con accesso a questo repository potete ancora lasciare commenti che altri possono vedere. -issues.lock.notice_3=- Puoi sempre sbloccare questo problema in futuro. -issues.unlock.notice_1=- Tutti potranno commentare nuovamente questo problema. -issues.unlock.notice_2=- Puoi sempre chiudere nuovamente questo problema in futuro. +issues.lock.notice_2=- Tu e altrÉœ collaboranti con accesso a questo repositorio potete ancora lasciare commenti visibili da altre persone. +issues.lock.notice_3=- Puoi sempre sbloccare questa segnalazione in futuro. +issues.unlock.notice_1=- TuttÉœ potranno commentare nuovamente questa segnalazione. +issues.unlock.notice_2=- Puoi sempre chiudere nuovamente questa segnalazione in futuro. issues.lock.reason=Motivo per il blocco issues.lock.title=Blocca la conversazione su questa issue. issues.unlock.title=Sblocca la conversazione su questa issue. -issues.comment_on_locked=Non puoi commentare un problema bloccato. +issues.comment_on_locked=Non puoi commentare una segnalazione bloccata. issues.delete=Elimina -issues.delete.title=Eliminare questo problema? -issues.delete.text=Vuoi davvero eliminare questo problema? (Questo rimuoverà permanentemente tutti i contenuti. Considera invece di chiuderlo, se vuoi tenerlo archiviato) +issues.delete.title=Eliminare la segnalazione? +issues.delete.text=Vuoi davvero eliminare la segnalazione? (Questo rimuoverà permanentemente tutti i contenuti. Considera invece di chiuderla, se vuoi tenerla archiviata) issues.tracker=Cronografo issues.start_tracking_short=Avvia timer issues.start_tracking=Avvia cronografo issues.start_tracking_history=ha iniziato a lavorare %s -issues.tracker_auto_close=Il timer verrà interrotto automaticamente una volta che il problema verrá chiuso -issues.tracking_already_started=`Hai già avviato il monitoraggio del tempo su un altro problema!` +issues.tracker_auto_close=Il timer verrà fermato automaticamente quando questa segnalazione verrà chiusa +issues.tracking_already_started=`Hai già avviato il monitoraggio del tempo su un'altra segnalazione!` issues.stop_tracking=Ferma timer issues.stop_tracking_history=`ha smesso di funzionare %s` issues.cancel_tracking=Scarta @@ -1574,7 +1607,7 @@ issues.error_modifying_due_date=Impossibile modificare la scadenza. issues.error_removing_due_date=Impossibile rimuovere la scadenza. issues.push_commit_1=ha aggiunto %d commit %s issues.push_commits_n=ha aggiunto %d commit %s -issues.force_push_codes=`ha forzato l'immissione %[1]s da %[2]s a %[4]s %[6]s` +issues.force_push_codes=`ha forzato l'immissione %[1]s da %[2]s a %[4]s %[6]s` issues.force_push_compare=Confronta issues.due_date_form=aaaa-mm-dd issues.due_date_form_add=Aggiungi scadenza @@ -1599,16 +1632,16 @@ issues.dependency.pr_closing_blockedby=Questa richiesta di modifica non può ess issues.dependency.issue_closing_blockedby=Questa segnalazione non può essere chiusa per via delle seguenti segnalazioni issues.dependency.issue_close_blocks=Questa segnalazione impedisce la chiusura delle seguenti segnalazioni issues.dependency.pr_close_blocks=Questa richiesta di modifica impedisce la chiusura delle seguenti segnalazioni -issues.dependency.issue_close_blocked=Devi chiudere tutte le anomalie che bloiccano questo problema prima di chiudelo. +issues.dependency.issue_close_blocked=Vanno chiuse tutte le segnalazioni che bloccano quest'ultima, prima di poterla chiudere. issues.dependency.pr_close_blocked=Chiudere tutte le anomalie che bloccano la richiesta di pull prima di effettaure il merge. issues.dependency.blocks_short=Blocchi issues.dependency.blocked_by_short=Dipende da issues.dependency.remove_header=Rimuovi Dipendenza issues.dependency.issue_remove_text=Questo rimuoverà la dipendenza da questa issue. Continuare? -issues.dependency.pr_remove_text=Questo rimuoverà la dipendenza da questa pull request. Continuare? +issues.dependency.pr_remove_text=Questo rimuoverà la dipendenza da questa richiesta di modifica. Continuare? issues.dependency.setting=Abilita le dipendenze per segnalazioni e richieste di modifica -issues.dependency.add_error_same_issue=Non si può fare dipendere un problema da se stesso. -issues.dependency.add_error_dep_issue_not_exist=Il problema dipendente non esiste. +issues.dependency.add_error_same_issue=Non si può fare dipendere una segnalazione da se stessa. +issues.dependency.add_error_dep_issue_not_exist=La segnalazione dalla quale dipende non esiste. issues.dependency.add_error_dep_not_exist=La dipendenza non esiste. issues.dependency.add_error_dep_exists=La dipendenza esiste già. issues.dependency.add_error_cannot_create_circular=Non puoi creare una dipendenza con due segnalazioni che si bloccano a vicenda. @@ -1650,7 +1683,7 @@ issues.reference_link=Riferimento: %s compare.compare_base=base compare.compare_head=confronta -pulls.desc=Attiva pull request e revisioni di codice. +pulls.desc=Attiva richieste di modifica e revisioni del codice. pulls.new=Nuova richiesta di modifica pulls.view=Visualizza richiesta di modifica pulls.compare_changes=Nuova richiesta di modifica @@ -1671,23 +1704,23 @@ pulls.nothing_to_compare=Questi rami sono uguali. Non c'è bisogno di creare una pulls.nothing_to_compare_and_allow_empty_pr=Questi rami sono uguali. Questa richiesta sarà vuota. pulls.has_pull_request=`Una richiesta di modifica fra questi rami esiste già: %[2]s#%[3]d` pulls.create=Crea richiesta di modifica -pulls.title_desc_few=vuole unire %[1]d commit da %[2]s a %[3]s +pulls.title_desc_few=vuole unire %[1]d commit da %[2]s a %[3]s pulls.merged_title_desc_few=ha unito %[1]d commit da %[2]s a %[3]s %[4]s pulls.change_target_branch_at=`cambiato il ramo di destinazione da %s a %s %s` pulls.tab_conversation=Conversazione pulls.tab_commits=Commit pulls.tab_files=File modificati -pulls.reopen_to_merge=Riapri questa pull request per effettuare l'unione. -pulls.cant_reopen_deleted_branch=Questa richiesta di modifia non può essere riaperta perché il ramo è stato eliminato. +pulls.reopen_to_merge=Riapri questa richiesta di modifica per poter fondere. +pulls.cant_reopen_deleted_branch=Questa richiesta di modifica non può essere riaperta in quanto il ramo è stato eliminato. pulls.merged=Unito pulls.manually_merged=Unito manualmente -pulls.is_closed=La pull request è stata chiusa. -pulls.title_wip_desc=`Inizia il titolo con %s per evitare che la pull request venga unita accidentalmente.` -pulls.cannot_merge_work_in_progress=Questa pull request è contrassegnata come un lavoro in corso. +pulls.is_closed=La richiesta di modifica è stata chiusa. +pulls.title_wip_desc=`Inizia il titolo con %s per evitare che la richiesta di modifica venga fusa accidentalmente.` +pulls.cannot_merge_work_in_progress=Questa richiesta di modifica è contrassegnata come lavori in corso. pulls.still_in_progress=Ancora in corso? pulls.add_prefix=Aggiungi prefisso %s pulls.remove_prefix=Rimuovi il prefisso %s -pulls.data_broken=Questa pull request è rovinata a causa di informazioni mancanti del fork. +pulls.data_broken=Questa richiesta di modifica è rovinata a causa di informazioni mancanti riguardo la derivazione. pulls.files_conflicted=Questa richiesta di modifica va in conflitto con il ramo di destinazione. pulls.is_checking=Verifica dei conflitti di fusione in corso. Riprova tra qualche istante. pulls.is_ancestor=Questo ramo è già incluso nel ramo di destinazione. Non c'è nulla da fondere. @@ -1695,8 +1728,8 @@ pulls.is_empty=Le modifiche di questo ramo sono già nel ramo di destinazione. Q pulls.required_status_check_failed=Alcuni controlli richiesti non hanno avuto successo. pulls.required_status_check_missing=Mancano alcuni controlli richiesti. pulls.required_status_check_administrator=Come amministratore, puoi ancora unire questa pull request. -pulls.can_auto_merge_desc=La pull request può essere unita automaticamente. -pulls.cannot_auto_merge_desc=Questa pull request non può essere unita automaticamente a causa di conflitti. +pulls.can_auto_merge_desc=La richiesta di modifica può essere unita automaticamente. +pulls.cannot_auto_merge_desc=Questa richiesta di modifica non può essere unita automaticamente a causa di conflitti. pulls.cannot_auto_merge_helper=Unire manualmente per risolvere i conflitti. pulls.num_conflicting_files_1=%d file in conflitto pulls.num_conflicting_files_n=%d file in conflitto @@ -1708,20 +1741,20 @@ pulls.waiting_count_1=%d in attesa di revisione pulls.waiting_count_n=%d in attesa di revisione pulls.wrong_commit_id=l'ID del commit deve essere un ID del commit nel ramo di destinazione -pulls.no_merge_desc=Questa pull request non può essere unita perché tutte le opzioni di merge del repository sono disattivate. +pulls.no_merge_desc=Questa richiesta di modifica non può essere fusa perché tutte le opzioni di fusione del repositorio sono disattivate. pulls.no_merge_helper=Attiva le opzioni di merge nelle impostazioni del repository o unisci la pull request manualmente. pulls.no_merge_wip=Questa pull request non può essere unita perché è contrassegnata come un lavoro in corso. pulls.no_merge_not_ready=Questa pull request non è pronta per il merge, controlla lo stato della revisione e i controlli di stato. -pulls.no_merge_access=Non sei autorizzato ad effettuare il merge su questa pull request. -pulls.merge_pull_request=Crea commit unito -pulls.rebase_merge_pull_request=Ricostruisci poi manda avanti -pulls.rebase_merge_commit_pull_request=Ricostruisci quindi crea commit unito +pulls.no_merge_access=Non sei autorizzatÉ™ a fondere questa richiesta di modifica. +pulls.merge_pull_request=Crea commit di fusione +pulls.rebase_merge_pull_request=Ricostruisci e avanti veloce +pulls.rebase_merge_commit_pull_request=Ricostruisci e crea commit di fusione pulls.squash_merge_pull_request=Crea commit mescolato pulls.merge_manually=Unito manualmente pulls.merge_commit_id=L'ID del commit di merge pulls.require_signed_wont_sign=Il ramo richiede commit firmati ma questa fusione non verrà firmata -pulls.invalid_merge_option=Non puoi utilizzare questa opzione di merge per questa pull request. +pulls.invalid_merge_option=Non è possibile utilizzare l'opzione di fusione selezionata per questa richiesta di modifica. pulls.merge_conflict=Unione non riuscita: C'è stato un conflitto durante l'operazione. Suggerimento: Prova una strategia diversa pulls.merge_conflict_summary=Messaggio d'errore pulls.rebase_conflict=Merge non riuscito: c'è stato un conflitto durante il rebase dell'commit: %[1]s. Suggerimento: Prova una strategia diversa @@ -1745,12 +1778,12 @@ pulls.update_branch_rebase=Aggiorna il ramo per cambio base pulls.update_branch_success=Ramo aggiornato con successo pulls.update_not_allowed=Non ti è permesso aggiornare il ramo pulls.outdated_with_base_branch=Questo ramo non è aggiornato con il ramo di base -pulls.closed_at=`chiusa questa pull request %[2]s` -pulls.reopened_at=`riaperta questa pull request %[2]s` +pulls.closed_at=`ha chiuso questa richiesta di modifica %[2]s` +pulls.reopened_at=`ha riaperto questa richiesta di modifica %[2]s` pulls.auto_merge_button_when_succeed=(Quando i controlli sono superati) pulls.auto_merge_when_succeed=Unione automatica quando tutti i controlli sono superati -pulls.auto_merge_newly_scheduled=La pull request era programmata per unire quando tutti i controlli sono superati. +pulls.auto_merge_newly_scheduled=La richiesta di modifica era programmata per essere fusa al passare di tutti i controlli. pulls.auto_merge_has_pending_schedule=%[1]s ha programmato questa pull request per unire automaticamente quando tutti i controlli hanno successo %[2]s. pulls.auto_merge_cancel_schedule=Annulla fusione automatica @@ -1760,8 +1793,8 @@ pulls.auto_merge_canceled_schedule=L'unione automatica è stata annullata per qu pulls.auto_merge_newly_scheduled_comment=`ha programmato questa pull request per unire automaticamente quando tutti i controlli sono superati %[1]s` pulls.auto_merge_canceled_schedule_comment=`cancella l'auto-merging di questa pull request quando tutti i testi sono superati %[1]s` -pulls.delete.title=Eliminare questa pull request? -pulls.delete.text=Vuoi davvero eliminare questo problema? (Questo rimuoverà permanentemente tutti i contenuti. Considera invece di chiuderlo, se vuoi tenerlo archiviato) +pulls.delete.title=Eliminare questa richiesta di modifica? +pulls.delete.text=Vuoi davvero eliminare questa richiesta di modifica? (Ciò rimuoverà permanentemente tutti i contenuti. Considera invece di chiuderla, se vuoi tenerla archiviata) @@ -1795,8 +1828,8 @@ ext_wiki.desc=Collegamento a una wiki esterna. wiki=Wiki wiki.welcome=Benvenuti nella Wiki. -wiki.welcome_desc=La wiki ti permette di scrivere e condividere documentazione con i collaboratori. -wiki.desc=Scrivi e condividi documentazione con i collaboratori. +wiki.welcome_desc=La wiki ti permette di scrivere e condividere documentazione con lÉœ collaboranti. +wiki.desc=Scrivi e condividi documentazione con lÉœ collaboranti. wiki.create_first_page=Crea la prima pagina wiki.page=Pagina wiki.filter_page=Filtra pagina @@ -1845,7 +1878,7 @@ activity.closed_issues_count_1=Segnalazione chiusa activity.closed_issues_count_n=Segnalazioni chiuse activity.title.issues_1=%d segnalazione activity.title.issues_n=%d segnalazioni -activity.title.issues_closed_from=%s chiusa da %s +activity.title.issues_closed_from=%s chiuse da %s activity.title.issues_created_by=%s creata da %s activity.closed_issue_label=Chiusa activity.new_issues_count_1=Nuova segnalazione @@ -1894,7 +1927,7 @@ search.code_search_unavailable=Attualmente la ricerca di codice non è disponibi settings=Impostazioni settings.desc=Impostazioni ti permette di gestire le impostazioni del repository settings.options=Repository -settings.collaboration=Collaboratori +settings.collaboration=Collaboranti settings.collaboration.admin=Amministratore settings.collaboration.write=Scrittura settings.collaboration.read=Lettura @@ -1988,14 +2021,14 @@ settings.signing_settings=Impostazioni verifica firma settings.trust_model=Modello di fiducia per la firma settings.trust_model.default=Modello di fiducia predefinito settings.trust_model.default.desc=Usa il modello di trust del repository predefinito per questa installazione. -settings.trust_model.collaborator=Collaboratore -settings.trust_model.collaborator.long=Collaboratore: Firme di fiducia da parte dei collaboratori -settings.trust_model.collaborator.desc=Le firme valide da parte dei collaboratori di questo repository saranno contrassegnate con "trusted" (sia che corrispondano al committer o meno). Altrimenti, le firme valide saranno contrassegnate con "untrusted" se la firma corrisponde al committer e "unmatched" se non. +settings.trust_model.collaborator=Collaborante +settings.trust_model.collaborator.long=Collaborante: firme di fiducia da parte dellÉœ collaboranti +settings.trust_model.collaborator.desc=Le firme valide da parte dellÉœ collaboranti di questo repositorio saranno contrassegnate con "fidate" (sia che corrispondano a chi ha fatto il commit o meno). Altrimenti saranno contrassegnate con "non fidate" se la firma corrisponde a chi ha fatto il commit e "senza riscontro" se non. settings.trust_model.committer=AutorÉ™ settings.trust_model.committer.long=Committer: firme affidabili che corrispondono ai committer (questo corrisponde a GitHub e costringerà i commit firmati di Forgejo ad avere Forgejo come committer) -settings.trust_model.collaboratorcommitter=Collaboratore+Committer -settings.trust_model.collaboratorcommitter.long=Collaboratore+Committer: Firme di fiducia da parte dei collaboratori che corrispondono al committer -settings.trust_model.collaboratorcommitter.desc=Le firme valide da parte dei collaboratori di questa repository saranno contrassegnate "fidate" se corrispondono al committer. Altrimenti le firme saranno contrassegnate con "untrusted" se la firma corrisponde al committer non corrisponde. Questo costringerà Forgejo a essere contrassegnato come committer su impegni firmati con l'effettivo committer contrassegnato come Co-Authored-By: e Co-Committed-By: nel commit. La chiave Forgejo predefinita deve corrispondere a un utente nel database. +settings.trust_model.collaboratorcommitter=Collaborante+Committente +settings.trust_model.collaboratorcommitter.long=Collaborante+Committente: firme di fiducia da parte dellÉœ collaboranti che corrispondono allÉ™ committente +settings.trust_model.collaboratorcommitter.desc=Le firme valide da parte dellÉœ collaboranti di questo repositorio saranno contrassegnate "fidate" se corrispondono a chi fa il commit. Altrimenti saranno contrassegnate con "non fidate" se la firma corrisponde a chi fa il commit, e "senza riscontro" se non corrisponde. Questo costringerà Forgejo a essere contrassegnato come committente sui commit firmati, con l'effettivÉ™ committente contrassegnatÉ™ come Co-Authored-By: e Co-Committed-By: nel commit. La chiave Forgejo predefinita deve corrispondere a un*utente nella base dati. settings.wiki_delete=Elimina dati wiki settings.wiki_delete_desc=L'eliminazione dei dati della wiki del repository è permanente e non può essere annullata. settings.wiki_delete_notices_1=-Questa operazione eliminerà permanentemente e disabiliterà la wiki repository per %s. @@ -2004,21 +2037,21 @@ settings.wiki_deletion_success=I dati della repository wiki sono stati eliminati settings.delete=Elimina questo progetto settings.delete_desc=L'eliminazione di un repository è un'operazione permanente e non può essere annullata. settings.delete_notices_1=-Questa operazione NON PUÃ’ essere annullata. -settings.delete_notices_2=-Questa operazione eliminerà definitivamente il repository %s inclusi codice, issue, commenti, dati wiki e impostazioni collaboratore. +settings.delete_notices_2=-Questa operazione eliminerà definitivamente il repositorio %s, inclusi codice, segnalazioni commenti, dati della wiki e impostazioni collaboranti. settings.delete_notices_fork_1=-I fork di questo repository diventeranno indipendenti dopo la cancellazione. settings.deletion_success=Il repository è stato eliminato. settings.update_settings_success=Le impostazioni del repository sono state aggiornate. settings.confirm_delete=Elimina progetto -settings.add_collaborator=Aggiungi collaboratore -settings.add_collaborator_success=Il collaboratore è stato aggiunto. -settings.add_collaborator_inactive_user=Non posso aggiungere un utente inattivo come collaboratore. -settings.add_collaborator_duplicate=Il collaboratore è già stato aggiunto a questo repository. +settings.add_collaborator=Aggiungi collaborante +settings.add_collaborator_success=LÉ™ collaborante è statÉ™ aggiuntÉ™. +settings.add_collaborator_inactive_user=Non posso aggiungere un*utente inattivÉ™ come collaborante. +settings.add_collaborator_duplicate=LÉ™ collaborante è già statÉ™ aggiuntÉ™ a questo repositorio. settings.delete_collaborator=Rimuovi -settings.collaborator_deletion=Rimuovi collaboratore -settings.collaborator_deletion_desc=Rimuovere un collaboratore revocherà l'accesso a questo repository. Continuare? -settings.remove_collaborator_success=Il collaboratore è stato rimosso. +settings.collaborator_deletion=Rimuovi collaborante +settings.collaborator_deletion_desc=Rimuovere unÉ™ collaborante ne revocherà l'accesso a questo repositorio. Continuare? +settings.remove_collaborator_success=LÉ™ collaborante è statÉ™ rimossÉ™. settings.search_user_placeholder=Ricerca utente… -settings.org_not_allowed_to_be_collaborator=Le organizzazioni non possono essere aggiunte come un collaboratore. +settings.org_not_allowed_to_be_collaborator=Le organizzazioni non possono essere aggiunte come collaborante. settings.change_team_access_not_allowed=La modifica dell'accesso al team per il repository è stato limitato al solo proprietario dell'organizzazione settings.team_not_in_organization=Il team non è nella stessa organizzazione del repository settings.teams=Gruppi @@ -2090,7 +2123,7 @@ settings.event_issue_comment=Commento segnalazione settings.event_issue_comment_desc=Commento issue creato, modificato o rimosso. settings.event_header_pull_request=Eventi di richieste di modifiche settings.event_pull_request=Richiesta di modifica -settings.event_pull_request_desc=Pull request aperta, chiusa, riaperta o modificata. +settings.event_pull_request_desc=Richiesta di modifica aperta, chiusa, riaperta o modificata. settings.event_pull_request_assign=Richiesta di modifica assegnata settings.event_pull_request_assign_desc=Pull request assegnata o non assegnata. settings.event_pull_request_label=Richiesta di modifica etichettata @@ -2164,23 +2197,23 @@ settings.protect_enable_push_desc=Chiunque con accesso in scrittura sarà autori settings.protect_whitelist_committers=Limita immissione alla whitelist settings.protect_whitelist_committers_desc=Solo gli utenti o i team nella whitelist potranno pushare su questo ramo (ma non forzare il push). settings.protect_whitelist_deploy_keys=Chiavi di deploy in whitelist con permessi di scrittura per il push. -settings.protect_whitelist_users=Utenti nella whitelist per pushare: +settings.protect_whitelist_users=Utenti nella whitelist per pushare settings.protect_whitelist_search_users=Cerca utenti… -settings.protect_whitelist_teams=Team nella whitelist per pushare: +settings.protect_whitelist_teams=Team nella whitelist per pushare settings.protect_whitelist_search_teams=Ricerca team… settings.protect_merge_whitelist_committers=Attiva la whitelist per le fusioni settings.protect_merge_whitelist_committers_desc=Consentire soltanto agli utenti o ai team in whitelist il permesso di unire le pull request di questo branch. -settings.protect_merge_whitelist_users=Utenti nella whitelist per il merging: -settings.protect_merge_whitelist_teams=Team nella whitelist per il merging: +settings.protect_merge_whitelist_users=Utenti nella whitelist per il merging +settings.protect_merge_whitelist_teams=Team nella whitelist per il merging settings.protect_check_status_contexts=Abilita controllo dello stato settings.protect_check_status_contexts_desc=Richiedi il superamento di controlli di stato prima dell'unione di due rami. Scegliere quali controlli di stato devono passare prima che i rami possano essere uniti in un ramo che corrisponde a questa regola. Se abilitato, i commit devono prima essere inviati a un altro ramo, quindi uniti o pushati direttamente a un ramo che corrisponde a questa regola dopo aver superato i controlli di stato. Se non viene selezionato alcuna regola, l'ultimo commit avrá successo indipendentemente dal contesto. settings.protect_check_status_contexts_list=Controlli di stato trovati nell'ultima settimana per questo repository -settings.protect_required_approvals=Approvazioni richieste: +settings.protect_required_approvals=Approvazioni richieste settings.protect_required_approvals_desc=Permetti solo di unire la richiesta pull con abbastanza recensioni positive. settings.protect_approvals_whitelist_enabled=Limita le approvazioni agli utenti o ai team nella whitelist settings.protect_approvals_whitelist_enabled_desc=Solo le recensioni di utenti o team nella whitelist saranno contate alle approvazioni richieste. Senza approvazione nella whitelist, le recensioni di chiunque abbia i permessi di scrittura nella repository verrá contato nelle approvazioni richieste. -settings.protect_approvals_whitelist_users=Utenti autorizzati: -settings.protect_approvals_whitelist_teams=Team nella whitelist per le revisioni: +settings.protect_approvals_whitelist_users=Utenti autorizzati +settings.protect_approvals_whitelist_teams=Team nella whitelist per le revisioni settings.dismiss_stale_approvals=Ignora impostazione vecchie settings.dismiss_stale_approvals_desc=Quando i nuovi commit che cambiano il contenuto della pull request vengono pushati nel branch, le vecchie approvazioni verranno eliminate. settings.require_signed_commits=Richiedi commit firmati @@ -2388,7 +2421,7 @@ actions = Azioni commit.operations = Operazioni issues.action_check = Seleziona/Deseleziona issues.close = Chiudi segnalazione -issues.role.collaborator = Collaboratore +issues.role.collaborator = Collaborante desc.sha256 = SHA256 editor.add = Aggiungi %s editor.update = Aggiorna %s @@ -2431,7 +2464,7 @@ settings.units.overview = Panoramica all_branches = Tutti i rami projects.column.assigned_to = Assegnato a pulls.cmd_instruction_hint = `Visualizza istruzioni per la riga di comando.` -settings.add_collaborator_blocked_them = Non si può aggiungere il collaboratore perché ha bloccato il proprietario del progetto. +settings.add_collaborator_blocked_them = Non si può aggiungere lÉ™ collaborante perché ha bloccato lÉ™ proprietariÉ™ del progetto. branch.protected_deletion_failed = Il ramo "%s" è protetto. Non può essere eliminato. branch.default_deletion_failed = Il ramo "%s" è il ramo predefinito. Non può essere eliminato. branch.tag_collision = Il ramo "%s" non può essere creato perché esiste già un'etichetta con lo stesso nome nel repositorio. @@ -2545,7 +2578,7 @@ settings.wiki_branch_rename_success = Il nome del ramo della wiki della repo è settings.wiki_branch_rename_failure = Impossibile normalizzare il nome del ramo della wiki della repo. settings.confirm_wiki_branch_rename = Rinomina il ramo della wiki settings.wiki_rename_branch_main_notices_2 = Ciò rinominerà permanentemente il ramo interno della wiki della repo di %s. Passaggi esistenti dovranno essere aggiornati. -settings.add_collaborator_blocked_our = Non si può aggiungere il collaboratore perché il proprietario del progetto lo ha bloccato. +settings.add_collaborator_blocked_our = Non si può aggiungere lÉ™ collaborante perché lÉ™ proprietariÉ™ del progetto l'ha bloccatÉ™. settings.webhook.replay.description_disabled = Per riprodurre questo richiamo HTTP, attivalo. settings.event_wiki_desc = Pagina wiki creata, rinominata, modificata o rimossa. settings.event_pull_request_review_request = Richiesta di modifica revisionata @@ -2588,7 +2621,7 @@ invisible_runes_description = `Questo file contiene caratteri Unicode invisibili issues.filter_type.reviewed_by_you = Revisionati da te projects.edit_success = Il progetto "%s" è stato aggiornato. issues.keyword_search_unavailable = La ricerca per parola chiave non è attualmente disponibile. Contatta l'amministratore del sito. -issues.role.collaborator_helper = Questo utente è stato invitato a collaborare sul progetto. +issues.role.collaborator_helper = Quest*utente è statÉ™ invitatÉ™ a collaborare al progetto. pulls.commit_ref_at = `ha fatto riferimento a questa richiesta di modifica da un commit %[2]s` settings.thread_id = ID della discussione release.title = Titolo del rilascio @@ -2629,7 +2662,7 @@ wiki.page_title = Titolo della pagina wiki.page_content = Contenuto della pagina settings.mirror_settings.pushed_repository = Repositorio immesso settings.mirror_settings.push_mirror.edit_sync_time = Modifica intervallo di sincronizzazione degli specchi -settings.units.units = Unità del repositorio +settings.units.units = Unità della repository settings.units.add_more = Aggiungi ancora... settings.wiki_globally_editable = Consenti a tutti di modificare la wiki settings.pull_mirror_sync_in_progress = Prelevando cambiamenti dal progetto remoto %s. @@ -2640,7 +2673,7 @@ settings.branches.add_new_rule = Aggiungi una nuova regola settings.actions_desc = Abilita azioni del progetto settings.new_owner_blocked_doer = Il nuovo proprietario ti ha bloccato. settings.update_settings_no_unit = Ili progetto dovrebbe consentire almeno qualche tipo di interazione. -settings.add_collaborator_owner = Non si può aggiungere un proprietario come collaboratore. +settings.add_collaborator_owner = Non si può aggiungere unÉ™ proprietariÉ™ come collaborante. branch.delete_desc = L'eliminazione di un ramo è definitiva. Nonostante il ramo eliminato potrebbe continuare ad esistere per un breve periodo di tempo prima di essere realmente eliminato, l'eliminazione NON PUÃ’ essere annullata in molti casi. Continuare? editor.invalid_commit_mail = Email invalida per creare un commit. editor.branch_does_not_exist = Non esiste nessun ramo "%s" nel repositorio. @@ -2706,11 +2739,11 @@ settings.protected_branch.save_rule = Salva regola settings.protected_branch.delete_rule = Elimina regola settings.protect_invalid_status_check_pattern = Sequenza per il controllo dello stato non valida: "%s". settings.protect_status_check_matched = Coincide -settings.protect_status_check_patterns = Sequenze per il controllo dello stato: +settings.protect_status_check_patterns = Sequenze per il controllo dello stato settings.protect_enable_merge = Abilita fusione settings.protect_enable_merge_desc = Chiunque con permesso di scrittura potrà fondere richieste di modifica in questo ramo. -settings.protect_unprotected_file_patterns = Sequenze dei file non protetti (separate da punto e virgola ";"): -settings.protect_protected_file_patterns = Sequenze dei file protetti (separate da punto e virgola ";"): +settings.protect_unprotected_file_patterns = Sequenze dei file non protetti (separate da punto e virgola ";") +settings.protect_protected_file_patterns = Sequenze dei file protetti (separate da punto e virgola ";") settings.protect_branch_name_pattern_desc = Sequenze di nome di rami protetti. Vedi la documentazione per la sintassi delle sequenze. Esempi: main, release/** settings.protect_branch_name_pattern = Sequenza nome di ramo settings.ignore_stale_approvals_desc = Non contare le approvazione fatte su vecchi commit (revisioni stantie) nel calcolo delle approvazioni della RM. Irrilevante se le revisioni stantie sono già state respinte. @@ -2718,9 +2751,9 @@ settings.ignore_stale_approvals = Ignora approvazioni stantie settings.protected_branch_required_rule_name = Nome regola richiesta settings.protect_status_check_patterns_desc = Inserisci sequenze per specificare quali controlli dello stato devono passare prima che i rami possano essere fusi con i rami che soddisfano questa regola. Ogni riga specifica una sequenza. Le sequenze non possono essere vuote. settings.authorization_header_desc = Verrà inclusa come intestazione dell'autorizzazione per le richieste quando presente. Esempi: %s. -pulls.title_desc_one = vuole fondere %[1]d commit da %[2]s in %[3]s +pulls.title_desc_one = vuole fondere %[1]d commit da %[2]s in %[3]s settings.protect_unprotected_file_patterns_desc = File non protetti dei quali è consentita la modifica direttamente se l'utente ha permesso di scrittura, saltandole restrizioni di immissione. Più sequenze possono essere separate usando il punto e virgola (";"). Vedi la documentazione su %[2]s per la sintassi delle sequenze glob. Esempi .drone.yml, /docs/**/*.txt. -settings.protect_protected_file_patterns_desc = I file non protetti non possono essere modificati direttamente neanche se l'utente ha il permesso di aggiungere, modificare o eliminare file in questo ramo. Più sequenze possono essere separate usando il punto e virgola (";"). Vedi la documentazione su github.com/gobwas/glob per la sintassi della sequenze. Esempi: .drone.yml, /docs/**/*.txt. +settings.protect_protected_file_patterns_desc = I file non protetti non possono essere modificati direttamente neanche se l'utente ha il permesso di aggiungere, modificare o eliminare file in questo ramo. Più sequenze possono essere separate usando il punto e virgola (";"). Vedi la documentazione su %s per la sintassi della sequenze. Esempi: .drone.yml, /docs/**/*.txt. settings.protect_no_valid_status_check_patterns = Nessuna sequenza valida per il controllo dello stato. settings.event_pull_request_review_request_desc = Richiesta la revisione della richiesta di modifica o richiesta di revisione rimossa. stars = Stelle @@ -2759,9 +2792,9 @@ settings.matrix.access_token_helper = È consigliata l'impostazione di un accoun issues.author.tooltip.issue = Questo utente è l'autore di questa segnalazione. form.string_too_long = La stringa data è più lunga di %d caratteri. project = Progetti -issues.edit.already_changed = Impossibile salvare le modifiche al problema. Sembra che il contenuto sia già stato modificato da un altro utente. Aggiornare la pagina e provare a modificare nuovamente per evitare di sovrascrivere le modifiche +issues.edit.already_changed = Impossibile salvare le modifiche alla segnalazione. Sembra che il contenuto sia già stato modificato da un*altrÉ™ utente. Aggiornare la pagina e provare a modificare nuovamente per evitare di sovrascrivere le modifiche subscribe.pull.guest.tooltip = Accedi per iscriverti a questa richiesta di modifica. -subscribe.issue.guest.tooltip = Accedere per sottoscrivere questo problema. +subscribe.issue.guest.tooltip = Accedere per seguire questa segnalazione. n_release_one = rilascio %s n_release_few = rilasci %s issues.author.tooltip.pr = Quest'utente è l'autorÉ™ di questa richiesta di modifica. @@ -2778,6 +2811,7 @@ pulls.edit.already_changed = Impossibile salvare le modifiche alla richiesta. Se wiki.search = Cerca nel wiki wiki.no_search_results = Nessun risultato mirror_use_ssh.helper = Selezionando quest'opzione, Forgejo replicherà il repositorio tramite Git con SSH e creerà un paio di chiavi per te. Assicurati che la chiave pubblica generata sia autorizzata per l'immissione nel repositorio di destinazione. Non puoi usare l'autorizzazione tramite password se selezioni quest'opzione. +archive.pull.noreview = Il repositorio è archiviato. Non puoi revisionare le richieste di modifica. [graphs] contributors.what = contribuzioni @@ -2868,7 +2902,7 @@ teams.read_access_helper=I membri possono visualizzare e clonare i repository de teams.write_access=Scrittura teams.write_access_helper=I membri possono leggere e pushare sui repository del team. teams.admin_access=Accesso amministratore -teams.admin_access_helper=I membri possono pullare e pushare sulle repository del team e anche aggiungere collaboratori. +teams.admin_access_helper=I membri possono prelevare e immettere sui repositori del team e aggiungere collaboranti. teams.no_desc=Questo team non ha alcuna descrizione teams.settings=Impostazioni teams.owners_permission_desc=I proprietari hanno pieno accesso a tutti i repository e hanno diritti di amministratore nell'organizzazione. @@ -2881,7 +2915,7 @@ teams.delete_team_desc=Eliminare un team revocherà l'accesso al repository da p teams.delete_team_success=Il team è stato eliminato. teams.read_permission_desc=Questo team concede l'accesso di lettura: i membri possono visualizzare e clonare i repository del team. teams.write_permission_desc=Questo team concede l'accesso di Scrittura: i membri possono leggere da e pushare sui repository del team. -teams.admin_permission_desc=Questo team concede l'accesso di Amministratore: i membri possono leggere da, pushare su e aggiungere collaboratori ai repository del team. +teams.admin_permission_desc=Questo team concede l'accesso di Amministrante: i membri possono leggere da, immettere in e aggiungere collaboranti ai repositori del team. teams.create_repo_permission_desc=Inoltre, questo team concede il permesso di Creare repository: i membri possono creare nuove repository nell'organizzazione. teams.repositories=Progetti della squadra teams.search_repo_placeholder=Ricerca repository… @@ -3200,7 +3234,7 @@ auths.tip.google_plus=Ottieni le credenziali del client OAuth2 dalla console API auths.tip.openid_connect=Utilizza l'OpenID Connect Discovery URL (/.well-known/openid-configuration) per specificare gli endpoint auths.tip.twitter=Vai su %s, crea una applicazione e assicurati che l'opzione "Allow this application to be used to Sign In with Twitter" sia abilitata auths.tip.discord=Registra una nuova applicazione su %s -auths.tip.yandex=`Crea una nuova applicazione su %s. Seleziona i seguenti permessi da "Yandex. assport API": "Access to email address", "Access to user avatar" e "Access to username, name and surname, gender"` +auths.tip.yandex=`Crea una nuova applicazione su %s. Seleziona i seguenti permessi da "Yandex.Passport API": "Access to email address", "Access to user avatar" e "Access to username, name and surname, gender"` auths.tip.mastodon=Inserisci un URL di istanza personalizzato per l'istanza mastodon con cui vuoi autenticarti (o usa quella predefinita) auths.edit=Modifica fonte di autenticazione auths.activated=Questa fonte di autenticazione è attiva @@ -3442,13 +3476,13 @@ auths.tips.gmail_settings = Impostazioni Gmail: config.test_mail_failed = Impossibile inviare email di prova a "%s": %v users.details = Dettagli dell'utente monitor.queue.review_add = Revisiona / aggiungi lavoratori -self_check.no_problem_found = Nessun problema trovato. +self_check.no_problem_found = Non c'è ancora nessuna segnalazione. self_check.database_inconsistent_collation_columns = La base di dati sta usando la collazione %s ma queste colonne usano una collazione diversa. Potrebbe causare problemi imprevisti. monitor.queue.settings.remove_all_items = Rimuovi tutto monitor.queue.settings.desc = Le piscine crescono dinamicamente in risposta al blocco dei lavoratori in coda. monitor.queue.settings.remove_all_items_done = Tutti gli elementi in coda sono stati rimossi. self_check.database_collation_mismatch = Pretendi che la base di dati usi la collazione: %s -self_check.database_fix_mysql = Per utenti MySQL/MariaDB, potresti usare il comando "gitea doctor convert" per risolvere problemi di collazione, o potresti risolvere il problema manualmente tramite SQL con "ALTER ... COLLATE ...". +self_check.database_fix_mysql = Per utenti MySQL/MariaDB, potresti usare il comando "forgejo doctor convert" per risolvere problemi di collazione, o potresti risolvere il problema manualmente tramite SQL con "ALTER ... COLLATE ...". self_check.database_collation_case_insensitive = La base di dati sta usando la collazione %s, che è una collazione insensibile. Nonostante Forgejo potrebbe lavorarci, ci potrebbero essere rari casi che non vanno come previsto. auths.tip.gitlab_new = Registra una nuova applicazione su %s config_summary = Riepilogo @@ -3460,13 +3494,14 @@ config.cache_test_succeeded = Successo nel controllo della cache, ottenuta una r config.cache_test_slow = Successo nel controllo della cache, ma la risposta è lenta: %s. config.app_slogan = Slogan dell'istanza auths.default_domain_name = Nome di dominio predefinito utilizzato per l'indirizzo e-mail +users.restricted.description = Permetti di interagire solo con i repositori e le organizzazioni in cui l'utente è aggiuntÉ™ come collaborante. Ciò evita l'accesso ai repositori pubblici di quest'istanza. [action] create_repo=ha creato il repository %s rename_repo=repository rinominato da %[1]s a [3]s create_issue=`ha aperto la segnalazione %[3]s#%[2]s` -close_issue=`ha chiuso il problema %[3]s#%[2]s` +close_issue=`ha chiuso la segnalazione %[3]s#%[2]s` reopen_issue=`ha riaperto la segnalazione %[3]s#%[2]s` create_pull_request=`ha creato la pull request %[3]s#%[2]s` close_pull_request=`ha chiuso la pull request %[3]s#%[2]s` @@ -3721,9 +3756,6 @@ creation.success = Il segreto "%s" è stato aggiungo. deletion.success = Il segreto è stato rimosso. [actions] - - - runners.id=ID runners.name=Nome runners.owner_type=Tipo @@ -3828,7 +3860,6 @@ type-1.display_name = Progetto individuale type-2.display_name = Progetto [git.filemode] -; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … symbolic_link=Link Simbolico submodule = Submodule directory = Directory @@ -3863,6 +3894,10 @@ exact_tooltip = Includi solo i risultati che corrispondono esattamente al termin issue_kind = Cerca segnalazioni... pull_kind = Cerca richieste... exact = Esatto +milestone_kind = Ricerca tappe... +regexp_tooltip = Interpreta i termini di ricerca come un'espressione regolare +regexp = Espressione Regolare +union_tooltip = Include i risultati che combaciano con una qualsiasi delle parole chiave separata da spazi [munits.data] gib = GiB @@ -3876,4 +3911,9 @@ b = B [markup] filepreview.lines = Linee da %[1]d a %[2]d in %[3]s filepreview.truncated = L'anteprima è stata troncata -filepreview.line = Linea %[1]d in %[2]s \ No newline at end of file +filepreview.line = Linea %[1]d in %[2]s + + +[repo.permissions] +issues.write = Scrittura: Chiudere segnalazioni e gestire metadati come etichette, traguardi, assegnatarÉœ, scadenze e dipendenze. +pulls.write = Scrittura: Chiudere richieste di modifica e gestire metadati come etichette, traguardi, assegnatarÉœ, scadenze e dipendenze. \ No newline at end of file diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index f53356ee71..32caac1371 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -158,6 +158,16 @@ filter.not_template = テンプレートã§ã¯ãªã„ invalid_data = 無効ãªãƒ‡ãƒ¼ã‚¿: %v more_items = ã•らã«è¡¨ç¤º copy_generic = クリップボードã¸ã‚³ãƒ”ー +new_repo.title = æ–°ã—ã„リãƒã‚¸ãƒˆãƒª +new_migrate.title = æ–°ã—ã„マイグレーション +new_org.title = æ–°ã—ã„組織 +new_repo.link = æ–°ã—ã„リãƒã‚¸ãƒˆãƒª +new_migrate.link = æ–°ã—ã„マイグレーション +new_org.link = æ–°ã—ã„組織 +test = テスト +error413 = 割り当ã¦é‡ã‚’使ã„切りã—ã¾ã—ãŸã€‚ + +copy_path = パスをコピー [aria] navbar=ナビゲーションãƒãƒ¼ @@ -189,6 +199,8 @@ buttons.ref.tooltip=イシューã¾ãŸã¯ãƒ—ルリクエストをå‚ç…§ buttons.switch_to_legacy.tooltip=レガシーエディタを使用ã™ã‚‹ buttons.enable_monospace_font=等幅フォントを有効ã«ã™ã‚‹ buttons.disable_monospace_font=等幅フォントを無効ã«ã™ã‚‹ +buttons.unindent.tooltip = アイテムを1ã¤ãšã¤ãƒã‚¹ãƒˆã®è§£é™¤ã‚’ã™ã‚‹ +buttons.indent.tooltip = アイテムを1ã¤ãšã¤ãƒã‚¹ãƒˆã™ã‚‹ [filter] string.asc=A - Z @@ -208,7 +220,6 @@ app_desc=自分ã§ç«‹ã¦ã‚‹ã€è¶…ç°¡å˜ Git サービス install=ç°¡å˜ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ« install_desc=シンプルã«ã€ãƒ—ラットフォームã«å¿œã˜ã¦ãƒã‚¤ãƒŠãƒªã‚’実行ã—ãŸã‚Šã€Dockerã§å‹•ã‹ã—ãŸã‚Šã€ãƒ‘ッケージを使ã†ã ã‘。 platform=クロスプラットフォーム -platform_desc=Forgejoã¯Goã§ã‚³ãƒ³ãƒ‘イルã§ãる環境ãªã‚‰ã©ã“ã§ã‚‚å‹•ãã¾ã™: Windowsã€macOSã€Linuxã€ARM等々ã€å¥½ããªã‚‚ã®ã‚’é¸ã‚“ã§ãã ã•ã„! lightweight=è»½é‡ lightweight_desc=Forgejo ã®æœ€å°å‹•作è¦ä»¶ã¯å°ã•ãã¦ã€å®‰ä¾¡ãª Raspberry Pi ã§ã‚‚å‹•ãã¾ã™ã€‚エãƒãƒ«ã‚®ãƒ¼æ¶ˆè²»ã‚’節約ã—ã¾ã—ょã†! license=オープンソース @@ -245,7 +256,7 @@ err_admin_name_is_invalid=管ç†è€…ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åãŒä¸æ­£ã§ã™ general_title=基本設定 app_name=インスタンスå -app_name_helper=伿¥­åã‚’ã“ã“ã«å…¥ã‚Œã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ +app_name_helper=ã“ã“ã«ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åを入力ã—ã¾ã™ã€‚ã“れã¯ã™ã¹ã¦ã®ãƒšãƒ¼ã‚¸ã«è¡¨ç¤ºã•れã¾ã™ã€‚ repo_path=リãƒã‚¸ãƒˆãƒªã®ãƒ«ãƒ¼ãƒˆãƒ‘ス repo_path_helper=リモートGitリãƒã‚¸ãƒˆãƒªã¯ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ä¿å­˜ã•れã¾ã™ã€‚ lfs_path=Git LFSルートパス @@ -279,7 +290,7 @@ offline_mode.description=外部ã®CDNサービスを使ã‚ãšã€ã™ã¹ã¦ã®ãƒª disable_gravatar=Gravatarを無効ã«ã™ã‚‹ disable_gravatar.description=Gravatarã¨å¤–部ã®ã‚¢ãƒã‚¿ãƒ¼ã‚½ãƒ¼ã‚¹ã‚’無効ã«ã—ã¾ã™ã€‚ ã‚¢ãƒã‚¿ãƒ¼ã‚’ローカルã«ã‚¢ãƒƒãƒ—ロードã—ã¦ã„ãªã„ユーザーã«ã¯ã€ãƒ‡ãƒ•ォルトã®ã‚¢ãƒã‚¿ãƒ¼ãŒä½¿ç”¨ã•れã¾ã™ã€‚ federated_avatar_lookup=フェデレーテッド・アãƒã‚¿ãƒ¼ã‚’有効ã«ã™ã‚‹ -federated_avatar_lookup.description=Libravatarを使用ã—ãŸãƒ•ェデレーテッド・アãƒã‚¿ãƒ¼æ¤œç´¢ã‚’有効ã«ã—ã¾ã™ã€‚ +federated_avatar_lookup.description=Libravatar を使用ã—ã¦ã‚¢ãƒã‚¿ãƒ¼ã‚’検索ã—ã¾ã™ã€‚ disable_registration=セルフ登録を無効ã«ã™ã‚‹ disable_registration.description=管ç†è€…ã ã‘ãŒæ–°ã—ã„ユーザー アカウントを作æˆã§ãã¾ã™ã€‚誰もãŒåˆ©ç”¨ã§ãるパブリックインスタンスをホストã—ã€å¤§é‡ã®ã‚¹ãƒ‘ムアカウントã«å¯¾å‡¦ã™ã‚‹æº–å‚™ãŒã§ãã¦ã„ãªã„é™ã‚Šã€ç™»éŒ²ã‚’無効ã«ã—ã¦ãŠãã“ã¨ã‚’å¼·ããŠå‹§ã‚ã—ã¾ã™ã€‚ allow_only_external_registration.description=設定ã•れãŸå¤–部サービスを使用ã—ã¦ã®ã¿æ–°ã—ã„アカウントを作æˆã§ãã¾ã™ã€‚ @@ -398,14 +409,14 @@ forgot_password_title=パスワードを忘れ㟠forgot_password=パスワードをãŠå¿˜ã‚Œã§ã™ã‹ï¼Ÿ sign_up_now=アカウントãŒå¿…è¦ã§ã™ã‹ï¼Ÿ 今ã™ã登録ã—ã¾ã—ょã†ã€‚ sign_up_successful=アカウントã¯ç„¡äº‹ã«ä½œæˆã•れã¾ã—ãŸã€‚よã†ã“ã! -confirmation_mail_sent_prompt=%s ã«ç¢ºèªãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ã¾ã—ãŸã€‚ %s以内ã«å—信トレイを確èªã—ã€ç™»éŒ²æ‰‹ç¶šãを完了ã—ã¦ãã ã•ã„。 +confirmation_mail_sent_prompt=æ–°ã—ã„確èªãƒ¡ãƒ¼ãƒ«ãŒ %s ã«é€ä¿¡ã•れã¾ã—ãŸã€‚登録プロセスを完了ã™ã‚‹ã«ã¯ã€å—信トレイを確èªã—〠%s ä»¥å†…ã«æä¾›ã•れãŸãƒªãƒ³ã‚¯ã‚’クリックã—ã¦ä¸‹ã•ã„。メールãŒé–“é•ã£ã¦ã„ã‚‹å ´åˆã¯ã€ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦åˆ¥ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ç¢ºèªãƒ¡ãƒ¼ãƒ«ã‚’å†é€ä¿¡ã™ã‚‹ã‚ˆã†ãƒªã‚¯ã‚¨ã‚¹ãƒˆã§ãã¾ã™ã€‚ must_change_password=ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ã®æ›´æ–° allow_password_change=ユーザーã¯ãƒ‘スワードã®å¤‰æ›´ãŒå¿…è¦ (推奨) -reset_password_mail_sent_prompt=%s ã«ç¢ºèªãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ã¾ã—ãŸã€‚ %s以内ã«å—信トレイを確èªã—ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå›žå¾©æ‰‹ç¶šãを完了ã—ã¦ãã ã•ã„。 +reset_password_mail_sent_prompt=確èªãƒ¡ãƒ¼ãƒ«ãŒ %s ã«é€ä¿¡ã•れã¾ã—ãŸã€‚アカウント回復手続ãを完了ã™ã‚‹ã«ã¯ã€å—信トレイを確èªã—ã€%s ä»¥å†…ã«æä¾›ã•れãŸãƒªãƒ³ã‚¯ã«å¾“ã£ã¦ãã ã•ã„。 active_your_account=ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®æœ‰åŠ¹åŒ– account_activated=アカウントãŒã‚¢ã‚¯ãƒ†ã‚£ãƒ™ãƒ¼ãƒˆã•れã¾ã—㟠-prohibit_login=ã‚µã‚¤ãƒ³ã‚¤ãƒ³ç¦æ­¢ -prohibit_login_desc=ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã‚’ç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚ サイト管ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 +prohibit_login=アカウントãŒåœæ­¢ã•れã¾ã—㟠+prohibit_login_desc=ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã¨ã®ã‚„りå–りãŒåœæ­¢ã•れã¦ã„ã¾ã™ã€‚アクセスを回復ã™ã‚‹ã«ã¯ã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ç®¡ç†è€…ã«å•ã„åˆã‚ã›ã¦ãã ã•ã„。 resent_limit_prompt=å°‘ã—å‰ã«ã€ã‚ãªãŸã‹ã‚‰ã‚¢ã‚¯ãƒ†ã‚£ãƒ™ãƒ¼ã‚·ãƒ§ãƒ³ãƒ¡ãƒ¼ãƒ«ãŒè¦æ±‚ã•れã¦ã„ã¾ã™ã€‚ 3分待ã£ãŸã®ã¡ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 has_unconfirmed_mail=ã“ã‚“ã«ã¡ã¯ %s ã•ã‚“ã€ã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ« アドレス (%s) ã¯ç¢ºèªãŒã¨ã‚Œã¦ã„ã¾ã›ã‚“。 確èªãƒ¡ãƒ¼ãƒ«ã‚’å—ã‘å–ã£ã¦ã„ãªã„å ´åˆã‚„ã€æ”¹ã‚ã¦é€ä¿¡ã—ãŸã„å ´åˆã¯ã€ä¸‹ã®ãƒœã‚¿ãƒ³ã‚’クリックã—ã¦ãã ã•ã„。 resend_mail=アクティベーションメールをå†é€ä¿¡ã™ã‚‹ã«ã¯ã“ã“をクリック @@ -448,7 +459,7 @@ email_domain_blacklisted=ã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã¯ç™»éŒ²ã™ã‚‹ã“ authorize_application=ã‚¢ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚’è¨±å¯ authorize_redirect_notice=ã“ã®ã‚¢ãƒ—リケーションを許å¯ã™ã‚‹ã¨ %s ã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã—ã¾ã™ã€‚ authorize_application_created_by=ã“ã®ã‚¢ãƒ—リケーション㯠%s ãŒä½œæˆã—ã¾ã—ãŸã€‚ -authorize_application_description=アクセスを許å¯ã™ã‚‹ã¨ã€ã“ã®ã‚¢ãƒ—リケーションã¯ã€ãƒ—ライベート リãƒã‚¸ãƒˆãƒªã‚„組織をå«ã‚€ã‚ãªãŸã®ã™ã¹ã¦ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆæƒ…å ±ã«å¯¾ã—ã¦ã€ã‚¢ã‚¯ã‚»ã‚¹ã¨æ›¸ãè¾¼ã¿ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ +authorize_application_description=アクセスを許å¯ã™ã‚‹ã¨ã€ãƒ—ライベートリãƒã‚¸ãƒˆãƒªã‚„組織をå«ã‚€ã™ã¹ã¦ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆæƒ…å ±ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦æ›¸ã込むã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ authorize_title=`"%s"ã«ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¾ã™ã‹ï¼Ÿ` authorization_failed=èªå¯å¤±æ•— authorization_failed_desc=無効ãªãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’検出ã—ãŸãŸã‚èªå¯ãŒå¤±æ•—ã—ã¾ã—ãŸã€‚ èªå¯ã—よã†ã¨ã—ãŸã‚¢ãƒ—リã®é–‹ç™ºè€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。 @@ -461,6 +472,12 @@ change_unconfirmed_email_summary = アクティベーションメールã®é€ä¿¡ last_admin=最後ã®ç®¡ç†è€…ã¯å‰Šé™¤ã§ãã¾ã›ã‚“。少ãªãã¨ã‚‚一人ã®ç®¡ç†è€…ãŒå¿…è¦ã§ã™ã€‚ tab_signin = サインイン tab_signup = サインアップ +sign_in_openid = OpenIDã§ç¶šè¡Œ +back_to_sign_in = ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã«æˆ»ã‚‹ +unauthorized_credentials = è³‡æ ¼æƒ…å ±ãŒæ­£ã—ããªã„ã‹ã€æœŸé™ãŒåˆ‡ã‚Œã¦ã„ã¾ã™ã€‚コマンドをå†è©¦è¡Œã™ã‚‹ã‹ã€è©³ç´°ã«ã¤ã„ã¦ã¯ %s ã‚’å‚ç…§ã—ã¦ãã ã•ã„ +sign_up_button = 今ã™ã登録ã—ã¦ä¸‹ã•ã„。 +hint_login = ã™ã§ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’ãŠæŒã¡ã§ã™ã‹? 今ã™ãサインイン! +hint_register = アカウントãŒå¿…è¦ã§ã™ã‹? 今ã™ã登録ã—ã¦ãã ã•ã„。 [mail] view_it_on=%s ã§è¦‹ã‚‹ @@ -530,6 +547,21 @@ team_invite.text_3=注: ã“ã®æ‹›å¾…㯠%[1]s å®›ã§ã™ã€‚ 招待ã«å¿ƒå½“ãŸã‚Š admin.new_user.user_info = ユーザー情報 admin.new_user.subject = æ–°ã—ã„ユーザー〠%sãŒã‚µã‚¤ãƒ³ã‚¢ãƒƒãƒ—ã—ã¾ã—㟠admin.new_user.text = 管ç†ãƒ‘ãƒãƒ«ã‹ã‚‰ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’管ç†ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¦ãã ã•ã„。 +totp_enrolled.text_1.has_webauthn = アカウント㧠TOTP ãŒæœ‰åйã«ãªã‚Šã¾ã—ãŸã€‚今後ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¸ã®ãƒ­ã‚°ã‚¤ãƒ³ã§ã€2è¦ç´ èªè¨¼ã¨ã—㦠TOTP を使用ã—ãŸã‚Šã€ä»»æ„ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ キーを使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ +totp_enrolled.subject = 2è¦ç´ èªè¨¼ã¨ã—ã¦TOTPを有効ã«ã—ã¾ã—㟠+totp_enrolled.text_1.no_webauthn = アカウント㧠TOTP ãŒæœ‰åйã«ãªã‚Šã¾ã—ãŸã€‚今後アカウントã«ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹ã¨ãã«ã€2è¦ç´ èªè¨¼ã¨ã—㦠TOTP を使用ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ +password_change.text_1 = アカウントã®ãƒ‘スワードãŒå¤‰æ›´ã•れã¾ã—ãŸã€‚ +password_change.subject = パスワードãŒå¤‰æ›´ã•れã¾ã—㟠+primary_mail_change.subject = プライマリメールãŒå¤‰æ›´ã•れã¾ã—㟠+primary_mail_change.text_1 = ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ãƒ—ライマリメール㌠%[1]s ã«å¤‰æ›´ã•れã¾ã—ãŸã€‚ã“れã«ã‚ˆã‚Šã€ã“ã®é›»å­ãƒ¡ãƒ¼ãƒ« アドレスã¯ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«é–¢ã™ã‚‹é›»å­ãƒ¡ãƒ¼ãƒ«é€šçŸ¥ã‚’å—ä¿¡ã—ãªããªã‚Šã¾ã™ã€‚ +totp_disabled.subject = TOTPãŒç„¡åйã«ãªã‚Šã¾ã—㟠+totp_disabled.text_1 = ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®æ™‚間ベースã®ãƒ¯ãƒ³ã‚¿ã‚¤ãƒ ãƒ‘スワード (TOTP) ãŒç„¡åйã«ãªã‚Šã¾ã—ãŸã€‚ +totp_disabled.no_2fa = ä»–ã® 2è¦ç´ èªè¨¼ã¯è¨­å®šã•れã¦ã„ãªã„ãŸã‚ã€2è¦ç´ èªè¨¼ã‚’使用ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹å¿…è¦ã¯ãªããªã‚Šã¾ã—ãŸã€‚ +removed_security_key.subject = セキュリティキーãŒå‰Šé™¤ã•れã¾ã—㟠+removed_security_key.text_1 = セキュリティキー "%[1]s" ãŒã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‹ã‚‰å‰Šé™¤ã•れã¾ã—ãŸã€‚ +account_security_caution.text_1 = ã‚‚ã—ã“れãŒã‚ãªãŸã®æ“作ã§ã‚れã°ã€ã“ã®ãƒ¡ãƒ¼ãƒ«ã¯ç„¡è¦–ã—ã¦ã‚‚å•題ã‚りã¾ã›ã‚“。 +account_security_caution.text_2 = ã‚‚ã—ã“れãŒã‚ãªãŸã®æ“作ã§ãªã„å ´åˆã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒä¸æ­£åˆ©ç”¨ã•れã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ã“ã®ã‚µã‚¤ãƒˆã®ç®¡ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。 +removed_security_key.no_2fa = ä»–ã® 2è¦ç´ èªè¨¼ã¯è¨­å®šã•れã¦ã„ãªã„ãŸã‚ã€2è¦ç´ èªè¨¼ã‚’使用ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹å¿…è¦ã¯ãªããªã‚Šã¾ã—ãŸã€‚ [modal] yes=ã¯ã„ @@ -628,10 +660,9 @@ org_still_own_repo=組織ã¯ã¾ã 1ã¤ä»¥ä¸Šã®ãƒªãƒã‚¸ãƒˆãƒªã‚’所有ã—ã¦ã„ org_still_own_packages=組織ã¯ã¾ã 1ã¤ä»¥ä¸Šã®ãƒ‘ッケージを所有ã—ã¦ã„ã¾ã™ã€‚ å…ˆã«ãれらを削除ã—ã¦ãã ã•ã„。 target_branch_not_exist=ターゲットã®ãƒ–ランãƒãŒå­˜åœ¨ã—ã¦ã„ã¾ã›ã‚“。 -admin_cannot_delete_self = 管ç†è€…ã§ã‚ã‚‹å ´åˆã€è‡ªåˆ†è‡ªèº«ã‚’削除ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。最åˆã«ç®¡ç†è€…権é™ã‚’削除ã—ã¦ãã ã•ã„。 +admin_cannot_delete_self=ã‚ãªãŸãŒç®¡ç†è€…ã§ã‚ã‚‹å ´åˆã€è‡ªåˆ†è‡ªèº«ã‚’削除ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。最åˆã«ç®¡ç†è€…権é™ã‚’削除ã—ã¦ãã ã•ã„。 username_error_no_dots = `英数字 (「0-9ã€ã€ã€Œa-zã€ã€ã€ŒA-Zã€)ã€ãƒ€ãƒƒã‚·ãƒ¥ (「-ã€)ã€ãŠã‚ˆã³ã‚¢ãƒ³ãƒ€ãƒ¼ã‚¹ã‚³ã‚¢ (「_ã€) ã®ã¿ã‚’å«ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚è‹±æ•°å­—ä»¥å¤–ã®æ–‡å­—ã§é–‹å§‹ã¾ãŸã¯çµ‚了ã™ã‚‹ã“ã¨ã¯ã§ããšã€é€£ç¶šã—ãŸè‹±æ•°å­—ä»¥å¤–ã®æ–‡å­—ã‚‚ç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚` -admin_cannot_delete_self=ã‚ãªãŸãŒç®¡ç†è€…ã§ã‚ã‚‹å ´åˆã€è‡ªåˆ†è‡ªèº«ã‚’削除ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。最åˆã«ç®¡ç†è€…権é™ã‚’削除ã—ã¦ãã ã•ã„。 unset_password = ログインã—ãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ãƒ‘スワードãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“。 unsupported_login_type = ã“ã®ãƒ­ã‚°ã‚¤ãƒ³ã‚¿ã‚¤ãƒ—ã§ã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®å‰Šé™¤ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。 required_prefix = "%s"ã‹ã‚‰å§‹ã¾ã‚‹å¿…è¦ãŒã‚りã¾ã™ @@ -668,16 +699,24 @@ settings=ユーザー設定 form.name_reserved=ユーザーå "%s" ã¯äºˆç´„ã•れã¦ã„ã¾ã™ã€‚ form.name_pattern_not_allowed=`"%s" ã®å½¢å¼ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼åã«ä½¿ç”¨ã§ãã¾ã›ã‚“。` form.name_chars_not_allowed=ユーザーå "%s" ã«ã¯ç„¡åŠ¹ãªæ–‡å­—ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ -block_user.detail_2 = ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã€ãƒªãƒã‚¸ãƒˆãƒªã€ä½œæˆã•れãŸã‚¤ã‚·ãƒ¥ãƒ¼ã€ã‚³ãƒ¡ãƒ³ãƒˆã‚’æ“作ã§ãã¾ã›ã‚“。 -block_user.detail_1 = ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‹ã‚‰ã®ãƒ•ォローãŒè§£é™¤ã•れã¦ã„ã¾ã™ã€‚ +block_user.detail_2 = ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã€ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ãƒªãƒã‚¸ãƒˆãƒªã‚„ã€ã‚ãªãŸãŒä½œæˆã—ãŸå•題やコメントをæ“作ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 +block_user.detail_1 = ãŠäº’ã„ã®ãƒ•ォローãŒåœæ­¢ã•れã€ãƒ•ォローã§ããªããªã‚Šã¾ã™ã€‚ follow_blocked_user = ã‚ãªãŸã¯ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’フォローã§ãã¾ã›ã‚“。ãªãœãªã‚‰ã€ã‚ãªãŸã¯ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’ブロックã—ãŸã‹ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã‚ãªãŸã‚’ブロックã—ã¦ã„ã‚‹ã‹ã‚‰ã§ã™ã€‚ -block_user.detail_3 = ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã‚ãªãŸã‚’コラボレーターã¨ã—ã¦è¿½åŠ ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ã—ã€ã‚ãªãŸã‚‚彼らをコラボレーターã«è¿½åŠ ã§ãã¾ã›ã‚“。 +block_user.detail_3 = ãŠäº’ã„をリãƒã‚¸ãƒˆãƒªã®å…±åŒä½œæ¥­è€…ã¨ã—ã¦è¿½åŠ ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 block_user = ユーザーをブロック unblock = ブロックを解除 block = ブロック -block_user.detail = ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’ブロックã—ãŸå ´åˆã€ä¸‹è¨˜ã®äº‹ãªã©ãŒèµ·ã“りã¾ã™ã€‚例ãˆã°ï¼š +block_user.detail = ユーザーをブロックã™ã‚‹ã¨ã€æ¬¡ã®ã‚ˆã†ãªå½±éŸ¿ãŒã‚りã¾ã™ï¼š 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 = ã“ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティã¯ç®¡ç†è€…ã§ã‚ã‚‹ã‚ãªãŸã«ã¯è¡¨ç¤ºã•れã¾ã™ãŒã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯éžå…¬é–‹ã«ã—ãŸã„ã¨è€ƒãˆã¦ã„ã¾ã™ã€‚ +following.title.one = フォロー中 +following.title.few = フォロー中 +followers.title.one = フォロワー +followers.title.few = フォロワー [settings] profile=プロフィール @@ -787,12 +826,12 @@ add_new_email=æ–°ã—ã„メールアドレスを追加 add_new_openid=æ–°ã—ã„OpenID URIを追加 add_email=メールアドレスを追加 add_openid=OpenID URIを追加ã™ã‚‹ -add_email_confirmation_sent=`"%s" ã«ç¢ºèªãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ã¾ã—ãŸã€‚ %s以内ã«å—信トレイを確èªã—ã€ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ç¢ºèªã‚’行ã£ã¦ãã ã•ã„。` +add_email_confirmation_sent=確èªãƒ¡ãƒ¼ãƒ«ãŒ"%s"ã«é€ä¿¡ã•れã¾ã—ãŸã€‚メールアドレスを確èªã™ã‚‹ã«ã¯ã€å—信トレイを確èªã—ã€%sä»¥å†…ã«æä¾›ã•れãŸãƒªãƒ³ã‚¯ã‚’クリックã—ã¦ãã ã•ã„。 add_email_success=æ–°ã—ã„メールアドレスを追加ã—ã¾ã—ãŸã€‚ email_preference_set_success=メール設定をä¿å­˜ã—ã¾ã—ãŸã€‚ add_openid_success=æ–°ã—ã„OpenIDアドレスを追加ã—ã¾ã—ãŸã€‚ keep_email_private=メールアドレスを隠㙠-keep_email_private_popup=ã“れã«ã‚ˆã‚Šãƒ—ロフィールã§ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒéš ã•れã€Webインターフェースã§ã®ãƒ—ルリクエスト作æˆã‚„ファイル編集ã§ã‚‚メールアドレスãŒéš ã•れã¾ã™ã€‚ プッシュ済ã¿ã®ã‚³ãƒŸãƒƒãƒˆã¯å¤‰æ›´ã•れã¾ã›ã‚“。 +keep_email_private_popup=ã“れã«ã‚ˆã‚Šã€ãƒ—ロフィールã‹ã‚‰ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒéžè¡¨ç¤ºã«ãªã‚Šã¾ã™ã€‚ファイルã®ã‚¢ãƒƒãƒ—ロードや編集ãªã©ã€ã‚¦ã‚§ãƒ–インターフェース経由ã§è¡Œã‚れるコミットã®ãƒ‡ãƒ•ォルトã¨ã—ã¦ä½¿ç”¨ã•れãªããªã‚Šã€ãƒžãƒ¼ã‚¸ã‚³ãƒŸãƒƒãƒˆã«ã‚‚使用ã•れã¾ã›ã‚“。代ã‚りã«ã€ã‚³ãƒŸãƒƒãƒˆã‚’ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«é–¢é€£ä»˜ã‘ã‚‹ãŸã‚ã«ç‰¹åˆ¥ãªã‚¢ãƒ‰ãƒ¬ã‚¹%sを使用ã§ãã¾ã™ã€‚ã“ã®ã‚ªãƒ—ションを変更ã—ã¦ã‚‚ã€æ—¢å­˜ã®ã‚³ãƒŸãƒƒãƒˆã«ã¯å½±éŸ¿ã—ãªã„ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。 openid_desc=OpenIDを使ã†ã¨å¤–部プロãƒã‚¤ãƒ€ãƒ¼ã«èªè¨¼ã‚’委任ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ manage_ssh_keys=SSHキーã®ç®¡ç† @@ -895,7 +934,7 @@ select_permissions=許å¯ã®é¸æŠž permission_no_access=アクセスä¸å¯ permission_read=読ã¿å–り permission_write=読ã¿å–ã‚Šã¨æ›¸ã込㿠-access_token_desc=é¸æŠžã—ãŸãƒˆãƒ¼ã‚¯ãƒ³æ¨©é™ã«å¿œã˜ã¦ã€é–¢é€£ã™ã‚‹APIルートã®ã¿ã«è¨±å¯ãŒåˆ¶é™ã•れã¾ã™ã€‚ 詳細ã¯ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’å‚ç…§ã—ã¦ãã ã•ã„。 +access_token_desc=é¸æŠžã—ãŸãƒˆãƒ¼ã‚¯ãƒ³æ¨©é™ã«å¿œã˜ã¦ã€é–¢é€£ã™ã‚‹APIルートã®ã¿ã«è¨±å¯ãŒåˆ¶é™ã•れã¾ã™ã€‚ 詳細ã¯ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’å‚ç…§ã—ã¦ãã ã•ã„。 at_least_one_permission=トークンを作æˆã™ã‚‹ã«ã¯ã€å°‘ãªãã¨ã‚‚ã²ã¨ã¤ã®è¨±å¯ã‚’é¸æŠžã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ permissions_list=許å¯: @@ -1000,11 +1039,14 @@ pronouns = 代å詞 pronouns_custom = カスタム pronouns_unspecified = 未指定 update_hints = ヒントを更新 -additional_repo_units_hint_description = 利用å¯èƒ½ãªã™ã¹ã¦ã®æ©Ÿèƒ½ãŒæœ‰åйã«ãªã£ã¦ã„ãªã„リãƒã‚¸ãƒˆãƒªã«å¯¾ã—ã¦ã€ã€Œæ©Ÿèƒ½ã‚’追加...ã€ãƒœã‚¿ãƒ³ã‚’表示ã—ã¾ã™ã€‚ +additional_repo_units_hint_description = 利用å¯èƒ½ãªã™ã¹ã¦ã®æ©Ÿèƒ½ãŒæœ‰åйã«ãªã£ã¦ã„ãªã„リãƒã‚¸ãƒˆãƒªã«å¯¾ã—ã¦ã€ã€Œã•ã‚‰ã«æœ‰åйã«ã™ã‚‹ã€ãƒ’ントを表示ã—ã¾ã™ã€‚ update_hints_success = ãƒ’ãƒ³ãƒˆãŒæ›´æ–°ã•れã¾ã—ãŸã€‚ hints = ヒント additional_repo_units_hint = リãƒã‚¸ãƒˆãƒªã§ã‚ˆã‚Šå¤šãã®æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹ã“ã¨ã‚’推奨ã™ã‚‹ language.title = 既定ã®è¨€èªž +keep_activity_private.description = 公開アクティビティã¯ã€ã‚ãªãŸã¨ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ç®¡ç†è€…ã«ã®ã¿è¡¨ç¤ºã•れã¾ã™ã€‚ +language.description = ã“ã®è¨€èªžã¯ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ä¿å­˜ã•れã€ãƒ­ã‚°ã‚¤ãƒ³å¾Œã«ãƒ‡ãƒ•ォルトã¨ã—ã¦ä½¿ç”¨ã•れã¾ã™ã€‚ +language.localization_project = Forgejo ã‚’ã‚ãªãŸã®è¨€èªžã«ç¿»è¨³ã™ã‚‹ã®ã‚’手ä¼ã£ã¦ãã ã•ã„。詳細ã¯ã“ã¡ã‚‰ã€‚ [repo] new_repo_helper=リãƒã‚¸ãƒˆãƒªã«ã¯ã€ãƒ—ロジェクトã®ã™ã¹ã¦ã®ãƒ•ァイルã¨ãƒªãƒ“ジョン履歴ãŒå…¥ã‚Šã¾ã™ã€‚ ã™ã§ã«ã»ã‹ã®å ´æ‰€ã§ãƒ›ã‚¹ãƒˆã—ã¦ã„ã¾ã™ã‹ï¼Ÿ リãƒã‚¸ãƒˆãƒªã‚’移行 ã‚‚ã©ã†ãžã€‚ @@ -1021,7 +1063,7 @@ visibility=公開/éžå…¬é–‹ visibility_description=オーナーã€ã¾ãŸã¯æ¨©é™ã‚’æŒã¤çµ„ç¹”ã®ãƒ¡ãƒ³ãƒãƒ¼ã ã‘ãŒã€ãƒªãƒã‚¸ãƒˆãƒªã‚’見るã“ã¨ãŒã§ãã¾ã™ã€‚ visibility_helper=リãƒã‚¸ãƒˆãƒªã‚’プライベートã«ã™ã‚‹ visibility_helper_forced=サイト管ç†è€…ã®è¨­å®šã«ã‚ˆã‚Šã€æ–°ã—ã„リãƒã‚¸ãƒˆãƒªã¯å¼·åˆ¶çš„ã«ãƒ—ライベートã«ãªã‚Šã¾ã™ã€‚ -visibility_fork_helper=(ã“ã®å¤‰æ›´ã¯ã™ã¹ã¦ã®ãƒ•ォークã«é©ç”¨ã•れã¾ã™) +visibility_fork_helper=(ã“ã®å¤‰æ›´ã¯ã™ã¹ã¦ã®ãƒ•ォークã®å¯è¦–性ã«å½±éŸ¿ã—ã¾ã™ã€‚) clone_helper=クローンã«é–¢ã—ã¦ãŠå›°ã‚Šã§ã‚れã°ãƒ˜ãƒ«ãƒ—ã‚’å‚ç…§ã—ã¾ã—ょã†ã€‚ fork_repo=リãƒã‚¸ãƒˆãƒªã‚’フォーク fork_from=フォーク元 @@ -1043,15 +1085,15 @@ repo_desc_helper=ç°¡å˜ãªèª¬æ˜Žã‚’入力ã—ã¦ãã ã•ã„ (オプション) repo_lang=言語 repo_gitignore_helper=.gitignoreãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 repo_gitignore_helper_desc=一般的ãªè¨€èªžã®ãƒ†ãƒ³ãƒ—レートリストã‹ã‚‰ã€è¿½è·¡ã—ãªã„ファイルã®è¨­å®šã‚’é¸æŠžã—ã¾ã™ã€‚ å„言語ã®ãƒ“ルドツールãŒç”Ÿæˆã™ã‚‹å…¸åž‹çš„ãªãƒ•ァイルãŒã€ãƒ‡ãƒ•ォルトã§.gitignoreã«å«ã¾ã‚Œã¾ã™ã€‚ -issue_labels=イシューラベル -issue_labels_helper=イシューã®ãƒ©ãƒ™ãƒ«ã‚»ãƒƒãƒˆã‚’é¸æŠž +issue_labels=ラベル +issue_labels_helper=ãƒ©ãƒ™ãƒ«ã‚»ãƒƒãƒˆã‚’é¸æŠž license=ライセンス -license_helper=ライセンス ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„。 +license_helper=ライセンス ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„ license_helper_desc=ライセンスã«ã‚ˆã‚Šã€ä»–人ãŒã‚ãªãŸã®ã‚³ãƒ¼ãƒ‰ã«å¯¾ã—ã¦ä½•ãŒã§ãã¦ä½•ãŒã§ããªã„ã®ã‹ã‚’è¦å®šã—ã¾ã™ã€‚ ã©ã‚ŒãŒãƒ—ロジェクトã«ãµã•ã‚ã—ã„ã‹è¿·ã£ã¦ã„ã¾ã™ã‹ï¼Ÿ ãƒ©ã‚¤ã‚»ãƒ³ã‚¹é¸æŠžã‚µã‚¤ãƒˆ も確èªã—ã¦ã¿ã¦ãã ã•ã„。 object_format=オブジェクトã®ãƒ•ォーマット -object_format_helper=リãƒã‚¸ãƒˆãƒªã®ã‚ªãƒ–ジェクトフォーマット。後ã§å¤‰æ›´ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。SHA1 ã¯æœ€ã‚‚äº’æ›æ€§ãŒã‚りã¾ã™ã€‚ +object_format_helper=リãƒã‚¸ãƒˆãƒªã®ã‚ªãƒ–ジェクトフォーマット。後ã§å¤‰æ›´ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。SHA1 ãŒæœ€ã‚‚äº’æ›æ€§ãŒã‚りã¾ã™ã€‚ readme=README -readme_helper=READMEファイル ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 +readme_helper=READMEファイル ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„ readme_helper_desc=プロジェクトã«ã¤ã„ã¦ã®èª¬æ˜Žã‚’ã²ã¨ã¨ãŠã‚Šæ›¸ã場所ã§ã™ã€‚ auto_init=リãƒã‚¸ãƒˆãƒªã®åˆæœŸè¨­å®š (.gitignoreã€ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ãƒ•ァイルã€READMEファイルã®è¿½åŠ ) trust_model_helper=ç½²åæ¤œè¨¼ã®ãƒˆãƒ©ã‚¹ãƒˆãƒ¢ãƒ‡ãƒ«ã‚’é¸æŠžã—ã¾ã™ã€‚ é¸æŠžè‚¢ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™: @@ -1117,8 +1159,7 @@ desc.public=公開 desc.template=テンプレート desc.internal=組織内 desc.archived=アーカイブ -desc.sha256=SHA256 - +desc.sha256 = SHA256 template.items=テンプレート項目 template.git_content=Gitコンテンツ (デフォルトブランãƒ) template.git_hooks=Gitフック @@ -1178,7 +1219,7 @@ migrate.migrating_failed_no_addr=移行ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ migrate.github.description=github.com ã‚„ãã®ä»–ã® GitHub エンタープライズサーãƒãƒ¼ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’移行ã—ã¾ã™ã€‚ migrate.git.description=Git サービスã‹ã‚‰ãƒªãƒã‚¸ãƒˆãƒªã®ã¿ã‚’移行ã—ã¾ã™ã€‚ migrate.gitlab.description=gitlab.com ã‚„ãã®ä»–ã® GitLab インスタンスã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’移行ã—ã¾ã™ã€‚ -migrate.gitea.description=gitea.com ã‚„ãã®ä»–ã® Gitea/Forgejo インスタンスã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’移行ã—ã¾ã™ã€‚ +migrate.gitea.description=gitea.com ã‚„ãã®ä»–ã® Gitea インスタンスã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’移行ã—ã¾ã™ã€‚ migrate.gogs.description=notabug.org ã‚„ãã®ä»–ã® Gogs インスタンスã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’移行ã—ã¾ã™ã€‚ migrate.onedev.description=code.onedev.io ã‚„ãã®ä»–ã® OneDev インスタンスã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’移行ã—ã¾ã™ã€‚ migrate.codebase.description=codebasehq.com ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’移行ã—ã¾ã™ã€‚ @@ -1266,6 +1307,7 @@ view_git_blame=Git Blameを表示 video_not_supported_in_browser=ã“ã®ãƒ–ラウザã¯HTML5ã®videoタグをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。 audio_not_supported_in_browser=ã“ã®ãƒ–ラウザーã¯HTML5ã®audioタグをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。 stored_lfs=Git LFSã§ä¿ç®¡ã•れã¦ã„ã¾ã™ +stored_annex=Git Annexã§ä¿ç®¡ã•れã¦ã„ã¾ã™ symbolic_link=シンボリック リンク executable_file=実行ファイル commit_graph=コミットグラフ @@ -1289,6 +1331,7 @@ editor.upload_file=ファイルをアップロード editor.edit_file=ファイルを編集 editor.preview_changes=変更をプレビュー editor.cannot_edit_lfs_files=LFSã®ãƒ•ァイルã¯Webインターフェースã§ç·¨é›†ã§ãã¾ã›ã‚“。 +editor.cannot_edit_annex_files=Annexã®ãƒ•ァイルã¯Webインターフェースã§ç·¨é›†ã§ãã¾ã›ã‚“。 editor.cannot_edit_non_text_files=ãƒã‚¤ãƒŠãƒªãƒ•ァイルã¯Webインターフェースã§ç·¨é›†ã§ãã¾ã›ã‚“。 editor.edit_this_file=ファイルを編集 editor.this_file_locked=ファイルã¯ãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ @@ -1303,7 +1346,8 @@ editor.or=ã¾ãŸã¯ editor.cancel_lower=キャンセル editor.commit_signed_changes=ç½²åã—ãŸå¤‰æ›´ã‚’コミット editor.commit_changes=変更をコミット -editor.add_tmpl="<ファイルå>" を追加 +editor.add_tmpl="<%s>" を追加 +editor.add_tmpl.filename = ファイルå editor.add=%s を追加 editor.update=%s ã‚’æ›´æ–° editor.delete=%s を削除 @@ -1313,7 +1357,7 @@ editor.fail_to_apply_patch=`パッãƒã‚’é©ç”¨ã§ãã¾ã›ã‚“ "%s"` editor.new_patch=æ–°ã—ã„パッムeditor.commit_message_desc=詳細ãªèª¬æ˜Žã‚’追加… editor.signoff_desc=ã‚³ãƒŸãƒƒãƒˆãƒ­ã‚°ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æœ€å¾Œã«ã‚³ãƒŸãƒƒã‚¿ãƒ¼ã® Signed-off-by 行を追加 -editor.commit_directly_to_this_branch=ブランãƒ%sã¸ç›´æŽ¥ã‚³ãƒŸãƒƒãƒˆã™ã‚‹ã€‚ +editor.commit_directly_to_this_branch=ブランãƒ%[1]sã¸ç›´æŽ¥ã‚³ãƒŸãƒƒãƒˆã™ã‚‹ã€‚ editor.create_new_branch=æ–°ã—ã„ブランãƒã«ã‚³ãƒŸãƒƒãƒˆã—ã¦ãƒ—ルリクエストを作æˆã™ã‚‹ã€‚ editor.create_new_branch_np=æ–°ã—ã„ブランãƒã«ã‚³ãƒŸãƒƒãƒˆã™ã‚‹ã€‚ editor.propose_file_change=ãƒ•ã‚¡ã‚¤ãƒ«ä¿®æ­£ã‚’ææ¡ˆ @@ -1383,7 +1427,7 @@ commitstatus.failure=失敗 commitstatus.pending=ä¿ç•™ commitstatus.success=æˆåŠŸ -ext_issues=外部イシューã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ +ext_issues=外部イシュー ext_issues.desc=外部ã®ã‚¤ã‚·ãƒ¥ãƒ¼ãƒˆãƒ©ãƒƒã‚«ãƒ¼ã¸ã®ãƒªãƒ³ã‚¯ã€‚ projects=プロジェクト @@ -1418,7 +1462,7 @@ projects.column.set_default_desc=ã“ã®åˆ—を未分類ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚„プル projects.column.unset_default=デフォルトを解除 projects.column.unset_default_desc=ã“ã®åˆ—ã‹ã‚‰ãƒ‡ãƒ•ォルト列ã®è¨­å®šã‚’解除ã—ã¾ã™ projects.column.delete=列を削除 -projects.column.deletion_desc=プロジェクト列を削除ã™ã‚‹ã¨ã€é–¢é€£ã™ã‚‹ã™ã¹ã¦ã®ã‚¤ã‚·ãƒ¥ãƒ¼ãŒ '未分類' ã«ç§»å‹•ã—ã¾ã™ã€‚ 続行ã—ã¾ã™ã‹ï¼Ÿ +projects.column.deletion_desc=プロジェクト列を削除ã™ã‚‹ã¨ã€é–¢é€£ã™ã‚‹ã™ã¹ã¦ã®ã‚¤ã‚·ãƒ¥ãƒ¼ãŒãƒ‡ãƒ•ォルトã®åˆ—ã«ç§»å‹•ã—ã¾ã™ã€‚ 続行ã—ã¾ã™ã‹ï¼Ÿ projects.column.color=カラー projects.open=オープン projects.close=クローズ @@ -1466,10 +1510,10 @@ issues.new_label=æ–°ã—ã„ラベル issues.new_label_placeholder=ラベルå issues.new_label_desc_placeholder=説明 issues.create_label=ãƒ©ãƒ™ãƒ«ã‚’ä½œæˆ -issues.label_templates.title=定義済ã¿ãƒ©ãƒ™ãƒ«ã‚»ãƒƒãƒˆã®èª­ã¿è¾¼ã¿ -issues.label_templates.info=ラベルãŒã¾ã ã‚りã¾ã›ã‚“。"æ–°ã—ã„ラベル"ã§ãƒ©ãƒ™ãƒ«ã‚’作æˆã™ã‚‹ã‹ã€æ¬¡ã®å®šç¾©æ¸ˆã¿ã®ãƒ©ãƒ™ãƒ«ã‚»ãƒƒãƒˆã‚’使用ã—ã¦ãã ã•ã„: -issues.label_templates.helper=ãƒ©ãƒ™ãƒ«ã‚»ãƒƒãƒˆã‚’é¸æŠž -issues.label_templates.use=ラベルセットを使用 +issues.label_templates.title=ラベルプリセットを読ã¿è¾¼ã‚€ +issues.label_templates.info=ラベルãŒã¾ã ã‚りã¾ã›ã‚“。"æ–°ã—ã„ラベル"ã§ãƒ©ãƒ™ãƒ«ã‚’作æˆã™ã‚‹ã‹ã€ãƒ©ãƒ™ãƒ«ãƒ—リセットを使用ã—ã¦ãã ã•ã„: +issues.label_templates.helper=ãƒ©ãƒ™ãƒ«ãƒ—ãƒªã‚»ãƒƒãƒˆã‚’é¸æŠžã™ã‚‹ +issues.label_templates.use=ラベルプリセットを使用 issues.label_templates.fail_to_load_file=ラベルテンプレート "%s" を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %v issues.add_label=ãŒãƒ©ãƒ™ãƒ« %s を追加 %s issues.add_labels=ãŒãƒ©ãƒ™ãƒ« %s を追加 %s @@ -1589,7 +1633,7 @@ issues.role.collaborator_helper=ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ãƒªãƒã‚¸ãƒˆãƒªä¸Šã§å…±åŒ issues.role.first_time_contributor=åˆã‚ã¦ã®è²¢çŒ®è€… issues.role.first_time_contributor_helper=ã“れã¯ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã‚ˆã‚‹ãƒªãƒã‚¸ãƒˆãƒªã¸ã®æœ€åˆã®è²¢çŒ®ã§ã™ã€‚ issues.role.contributor=貢献者 -issues.role.contributor_helper=ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ä»¥å‰ã«ãƒªãƒã‚¸ãƒˆãƒªã«ã‚³ãƒŸãƒƒãƒˆã—ã¦ã„ã¾ã™ã€‚ +issues.role.contributor_helper=ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ä»¥å‰ã«ã“ã®ãƒªãƒã‚¸ãƒˆãƒªã«ã‚³ãƒŸãƒƒãƒˆã—ã¦ã„ã¾ã™ã€‚ issues.re_request_review=レビューをå†ä¾é ¼ issues.is_stale=ã“ã®ãƒ¬ãƒ“ューã®ã‚ã¨ã€ã“ã®PRã«å¤‰æ›´ãŒã‚りã¾ã—㟠issues.remove_request_review=レビューä¾é ¼ã‚’å–り消㗠@@ -1604,7 +1648,7 @@ issues.label_title=åå‰ issues.label_description=説明 issues.label_color=カラー issues.label_exclusive=排他 -issues.label_archive=アーカイブ ラベル +issues.label_archive=ラベルをアーカイブ issues.label_archived_filter=アーカイブã•れãŸãƒ©ãƒ™ãƒ«ã‚’表示 issues.label_archive_tooltip=アーカイブã•れãŸãƒ©ãƒ™ãƒ«ã¯ã€ãƒ©ãƒ™ãƒ«ã«ã‚ˆã‚‹æ¤œç´¢æ™‚ã®ã‚µã‚¸ã‚§ã‚¹ãƒˆã‹ã‚‰ãƒ‡ãƒ•ォルトã§é™¤å¤–ã•れã¾ã™ã€‚ issues.label_exclusive_desc=ラベルåã‚’ スコープ/アイテム ã®å½¢ã«ã™ã‚‹ã“ã¨ã§ã€ä»–㮠スコープ/ ãƒ©ãƒ™ãƒ«ã¨æŽ’ä»–çš„ã«ãªã‚Šã¾ã™ã€‚ @@ -1636,8 +1680,8 @@ 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_no_reason=ロックã•れã¦ãŠã‚Šã€ä¼šè©±ãŒå…±åŒä½œæ¥­è€…ã«åˆ¶é™ã•れã¦ã„ã¾ã™ %s +issues.unlock_comment=ã“ã®ä¼šè©±ã®ãƒ­ãƒƒã‚¯ã‚’解除 %s issues.lock_confirm=ロック issues.unlock_confirm=アンロック issues.lock.notice_1=- ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã«æ–°ã—ã„コメントを追加ã§ãã¾ã›ã‚“。 @@ -1662,9 +1706,9 @@ issues.stop_tracking=タイマー 終了 issues.stop_tracking_history=`ãŒä½œæ¥­ã‚’終了 %s` issues.cancel_tracking=中止 issues.cancel_tracking_history=`ãŒã‚¿ã‚¤ãƒ ãƒˆãƒ©ãƒƒã‚­ãƒ³ã‚°ã‚’中止 %s` -issues.add_time=æ‰‹ã§æ™‚間を入力 +issues.add_time=æ‰‹å‹•ã§æ™‚間を入力 issues.del_time=ã“ã®ã‚¿ã‚¤ãƒ ãƒ­ã‚°ã‚’削除 -issues.add_time_short=時間入力 +issues.add_time_short=時間を入力 issues.add_time_cancel=キャンセル issues.add_time_history=`ãŒä½œæ¥­æ™‚間を追加 %s` issues.del_time_history=`ãŒä½œæ¥­æ™‚間を削除 %s` @@ -1679,7 +1723,7 @@ issues.error_modifying_due_date=期日を変更ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ issues.error_removing_due_date=期日を削除ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ issues.push_commit_1=㌠%d コミット追加 %s issues.push_commits_n=㌠%d コミット追加 %s -issues.force_push_codes=`㌠%[1]s を強制プッシュ ( %[2]s ã‹ã‚‰ %[4]s 㸠) %[6]s` +issues.force_push_codes=`㌠%[1]s を強制プッシュ ( %[2]s ã‹ã‚‰ %[4]s 㸠) %[6]s` issues.force_push_compare=比較 issues.due_date_form=yyyy-mm-dd issues.due_date_form_add=期日ã®è¿½åŠ  @@ -1691,7 +1735,7 @@ issues.due_date_added=ãŒæœŸæ—¥ %s を追加 %s issues.due_date_modified=ãŒæœŸæ—¥ã‚’ %[2]s ã‹ã‚‰ %[1]s ã«å¤‰æ›´ %[3]s issues.due_date_remove=ãŒæœŸæ—¥ %s を削除 %s issues.due_date_overdue=期日ã¯éŽãŽã¦ã„ã¾ã™ -issues.due_date_invalid=æœŸæ—¥ãŒæ­£ã—ããªã„ã‹ç¯„囲を超ãˆã¦ã„ã¾ã™ã€‚ 'yyyy-mm-dd' ã®å½¢å¼ã§å…¥åŠ›ã—ã¦ãã ã•ã„。 +issues.due_date_invalid=æœŸæ—¥ãŒæ­£ã—ããªã„ã‹ç¯„囲を超ãˆã¦ã„ã¾ã™ã€‚ "yyyy-mm-dd" ã®å½¢å¼ã§å…¥åŠ›ã—ã¦ãã ã•ã„。 issues.dependency.title=ä¾å­˜é–¢ä¿‚ issues.dependency.issue_no_dependencies=ä¾å­˜é–¢ä¿‚ãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“。 issues.dependency.pr_no_dependencies=ä¾å­˜é–¢ä¿‚ãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“。 @@ -1709,7 +1753,7 @@ issues.dependency.issue_closing_blockedby=ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã®ã‚¯ãƒ­ãƒ¼ã‚ºã¯ issues.dependency.issue_close_blocks=ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã¯ã€ã“れらã®ã‚¤ã‚·ãƒ¥ãƒ¼ã®ã‚¯ãƒ­ãƒ¼ã‚ºã‚’ブロックã—ã¦ã„ã¾ã™ issues.dependency.pr_close_blocks=ã“ã®ãƒ—ルリクエストã¯ã€ã“れらã®ã‚¤ã‚·ãƒ¥ãƒ¼ã®ã‚¯ãƒ­ãƒ¼ã‚ºã‚’ブロックã—ã¦ã„ã¾ã™ issues.dependency.issue_close_blocked=ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’クローズã™ã‚‹ã«ã¯ã€ãƒ–ロックã—ã¦ã„るイシューをã™ã¹ã¦ã‚¯ãƒ­ãƒ¼ã‚ºã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ -issues.dependency.issue_batch_close_blocked=é¸æŠžã—ãŸã‚¤ã‚·ãƒ¥ãƒ¼ã®ä¸€æ‹¬ã‚¯ãƒ­ãƒ¼ã‚ºã¯ã§ãã¾ã›ã‚“。 イシュー #%d ã«ã€ã¾ã ã‚ªãƒ¼ãƒ—ン中ã®ä¾å­˜é–¢ä¿‚ãŒã‚りã¾ã™ã€‚ +issues.dependency.issue_batch_close_blocked=イシュー #%d ã«ã¾ã ä¾å­˜é–¢ä¿‚ãŒã‚ã‚‹ãŸã‚ã€é¸æŠžã—ãŸã‚¤ã‚·ãƒ¥ãƒ¼ã‚’一括ã§é–‰ã˜ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ issues.dependency.pr_close_blocked=ã“ã®ãƒ—ルリクエストをæ“作ã™ã‚‹ã«ã¯ã€ãƒ–ロックã—ã¦ã„るイシューをã™ã¹ã¦ã‚¯ãƒ­ãƒ¼ã‚ºã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ issues.dependency.blocks_short=ブロック対象 issues.dependency.blocked_by_short=ä¾å­˜å…ˆ @@ -1794,7 +1838,7 @@ pulls.nothing_to_compare=åŒã˜ãƒ–ランãƒåŒå£«ã®ãŸã‚〠プルリクエス pulls.nothing_to_compare_and_allow_empty_pr=ã“れらã®ãƒ–ランãƒã¯å†…容ãŒåŒã˜ã§ã™ã€‚ 空ã®ãƒ—ルリクエストã«ãªã‚Šã¾ã™ã€‚ pulls.has_pull_request=`åŒã˜ãƒ–ランãƒã®ãƒ—ルリクエストã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™: %[2]s#%[3]d` pulls.create=ãƒ—ãƒ«ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’ä½œæˆ -pulls.title_desc_few=㌠%[2]s ã‹ã‚‰ %[3]s ã¸ã® %[1]d コミットã®ãƒžãƒ¼ã‚¸ã‚’希望ã—ã¦ã„ã¾ã™ +pulls.title_desc_few=㌠%[2]s ã‹ã‚‰ %[3]s ã¸ã® %[1]d コミットã®ãƒžãƒ¼ã‚¸ã‚’希望ã—ã¦ã„ã¾ã™ pulls.merged_title_desc_few=㌠%[1]d 個ã®ã‚³ãƒŸãƒƒãƒˆã‚’ %[2]s ã‹ã‚‰ %[3]s ã¸ãƒžãƒ¼ã‚¸ %[4]s pulls.change_target_branch_at=`ãŒã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒ–ランãƒã‚’ %s ã‹ã‚‰ %s ã«å¤‰æ›´ %s` pulls.tab_conversation=会話 @@ -1824,7 +1868,7 @@ pulls.required_status_check_administrator=管ç†è€…ã§ã‚ã‚‹ãŸã‚ã€ã“ã®ãƒ— pulls.blocked_by_approvals=ã“ã®ãƒ—ルリクエストã¯ã¾ã æ‰¿èªæ•°ãŒè¶³ã‚Šã¾ã›ã‚“。 %[1]d/%[2]dã®æ‰¿èªã‚’å¾—ã¦ã„ã¾ã™ã€‚ pulls.blocked_by_rejection=ã“ã®ãƒ—ルリクエストã¯å…¬å¼ãƒ¬ãƒ“ューアã«ã‚ˆã‚Šå¤‰æ›´è¦è«‹ã•れã¦ã„ã¾ã™ã€‚ pulls.blocked_by_official_review_requests=ã“ã®ãƒ—ルリクエストã«ã¯å…¬å¼ãƒ¬ãƒ“ューä¾é ¼ãŒã‚りã¾ã™ã€‚ -pulls.blocked_by_outdated_branch=ã“ã®ãƒ—ルリクエストã¯é…れã®ãŸã‚ブロックã•れã¦ã„ã¾ã™ã€‚ +pulls.blocked_by_outdated_branch=ã“ã®ãƒ—ルリクエストã¯å¤ã„ãŸã‚ブロックã•れã¦ã„ã¾ã™ã€‚ pulls.blocked_by_changed_protected_files_1=ã“ã®ãƒ—ルリクエストã¯ä¿è­·ã—ã¦ã„るファイルを変更ã™ã‚‹ãŸã‚ブロックã•れã¦ã„ã¾ã™ï¼š pulls.blocked_by_changed_protected_files_n=ã“ã®ãƒ—ルリクエストã¯ä¿è­·ã—ã¦ã„るファイルを変更ã™ã‚‹ãŸã‚ブロックã•れã¦ã„ã¾ã™ï¼š pulls.can_auto_merge_desc=ã“ã®ãƒ—ルリクエストã¯è‡ªå‹•çš„ã«ãƒžãƒ¼ã‚¸ã§ãã¾ã™ã€‚ @@ -1854,17 +1898,17 @@ pulls.merge_commit_id=マージコミットID pulls.require_signed_wont_sign=ブランãƒã§ã¯ç½²åã•れãŸã‚³ãƒŸãƒƒãƒˆãŒå¿…é ˆã§ã™ãŒã€ã“ã®ãƒžãƒ¼ã‚¸ã§ã¯ç½²åãŒã•れã¾ã›ã‚“ pulls.invalid_merge_option=ã“ã®ãƒ—ルリクエストã§ã¯ã€æŒ‡å®šã—ãŸãƒžãƒ¼ã‚¸æ–¹æ³•ã¯ä½¿ãˆã¾ã›ã‚“。 -pulls.merge_conflict=マージ失敗: マージ中ã«ã‚³ãƒ³ãƒ•リクトãŒã‚りã¾ã—ãŸã€‚ ヒント: 別ã®ã‚¹ãƒˆãƒ©ãƒ†ã‚¸ãƒ¼ã‚’試ã—ã¦ã¿ã¦ãã ã•ã„ +pulls.merge_conflict=マージ失敗: マージ中ã«ã‚³ãƒ³ãƒ•リクトãŒã‚りã¾ã—ãŸã€‚ ヒント: åˆ¥ã®æ–¹æ³•を試ã—ã¦ã¿ã¦ãã ã•ã„ pulls.merge_conflict_summary=エラーメッセージ -pulls.rebase_conflict=マージ失敗: コミット %[1]s ã®ãƒªãƒ™ãƒ¼ã‚¹ä¸­ã«ã‚³ãƒ³ãƒ•リクトãŒã‚りã¾ã—ãŸã€‚ ヒント: 別ã®ã‚¹ãƒˆãƒ©ãƒ†ã‚¸ãƒ¼ã‚’試ã—ã¦ã¿ã¦ãã ã•ã„ +pulls.rebase_conflict=マージ失敗: コミット %[1]s ã®ãƒªãƒ™ãƒ¼ã‚¹ä¸­ã«ã‚³ãƒ³ãƒ•リクトãŒã‚りã¾ã—ãŸã€‚ ヒント: åˆ¥ã®æ–¹æ³•を試ã—ã¦ã¿ã¦ãã ã•ã„ pulls.rebase_conflict_summary=エラーメッセージ -pulls.unrelated_histories=マージ失敗: マージHEADã¨ãƒ™ãƒ¼ã‚¹ã«ã¯å…±é€šã™ã‚‹å±¥æ­´ãŒã‚りã¾ã›ã‚“。 ヒント: 別ã®ã‚¹ãƒˆãƒ©ãƒ†ã‚¸ãƒ¼ã‚’試ã—ã¦ã¿ã¦ãã ã•ã„ -pulls.merge_out_of_date=マージ失敗: マージã®ç”Ÿæˆä¸­ã«ãƒ™ãƒ¼ã‚¹ãŒæ›´æ–°ã•れã¾ã—ãŸã€‚ ヒント: ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ã¿ã¦ãã ã•ã„ -pulls.head_out_of_date=マージ失敗: マージã®ç”Ÿæˆä¸­ã« head ãŒæ›´æ–°ã•れã¾ã—ãŸã€‚ ヒント: ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ã¿ã¦ãã ã•ã„ +pulls.unrelated_histories=マージ失敗: マージHEADã¨ãƒ™ãƒ¼ã‚¹ã«ã¯å…±é€šã™ã‚‹å±¥æ­´ãŒã‚りã¾ã›ã‚“。 ヒント: åˆ¥ã®æ–¹æ³•を試ã—ã¦ã¿ã¦ãã ã•ã„ +pulls.merge_out_of_date=マージ失敗: マージã®ç”Ÿæˆä¸­ã«ãƒ™ãƒ¼ã‚¹ãŒæ›´æ–°ã•れã¾ã—ãŸã€‚ ヒント: ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ã¿ã¦ãã ã•ã„。 +pulls.head_out_of_date=マージ失敗: マージã®ç”Ÿæˆä¸­ã« head ãŒæ›´æ–°ã•れã¾ã—ãŸã€‚ ヒント: ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ã¿ã¦ãã ã•ã„。 pulls.has_merged=失敗: プルリクエストã¯ãƒžãƒ¼ã‚¸ã•れã¦ã„ã¾ã—ãŸã€‚å†åº¦ãƒžãƒ¼ã‚¸ã—ãŸã‚Šã€ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒ–ランãƒã‚’変更ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 pulls.push_rejected=マージ失敗: ãƒ—ãƒƒã‚·ãƒ¥ã¯æ‹’å¦ã•れã¾ã—ãŸã€‚ ã“ã®ãƒªãƒã‚¸ãƒˆãƒªã®Gitフックを見直ã—ã¦ãã ã•ã„。 pulls.push_rejected_summary=æ‹’å¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸å…¨ä½“: -pulls.push_rejected_no_message=マージ失敗: ãƒ—ãƒƒã‚·ãƒ¥ã¯æ‹’å¦ã•れã€ãƒªãƒ¢ãƒ¼ãƒˆã‹ã‚‰ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã‚りã¾ã›ã‚“。
      ã“ã®ãƒªãƒã‚¸ãƒˆãƒªã®Gitフックを見直ã—ã¦ãã ã•ã„ +pulls.push_rejected_no_message=マージ失敗: ãƒ—ãƒƒã‚·ãƒ¥ã¯æ‹’å¦ã•れã€ãƒªãƒ¢ãƒ¼ãƒˆã‹ã‚‰ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã‚りã¾ã›ã‚“。ã“ã®ãƒªãƒã‚¸ãƒˆãƒªã®Gitフックを確èªã—ã¦ä¸‹ã•ã„ pulls.open_unmerged_pull_exists=`åŒã˜æ¡ä»¶ã®ãƒ—ルリクエスト (#%d) ãŒæœªå‡¦ç†ã®ãŸã‚ã€å†ã‚ªãƒ¼ãƒ—ンã¯ã§ãã¾ã›ã‚“。` pulls.status_checking=ã„ãã¤ã‹ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãƒã‚§ãƒƒã‚¯ãŒå¾…機中ã§ã™ pulls.status_checks_success=ステータスãƒã‚§ãƒƒã‚¯ã¯ã™ã¹ã¦æˆåŠŸã—ã¾ã—㟠@@ -1883,7 +1927,7 @@ pulls.outdated_with_base_branch=ã“ã®ãƒ–ランãƒã¯ãƒ™ãƒ¼ã‚¹ãƒ–ランãƒã«å¯¾ pulls.close=プルリクエストをクローズ pulls.closed_at=`ãŒãƒ—ルリクエストをクローズ %[2]s` pulls.reopened_at=`ãŒãƒ—ルリクエストをå†ã‚ªãƒ¼ãƒ—ン %[2]s` -pulls.cmd_instruction_hint=`ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã®æ‰‹é † を表示ã—ã¾ã™ã€‚` +pulls.cmd_instruction_hint=ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã®æ‰‹é †ã‚’表示 pulls.cmd_instruction_checkout_title=ãƒã‚§ãƒƒã‚¯ã‚¢ã‚¦ãƒˆ pulls.cmd_instruction_checkout_desc=プロジェクトリãƒã‚¸ãƒˆãƒªã‹ã‚‰æ–°ã—ã„ブランãƒã‚’ãƒã‚§ãƒƒã‚¯ã‚¢ã‚¦ãƒˆã—ã€å¤‰æ›´å†…容をテストã—ã¾ã™ã€‚ pulls.cmd_instruction_merge_title=マージ @@ -1942,7 +1986,7 @@ milestones.filter_sort.least_issues=イシューã®å°‘ãªã„é † signing.will_sign=ã“ã®ã‚³ãƒŸãƒƒãƒˆã¯éµ "%s" ã§ç½²åã•れã¾ã™ã€‚ signing.wont_sign.error=コミットã®ç½²åå¯å¦ã‚’確èªä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ -signing.wont_sign.nokey=ã“ã®ã‚³ãƒŸãƒƒãƒˆã«ç½²åã™ã‚‹ãŸã‚ã®éµãŒã‚りã¾ã›ã‚“。 +signing.wont_sign.nokey=ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«ã¯ã€ã“ã®ã‚³ãƒŸãƒƒãƒˆã«ç½²åã™ã‚‹ãŸã‚ã®éµãŒã‚りã¾ã›ã‚“。 signing.wont_sign.never=コミットãŒç½²åã•れるã“ã¨ã¯ã‚りã¾ã›ã‚“。 signing.wont_sign.always=コミットã¯å¸¸ã«ç½²åã•れã¾ã™ã€‚ signing.wont_sign.pubkey=アカウントã«å…¬é–‹éµãŒç™»éŒ²ã•れã¦ã„ãªã„ãŸã‚ã€ã‚³ãƒŸãƒƒãƒˆã¯ç½²åã•れã¾ã›ã‚“。 @@ -1954,7 +1998,7 @@ signing.wont_sign.commitssigned=関連ã™ã‚‹ã‚³ãƒŸãƒƒãƒˆã™ã¹ã¦ãŒç½²åã•れ signing.wont_sign.approved=PRãŒæœªæ‰¿èªã®ãŸã‚ã€ãƒžãƒ¼ã‚¸ã¯ç½²åã•れã¾ã›ã‚“。 signing.wont_sign.not_signed_in=サインインã—ã¦ã„ã¾ã›ã‚“。 -ext_wiki=外部Wikiã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ +ext_wiki=外部Wiki ext_wiki.desc=外部Wikiã¸ã®ãƒªãƒ³ã‚¯ã€‚ wiki=Wiki @@ -1972,8 +2016,8 @@ wiki.save_page=ページをä¿å­˜ wiki.last_commit_info=%s ㌠%s ã«ã“ã®ãƒšãƒ¼ã‚¸ã‚’編集 wiki.edit_page_button=編集 wiki.new_page_button=æ–°è¦ãƒšãƒ¼ã‚¸ -wiki.file_revision=ページ・リビジョン -wiki.wiki_page_revisions=Wikiページã®ãƒªãƒ“ジョン +wiki.file_revision=ãƒšãƒ¼ã‚¸ã®æ”¹è¨‚履歴 +wiki.wiki_page_revisions=Wikiãƒšãƒ¼ã‚¸ã®æ”¹è¨‚履歴 wiki.back_to_wiki=Wikiãƒšãƒ¼ã‚¸ã«æˆ»ã‚‹ wiki.delete_page_button=ページを削除 wiki.delete_page_notice_1=Wikiページ "%s" ã®å‰Šé™¤ã¯å…ƒã«æˆ»ã›ã¾ã›ã‚“。 続行ã—ã¾ã™ã‹ï¼Ÿ @@ -2027,7 +2071,7 @@ activity.unresolved_conv_label=オープン activity.title.releases_1=%dä»¶ã®ãƒªãƒªãƒ¼ã‚¹ activity.title.releases_n=%dä»¶ã®ãƒªãƒªãƒ¼ã‚¹ activity.title.releases_published_by=%sãŒ%sã«ã‚ˆã£ã¦ç™ºè¡Œã•れã¾ã—㟠-activity.published_release_label=発行 +activity.published_release_label=リリース activity.no_git_activity=ã“ã®æœŸé–“ã«ã¯ã‚³ãƒŸãƒƒãƒˆã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティãŒã‚りã¾ã›ã‚“。 activity.git_stats_exclude_merges=マージを除ãã¨ã€ activity.git_stats_author_1=%d人ã®ä½œæˆè€… @@ -2103,12 +2147,12 @@ settings.sync_mirror=今ã™ãåŒæœŸ settings.pull_mirror_sync_in_progress=ç¾åœ¨ã€ãƒªãƒ¢ãƒ¼ãƒˆ %s ã‹ã‚‰å¤‰æ›´ã‚’プルã—ã¦ã„ã¾ã™ã€‚ settings.push_mirror_sync_in_progress=ç¾åœ¨ã€ãƒªãƒ¢ãƒ¼ãƒˆ %s ã¸å¤‰æ›´ã‚’プッシュã—ã¦ã„ã¾ã™ã€‚ settings.site=Webサイト -settings.update_settings=設定を更新 +settings.update_settings=設定をä¿å­˜ settings.update_mirror_settings=ミラーリング設定を更新 settings.branches.switch_default_branch=デフォルトブランãƒã‚’切り替㈠settings.branches.update_default_branch=デフォルトブランãƒã‚’æ›´æ–° settings.branches.add_new_rule=æ–°ã—ã„ルールを追加 -settings.advanced_settings=拡張設定 +settings.advanced_settings=詳細設定 settings.wiki_desc=Wikiを有効ã«ã™ã‚‹ settings.use_internal_wiki=ビルトインã®Wikiを使用ã™ã‚‹ settings.use_external_wiki=外部ã®Wikiを使用ã™ã‚‹ @@ -2139,14 +2183,14 @@ settings.pulls.allow_rebase_update=リベースã§ãƒ—ルリクエストã®ãƒ–ラ settings.pulls.default_delete_branch_after_merge=デフォルトã§ãƒ—ルリクエストã®ãƒ–ランãƒã‚’マージ後ã«å‰Šé™¤ã™ã‚‹ settings.pulls.default_allow_edits_from_maintainers=デフォルトã§ãƒ¡ãƒ³ãƒ†ãƒŠã‹ã‚‰ã®ç·¨é›†ã‚’許å¯ã™ã‚‹ settings.releases_desc=リリースを有効ã«ã™ã‚‹ -settings.packages_desc=リãƒã‚¸ãƒˆãƒªãƒ‘ッケージレジストリを有効ã«ã™ã‚‹ -settings.projects_desc=リãƒã‚¸ãƒˆãƒªãƒ—ロジェクトを有効ã«ã™ã‚‹ -settings.actions_desc=Actionsを有効ã«ã™ã‚‹ -settings.admin_settings=管ç†è€…用設定 +settings.packages_desc=パッケージレジストリを有効ã«ã™ã‚‹ +settings.projects_desc=プロジェクトを有効ã«ã™ã‚‹ +settings.actions_desc=Forgejo Actionsを使用ã—ã¦çµ±åˆCI/CDパイプラインを有効化ã™ã‚‹ +settings.admin_settings=管ç†è€…設定 settings.admin_enable_health_check=リãƒã‚¸ãƒˆãƒªã®ãƒ˜ãƒ«ã‚¹ãƒã‚§ãƒƒã‚¯ã‚’有効ã«ã™ã‚‹ (git fsck) settings.admin_code_indexer=コードインデクサ settings.admin_stats_indexer=コード統計インデクサ -settings.admin_indexer_commit_sha=最新インデックス済ã¿SHA +settings.admin_indexer_commit_sha=最新インデックス済ã¿ã‚³ãƒŸãƒƒãƒˆ settings.admin_indexer_unindexed=未インデックス settings.reindex_button=インデックスå†ä½œæˆã‚­ãƒ¥ãƒ¼ã«è¿½åŠ  settings.reindex_requested=å†ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’è¦æ±‚ã—ã¾ã—㟠@@ -2259,7 +2303,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=プッシュã®ã‚¤ãƒ™ãƒ³ãƒˆ settings.event_send_everything=ã™ã¹ã¦ã®ã‚¤ãƒ™ãƒ³ãƒˆ settings.event_choose=イベントを指定… @@ -2279,32 +2323,32 @@ settings.event_push_desc=GitãŒãƒªãƒã‚¸ãƒˆãƒªã«ãƒ—ッシュを行ã£ãŸã¨ã settings.event_repository=リãƒã‚¸ãƒˆãƒª settings.event_repository_desc=リãƒã‚¸ãƒˆãƒªãŒä½œæˆãƒ»å‰Šé™¤ã•れãŸã¨ã。 settings.event_header_issue=イシューã®ã‚¤ãƒ™ãƒ³ãƒˆ -settings.event_issues=イシュー +settings.event_issues=変更 settings.event_issues_desc=イシューãŒã‚ªãƒ¼ãƒ—ン・クローズ・å†ã‚ªãƒ¼ãƒ—ン・編集ã•れãŸã¨ã。 -settings.event_issue_assign=イシューã®ã‚¢ã‚µã‚¤ãƒ³ +settings.event_issue_assign=アサイン settings.event_issue_assign_desc=ã‚¤ã‚·ãƒ¥ãƒ¼ã®æ‹…当者ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸã¨ãã€è§£é™¤ã•れãŸã¨ã。 -settings.event_issue_label=イシューã®ãƒ©ãƒ™ãƒ« -settings.event_issue_label_desc=イシューã®ãƒ©ãƒ™ãƒ«ãŒæ›´æ–°ãƒ»ã‚¯ãƒªã‚¢ã•れãŸã¨ã。 -settings.event_issue_milestone=イシューã®ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³ -settings.event_issue_milestone_desc=イシューã®ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³ãŒè¨­å®šãƒ»è§£é™¤ã•れãŸã¨ã。 -settings.event_issue_comment=イシューã¸ã®ã‚³ãƒ¡ãƒ³ãƒˆ +settings.event_issue_label=ラベル +settings.event_issue_label_desc=イシューã®ãƒ©ãƒ™ãƒ«ãŒè¿½åŠ ãƒ»å‰Šé™¤ã•れãŸã¨ã。 +settings.event_issue_milestone=マイルストーン +settings.event_issue_milestone_desc=マイルストーンãŒè¿½åŠ ãƒ»å‰Šé™¤ãƒ»å¤‰æ›´ã•れãŸã¨ã。 +settings.event_issue_comment=コメント settings.event_issue_comment_desc=イシューã¸ã®ã‚³ãƒ¡ãƒ³ãƒˆãŒä½œæˆãƒ»ç·¨é›†ãƒ»å‰Šé™¤ã•れãŸã¨ã。 settings.event_header_pull_request=プルリクエストã®ã‚¤ãƒ™ãƒ³ãƒˆ -settings.event_pull_request=プルリクエスト +settings.event_pull_request=変更 settings.event_pull_request_desc=プルリクエストãŒã‚ªãƒ¼ãƒ—ン・クローズ・å†ã‚ªãƒ¼ãƒ—ン・編集ã•れãŸã¨ã。 -settings.event_pull_request_assign=プルリクエストã®ã‚¢ã‚µã‚¤ãƒ³ +settings.event_pull_request_assign=アサイン settings.event_pull_request_assign_desc=ãƒ—ãƒ«ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®æ‹…当者ãŒå‰²ã‚Šå½“ã¦ãƒ»è§£é™¤ã•れãŸã¨ã。 -settings.event_pull_request_label=プルリクエストã®ãƒ©ãƒ™ãƒ« -settings.event_pull_request_label_desc=プルリクエストã®ãƒ©ãƒ™ãƒ«ãŒæ›´æ–°ãƒ»ã‚¯ãƒªã‚¢ã•れãŸã¨ã。 -settings.event_pull_request_milestone=プルリクエストã®ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³ -settings.event_pull_request_milestone_desc=プルリクエストã®ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³ãŒè¨­å®šãƒ»è§£é™¤ã•れãŸã¨ã。 -settings.event_pull_request_comment=プルリクエストã¸ã®ã‚³ãƒ¡ãƒ³ãƒˆ +settings.event_pull_request_label=ラベル +settings.event_pull_request_label_desc=プルリクエストã®ãƒ©ãƒ™ãƒ«ãŒè¿½åŠ ãƒ»å‰Šé™¤ã•れãŸã¨ã。 +settings.event_pull_request_milestone=マイルストーン +settings.event_pull_request_milestone_desc=マイルストーンãŒè¿½åŠ ãƒ»å‰Šé™¤ãƒ»å¤‰æ›´ã•れãŸã¨ã。 +settings.event_pull_request_comment=コメント settings.event_pull_request_comment_desc=プルリクエストã¸ã®ã‚³ãƒ¡ãƒ³ãƒˆãŒä½œæˆãƒ»ç·¨é›†ãƒ»å‰Šé™¤ã•れãŸã¨ã。 -settings.event_pull_request_review=プルリクエストã®ãƒ¬ãƒ“ュー +settings.event_pull_request_review=レビュー settings.event_pull_request_review_desc=ãƒ—ãƒ«ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®æ‰¿èªãƒ»æ‹’å¦ã€ã¾ãŸã¯ãƒ¬ãƒ“ューコメントãŒä»˜ã„ãŸã¨ã。 -settings.event_pull_request_sync=プルリクエストã®åŒæœŸ -settings.event_pull_request_sync_desc=プルリクエストãŒåŒæœŸã•れãŸã¨ã。 -settings.event_pull_request_review_request=プルリクエストã®ãƒ¬ãƒ“ューä¾é ¼ +settings.event_pull_request_sync=åŒæœŸ +settings.event_pull_request_sync_desc=ターゲットブランãƒãŒè‡ªå‹•ã§æ›´æ–°ã•れãŸã¨ã。 +settings.event_pull_request_review_request=レビューä¾é ¼ settings.event_pull_request_review_request_desc=プルリクエストã®ãƒ¬ãƒ“ューãŒä¾é ¼ã•れãŸã¨ãã€ã¾ãŸã¯ä¾é ¼ãŒå‰Šé™¤ã•れãŸã¨ã。 settings.event_pull_request_approvals=ãƒ—ãƒ«ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®æ‰¿èª settings.event_pull_request_merge=プルリクエストã®ãƒžãƒ¼ã‚¸ @@ -2392,12 +2436,12 @@ settings.protect_check_status_contexts_list=ã“ã®1週間ã«ã€ã“ã®ãƒªãƒã‚¸ settings.protect_status_check_matched=マッムsettings.protect_invalid_status_check_pattern=`䏿­£ãªã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãƒã‚§ãƒƒã‚¯ãƒ‘ターン: "%s"` settings.protect_no_valid_status_check_patterns=有効ãªã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãƒã‚§ãƒƒã‚¯ãƒ‘ターンãŒã‚りã¾ã›ã‚“。 -settings.protect_required_approvals=å¿…è¦ãªæ‰¿èªæ•°: +settings.protect_required_approvals=å¿…è¦ãªæ‰¿èªæ•° settings.protect_required_approvals_desc=肯定的ãªãƒ¬ãƒ“ãƒ¥ãƒ¼ã®æ•°ã‚’満ãŸã—ãŸãƒ—ルリクエストã—ã‹ãƒžãƒ¼ã‚¸ã§ããªã„よã†ã«ã—ã¾ã™ã€‚ settings.protect_approvals_whitelist_enabled=ホワイトリストã«ç™»éŒ²ã—ãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚„ãƒãƒ¼ãƒ ã«æ‰¿èªã‚’åˆ¶é™ settings.protect_approvals_whitelist_enabled_desc=ホワイトリストã«ç™»éŒ²ã—ãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚„ãƒãƒ¼ãƒ ã«ã‚ˆã‚‹ãƒ¬ãƒ“ューã®ã¿ã‚’ã€å¿…è¦ãªæ‰¿èªã¨ã¿ãªã—ã¾ã™ã€‚ 承èªã®ãƒ›ãƒ¯ã‚¤ãƒˆãƒªã‚¹ãƒˆãŒç„¡ã„å ´åˆã¯ã€æ›¸ãè¾¼ã¿æ¨©é™ãŒã‚る人ã«ã‚ˆã‚‹ãƒ¬ãƒ“ューを必è¦ãªæ‰¿èªã¨ã¿ãªã—ã¾ã™ã€‚ -settings.protect_approvals_whitelist_users=ホワイトリストã«å«ã‚るレビューア: -settings.protect_approvals_whitelist_teams=ホワイトリストã«å«ã‚るレビューãƒãƒ¼ãƒ : +settings.protect_approvals_whitelist_users=ホワイトリストã«å«ã‚るレビューア +settings.protect_approvals_whitelist_teams=ホワイトリストã«å«ã‚るレビューãƒãƒ¼ãƒ  settings.dismiss_stale_approvals=å¤ããªã£ãŸæ‰¿èªã‚’å–り消㙠settings.dismiss_stale_approvals_desc=プルリクエストã®å†…容を変ãˆã‚‹æ–°ãŸãªã‚³ãƒŸãƒƒãƒˆãŒãƒ–ランãƒã«ãƒ—ッシュã•れãŸå ´åˆã€ä»¥å‰ã®æ‰¿èªã‚’å–り消ã—ã¾ã™ã€‚ settings.require_signed_commits=コミット署åå¿…é ˆ @@ -2406,9 +2450,9 @@ settings.protect_branch_name_pattern=ä¿è­·ãƒ–ランãƒåã®ãƒ‘ターン settings.protect_branch_name_pattern_desc=ä¿è­·ãƒ–ランãƒåã®ãƒ‘ã‚¿ãƒ¼ãƒ³ã€‚æ›¸ãæ–¹ã«ã¤ã„ã¦ã¯ ドキュメント ã‚’å‚ç…§ã—ã¦ãã ã•ã„。例: main, release/** settings.protect_patterns=パターン settings.protect_protected_file_patterns=ä¿è­·ã•れるファイルã®ãƒ‘ターン (セミコロン';'ã§åŒºåˆ‡ã‚‹): -settings.protect_protected_file_patterns_desc=ä¿è­·ã•れãŸãƒ•ァイルã¯ã€ã“ã®ãƒ–ランãƒã«ãƒ•ァイルを追加・編集・削除ã™ã‚‹æ¨©é™ã‚’æŒã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼ã§ã‚ã£ã¦ã‚‚ã€ç›´æŽ¥å¤‰æ›´ã™ã‚‹ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚ セミコロン(';')ã§åŒºåˆ‡ã£ã¦è¤‡æ•°ã®ãƒ‘ターンを指定ã§ãã¾ã™ã€‚ ãƒ‘ã‚¿ãƒ¼ãƒ³ã®æ–‡æ³•ã«ã¤ã„ã¦ã¯ github.com/gobwas/glob ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 例: .drone.yml, /docs/**/*.txt +settings.protect_protected_file_patterns_desc=ä¿è­·ã•れãŸãƒ•ァイルã¯ã€ã“ã®ãƒ–ランãƒã«ãƒ•ァイルを追加・編集・削除ã™ã‚‹æ¨©é™ã‚’æŒã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼ã§ã‚ã£ã¦ã‚‚ã€ç›´æŽ¥å¤‰æ›´ã™ã‚‹ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚ セミコロン(';')ã§åŒºåˆ‡ã£ã¦è¤‡æ•°ã®ãƒ‘ターンを指定ã§ãã¾ã™ã€‚ ãƒ‘ã‚¿ãƒ¼ãƒ³ã®æ–‡æ³•ã«ã¤ã„ã¦ã¯ %[2]s ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 例: .drone.yml, /docs/**/*.txt settings.protect_unprotected_file_patterns=ä¿è­·ã—ãªã„ファイルã®ãƒ‘ターン (セミコロン';'ã§åŒºåˆ‡ã‚‹): -settings.protect_unprotected_file_patterns_desc=ä¿è­·ã—ãªã„ファイルã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«æ›¸ãè¾¼ã¿æ¨©é™ãŒã‚れã°ãƒ—ッシュ制é™ã‚’ãƒã‚¤ãƒ‘スã—ã¦ç›´æŽ¥å¤‰æ›´ã§ãã¾ã™ã€‚ セミコロン(';')ã§åŒºåˆ‡ã£ã¦è¤‡æ•°ã®ãƒ‘ターンを指定ã§ãã¾ã™ã€‚ ãƒ‘ã‚¿ãƒ¼ãƒ³ã®æ–‡æ³•ã«ã¤ã„ã¦ã¯ %[2]s ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 例: .drone.yml, /docs/**/*.txt +settings.protect_unprotected_file_patterns_desc=ä¿è­·ã—ãªã„ファイルã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«æ›¸ãè¾¼ã¿æ¨©é™ãŒã‚れã°ãƒ—ッシュ制é™ã‚’ãƒã‚¤ãƒ‘スã—ã¦ç›´æŽ¥å¤‰æ›´ã§ãã¾ã™ã€‚ セミコロン(';')ã§åŒºåˆ‡ã£ã¦è¤‡æ•°ã®ãƒ‘ターンを指定ã§ãã¾ã™ã€‚ ãƒ‘ã‚¿ãƒ¼ãƒ³ã®æ–‡æ³•ã«ã¤ã„ã¦ã¯ %[2]s ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 例: .drone.yml, /docs/**/*.txt settings.add_protected_branch=ä¿è­·ã‚’有効ã«ã™ã‚‹ settings.delete_protected_branch=ä¿è­·ã‚’無効ã«ã™ã‚‹ settings.update_protect_branch_success=ルール "%s" ã«å¯¾ã™ã‚‹ãƒ–ランãƒä¿è­·ã‚’æ›´æ–°ã—ã¾ã—ãŸã€‚ @@ -2574,10 +2618,10 @@ release.tag_helper_existing=存在ã™ã‚‹ã‚¿ã‚°ã§ã™ã€‚ release.title=リリース タイトル release.title_empty=タイトルã¯ç©ºã«ã§ãã¾ã›ã‚“。 release.message=ã“ã®ãƒªãƒªãƒ¼ã‚¹ã®èª¬æ˜Ž -release.prerelease_desc=プレリリース +release.prerelease_desc=プレリリースã¨ã—ã¦ãƒžãƒ¼ã‚¯ release.prerelease_helper=ã“ã®ãƒªãƒªãƒ¼ã‚¹ãŒæœ¬ç•ªä½¿ç”¨ã«é©ã•ãªã„ã“ã¨ã‚’示ã—ã¾ã™ã€‚ release.cancel=キャンセル -release.publish=リリースを発行 +release.publish=リリースを公開 release.save_draft=下書ãã‚’ä¿å­˜ release.edit_release=リリースを更新 release.delete_release=リリースを削除 @@ -2594,7 +2638,7 @@ release.tag_already_exist=ã“ã®ã‚¿ã‚°åã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚ release.downloads=ダウンロード release.download_count=ダウンロード数: %s release.add_tag_msg=リリースã®ã‚¿ã‚¤ãƒˆãƒ«ã¨å†…容をタグã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã™ã‚‹ -release.add_tag=ã‚¿ã‚°ã®ã¿ä½œæˆ +release.add_tag=ã‚¿ã‚°ã‚’ä½œæˆ release.releases_for=%s ã®ãƒªãƒªãƒ¼ã‚¹ release.tags_for=%s ã®ã‚¿ã‚° @@ -2654,7 +2698,6 @@ error.csv.unexpected=ã“ã®ãƒ•ァイル㯠%d 行目㮠%d 文字目ã«äºˆæœŸã— error.csv.invalid_field_count=ã“ã®ãƒ•ァイル㯠%d 行目ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã®æ•°ãŒæ­£ã—ããªã„ãŸã‚表示ã§ãã¾ã›ã‚“。 admin.enabled_flags = ã“ã®ãƒªãƒã‚¸ãƒˆãƒªã§æœ‰åйã«ãªã£ã¦ã„るフラグ: clone_in_vscodium = VSCodiumã§cloneã™ã‚‹ -desc.sha256 = SHA256 wiki.cancel = キャンセル activity.navbar.contributors = 貢献者 contributors.contribution_type.filter_label = 貢献ã®ç¨®é¡ž: @@ -2689,15 +2732,15 @@ commits.renamed_from = %sã‹ã‚‰åå‰ã‚’変更 pulls.made_using_agit = Agit pulls.agit_explanation = Agitã«ã‚ˆã‚‹ãƒ¯ãƒ¼ã‚¯ãƒ•ローを作æˆã—ã¾ã™ã€‚Agitã§ã¯ã€è²¢çŒ®è€…ã¯å¤‰æ›´ã‚’forkã—ãŸã‚Šãƒ–ランãƒã‚’作るã®ã§ã¯ãªãã€"git push"ã—ã¦ææ¡ˆã—ã¾ã™ã€‚ contributors.contribution_type.deletions = 削除 -settings.units.add_more = ã•らã«... -settings.wiki_globally_editable = 誰ã«ã§ã‚‚Wikiã®ç·¨é›†ã‚’許㙠+settings.units.add_more = ã•ã‚‰ã«æœ‰åйã«ã™ã‚‹ +settings.wiki_globally_editable = 誰ã§ã‚‚Wikiを編集ã§ãる様ã«ã™ã‚‹ settings.confirmation_string = ç¢ºèª settings.wiki_rename_branch_main_notices_1 = ã“ã®æ“作㯠å–り消ã—ã§ãã¾ã›ã‚“ 。 stars = スター n_tag_few = %s ã®ã‚¿ã‚° settings.graphql_url = GraphQL URL n_branch_one = %s ã®ãƒ–ランム-settings.units.units = リãƒã‚¸ãƒˆãƒªæ©Ÿèƒ½ +settings.units.units = 機能設定 settings.wiki_rename_branch_main_notices_2 = ã“れã«ã‚ˆã‚Šã€%s ã®ãƒªãƒã‚¸ãƒˆãƒª wiki ã®å†…部ブランãƒã®åå‰ãŒæ°¸ä¹…ã«å¤‰æ›´ã•れã¾ã™ã€‚既存ã®ãƒã‚§ãƒƒã‚¯ã‚¢ã‚¦ãƒˆã‚’æ›´æ–°ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ settings.sourcehut_builds.access_token_helper = JOBS:RW 権é™ã‚’æŒã¤ã‚¢ã‚¯ã‚»ã‚¹ トークン。meta.sr.ht ã§ builds.sr.ht トークン ã¾ãŸã¯ シークレット アクセスをæŒã¤ builds.sr.ht トークン を生æˆã—ã¾ã™ã€‚ settings.enforce_on_admins = リãƒã‚¸ãƒˆãƒªç®¡ç†è€…ã«ã“ã®ãƒ«ãƒ¼ãƒ«ã‚’é©ç”¨ã™ã‚‹ @@ -2737,7 +2780,7 @@ issues.archived_label_description = (アーカイブ済) %s settings.web_hook_name_sourcehut_builds = SourceHut Builds settings.matrix.room_id_helper = ルームIDã¯ã€Element web clientã®Room Settings > Advanced > Internal room IDã‹ã‚‰å–å¾—ã§ãã¾ã™ã€‚例:%s。 pulls.merged_title_desc_one = %[4]s ã® %[2]s ã‹ã‚‰ %[1]d ä»¶ã®ã‚³ãƒŸãƒƒãƒˆã‚’ %[3]s ã¸ãƒžãƒ¼ã‚¸ã—㟠-pulls.title_desc_one = %[3]s ã‹ã‚‰ %[1]d ä»¶ã®ã‚³ãƒŸãƒƒãƒˆã‚’ %[2]s ã¸ãƒžãƒ¼ã‚¸ã—ãŸã„ +pulls.title_desc_one = %[2]sã‹ã‚‰ %[1]d ä»¶ã®ã‚³ãƒŸãƒƒãƒˆã‚’ %[3]s ã¸ãƒžãƒ¼ã‚¸ã—ãŸã„ pulls.ready_for_review = ãƒ¬ãƒ“ãƒ¥ãƒ¼ã®æº–å‚™ãŒã§ãã¦ã„ã¾ã™ã‹ï¼Ÿ settings.transfer.button = 所有権を移é€ã™ã‚‹ settings.transfer.modal.title = æ‰€æœ‰æ¨©ã‚’ç§»é€ @@ -2747,6 +2790,43 @@ form.string_too_long = 指定ã•ã‚ŒãŸæ–‡å­—列㯠%d 文字より長ã„ã§ã™ project = プロジェクト subscribe.issue.guest.tooltip = ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’購読ã™ã‚‹ã«ã¯ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¦ãã ã•ã„。 subscribe.pull.guest.tooltip = ã“ã®ãƒ—ルリクエストを購読ã™ã‚‹ã«ã¯ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¦ãã ã•ã„。 +issues.author.tooltip.pr = ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã“ã®ãƒ—ルリクエストã®ä½œæˆè€…ã§ã™ã€‚ +issues.author.tooltip.issue = ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã“ã®å•題ã®ä½œæˆè€…ã§ã™ã€‚ +mirror_public_key = 公開SSHキー +mirror_use_ssh.text = SSHèªè¨¼ã‚’使用ã™ã‚‹ +mirror_use_ssh.helper = ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã™ã‚‹ã¨ã€Forgejo 㯠SSH 経由㮠Git ã§ãƒªãƒã‚¸ãƒˆãƒªã‚’ミラーリングã—ã€ã‚­ãƒ¼ãƒšã‚¢ã‚’作æˆã—ã¾ã™ã€‚生æˆã•れãŸå…¬é–‹ã‚­ãƒ¼ãŒå®›å…ˆãƒªãƒã‚¸ãƒˆãƒªã«ãƒ—ッシュã§ãるよã†ã«æ‰¿èªã•れã¦ã„ã‚‹ã“ã¨ã‚’確èªã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã—ãŸå ´åˆã€ãƒ‘スワードベースã®èªè¨¼ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。 +comments.edit.already_changed = コメントã®å¤‰æ›´ã‚’ä¿å­˜ã§ãã¾ã›ã‚“ã€‚ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯æ—¢ã«åˆ¥ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã‚ˆã£ã¦å¤‰æ›´ã•れã¦ã„るよã†ã§ã™ã€‚変更ãŒä¸Šæ›¸ãã•れãªã„よã†ã«ã€ãƒšãƒ¼ã‚¸ã‚’æ›´æ–°ã—ã¦å†åº¦ç·¨é›†ã—ã¦ãã ã•ã„ +no_eol.tooltip = ã“ã®ãƒ•ァイルã«ã¯æœ«å°¾ã®è¡Œæœ«æ–‡å­—ãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。 +issues.edit.already_changed = イシューã®å¤‰æ›´ã‚’ä¿å­˜ã§ãã¾ã›ã‚“ã€‚ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯æ—¢ã«åˆ¥ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã‚ˆã£ã¦å¤‰æ›´ã•れã¦ã„るよã†ã§ã™ã€‚変更ãŒä¸Šæ›¸ãã•れãªã„よã†ã«ã€ãƒšãƒ¼ã‚¸ã‚’æ›´æ–°ã—ã¦å†åº¦ç·¨é›†ã—ã¦ãã ã•ã„ +no_eol.text = EOLãªã— +pulls.edit.already_changed = プルリクエストã®å¤‰æ›´ã‚’ä¿å­˜ã§ãã¾ã›ã‚“ã€‚ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯æ—¢ã«åˆ¥ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã‚ˆã£ã¦å¤‰æ›´ã•れã¦ã„るよã†ã§ã™ã€‚変更ãŒä¸Šæ›¸ãã•れãªã„よã†ã«ã€ãƒšãƒ¼ã‚¸ã‚’æ›´æ–°ã—ã¦å†åº¦ç·¨é›†ã—ã¦ãã ã•ã„ +pulls.cmd_instruction_merge_warning = 警告: ã“ã®ãƒªãƒã‚¸ãƒˆãƒªã§ã¯ã€Œæ‰‹å‹•マージã®è‡ªå‹•検出ã€è¨­å®šãŒæœ‰åйã«ãªã£ã¦ã„ã¾ã›ã‚“。後ã§ã“ã®ãƒ—ル リクエストを手動ã§ãƒžãƒ¼ã‚¸æ¸ˆã¿ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ +n_release_one = %s リリース +n_release_few = %s リリース +milestones.filter_sort.name = åå‰ +mirror_use_ssh.not_available = SSHèªè¨¼ã¯åˆ©ç”¨ã§ãã¾ã›ã‚“。 +mirror_denied_combination = 公開éµã¨ãƒ‘スワードベースã®èªè¨¼ã‚’組ã¿åˆã‚ã›ã¦ä½¿ç”¨ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 +activity.navbar.pulse = æ´»å‹•çŠ¶æ³ +activity.published_prerelease_label = プレリリース +activity.published_tag_label = ã‚¿ã‚° +settings.transfer_quota_exceeded = æ–°ã—ã„æ‰€æœ‰è€… (%s) ã¯å‰²ã‚Šå½“ã¦é‡ã‚’è¶…ãˆã¦ã„ã¾ã™ã€‚リãƒã‚¸ãƒˆãƒªã¯è»¢é€ã•れã¦ã„ã¾ã›ã‚“。 +settings.pull_mirror_sync_quota_exceeded = 割り当ã¦é‡ã‚’è¶…éŽã—ãŸãŸã‚ã€å¤‰æ›´ã¯ãƒ—ルã•れã¾ã›ã‚“。 +activity.commit = コミットアクティビティ +settings.federation_settings = フェデレーション設定 +settings.federation_not_enabled = インスタンスã§ãƒ•ã‚§ãƒ‡ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒæœ‰åйã«ãªã£ã¦ã„ã¾ã›ã‚“。 +settings.federation_apapiurl = ã“ã®ãƒªãƒã‚¸ãƒˆãƒªã®ãƒ•ェデレーション URL。ã“れをコピーã—ã¦ã€ãƒ•ォロー リãƒã‚¸ãƒˆãƒªã® URL ã¨ã—ã¦åˆ¥ã®ãƒªãƒã‚¸ãƒˆãƒªã®ãƒ•ェデレーション設定ã«è²¼ã‚Šä»˜ã‘ã¾ã™ã€‚ +settings.federation_following_repos = フォローã—ã¦ã„るリãƒã‚¸ãƒˆãƒªã® URL。空白ãªã—ã§";"ã§åŒºåˆ‡ã‚‰ã‚Œã¾ã™ã€‚ +settings.mirror_settings.push_mirror.copy_public_key = 公開éµã‚’コピー +release.invalid_external_url = 無効ãªå¤–部URL: "%s" +release.type_attachment = 添付ファイル +release.asset_external_url = 外部URL +release.type_external_asset = 外部アセット +release.asset_name = アセットå +release.add_external_asset = 外部アセットを追加 +issues.all_title = 全㦠+settings.protect_new_rule = æ–°ã—ã„ブランãƒä¿è­·ãƒ«ãƒ¼ãƒ«ã‚’作æˆã™ã‚‹ +settings.discord_icon_url.exceeds_max_length = アイコンã®URL㯠2048 文字以下ã«ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ +issues.new.assign_to_me = 自分ã«å‰²ã‚Šå½“㦠[graphs] component_loading = %s ã®èª­ã¿è¾¼ã¿ä¸­... @@ -2831,18 +2911,18 @@ members.invite_now=今ã™ã招待 teams.join=å‚加 teams.leave=脱退 -teams.leave.detail=%s ã‹ã‚‰è„±é€€ã—ã¾ã™ã‹ï¼Ÿ +teams.leave.detail=本当㫠%s ã‹ã‚‰è„±é€€ã—ã¾ã™ã‹ï¼Ÿ teams.can_create_org_repo=リãƒã‚¸ãƒˆãƒªã‚’ä½œæˆ teams.can_create_org_repo_helper=メンãƒãƒ¼ã¯çµ„ç¹”ã®ãƒªãƒã‚¸ãƒˆãƒªã‚’æ–°ãŸã«ä½œæˆã§ãã¾ã™ã€‚作æˆè€…ã«ã¯æ–°ã—ã„リãƒã‚¸ãƒˆãƒªã®ç®¡ç†è€…権é™ãŒä¸Žãˆã‚‰ã‚Œã¾ã™ã€‚ teams.none_access=アクセスãªã— -teams.none_access_helper=メンãƒã¯ã€ã“ã®ãƒ¦ãƒ‹ãƒƒãƒˆã§è¡¨ç¤ºã‚„ä»–ã®æ“作を行ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“。 -teams.general_access=一般的ãªã‚¢ã‚¯ã‚»ã‚¹ +teams.none_access_helper=「アクセスãªã—ã€ã‚ªãƒ—ションã¯ãƒ—ライベートリãƒã‚¸ãƒˆãƒªã«ã®ã¿å½±éŸ¿ã—ã¾ã™ã€‚ +teams.general_access=ã‚«ã‚¹ã‚¿ãƒ æ¨©é™ teams.general_access_helper=メンãƒãƒ¼ã®æ¨©é™ã¯ä¸‹è¨˜ã®æ¨©é™ãƒ†ãƒ¼ãƒ–ãƒ«ã§æ±ºå®šã•れã¾ã™ã€‚ teams.read_access=読ã¿å–り teams.read_access_helper=メンãƒãƒ¼ã¯ãƒãƒ¼ãƒ ãƒªãƒã‚¸ãƒˆãƒªã®é–²è¦§ã¨ã‚¯ãƒ­ãƒ¼ãƒ³ãŒå¯èƒ½ã§ã™ã€‚ teams.write_access=書ã込㿠teams.write_access_helper=メンãƒãƒ¼ã¯ãƒãƒ¼ãƒ ãƒªãƒã‚¸ãƒˆãƒªã®èª­ã¿å–りã¨ãƒ—ッシュãŒå¯èƒ½ã§ã™ã€‚ -teams.admin_access=管ç†è€…アクセス権 +teams.admin_access=管ç†è€…æ¨©é™ teams.admin_access_helper=メンãƒãƒ¼ã¯ã€ãƒãƒ¼ãƒ ãƒªãƒã‚¸ãƒˆãƒªã¸ã®ãƒ—ルã€ãƒ—ッシュã€å…±åŒä½œæ¥­è€…ã®è¿½åŠ ãŒå¯èƒ½ã§ã™ã€‚ teams.no_desc=ã“ã®ãƒãƒ¼ãƒ ã«ã¯èª¬æ˜ŽãŒã‚りã¾ã›ã‚“。 teams.settings=設定 @@ -2858,7 +2938,7 @@ teams.delete_team_desc=ãƒãƒ¼ãƒ ã‚’削除ã™ã‚‹ã¨ã€ãƒ¡ãƒ³ãƒãƒ¼ã¯ã“ã®ãƒªãƒ teams.delete_team_success=ãƒãƒ¼ãƒ ã‚’削除ã—ã¾ã—ãŸã€‚ teams.read_permission_desc=ã“ã®ãƒãƒ¼ãƒ ã¯èª­ã¿å–りアクセス権をæŒã¡ã¾ã™: メンãƒãƒ¼ã¯ãƒãƒ¼ãƒ ãƒªãƒã‚¸ãƒˆãƒªã®é–²è¦§ã¨ã‚¯ãƒ­ãƒ¼ãƒ³ãŒå¯èƒ½ã§ã™ã€‚ teams.write_permission_desc=ã“ã®ãƒãƒ¼ãƒ ã¯æ›¸ãè¾¼ã¿ã‚¢ã‚¯ã‚»ã‚¹æ¨©ã‚’æŒã¡ã¾ã™: メンãƒãƒ¼ã¯ãƒãƒ¼ãƒ ãƒªãƒã‚¸ãƒˆãƒªã®èª­ã¿å–りã¨ãƒ—ッシュãŒå¯èƒ½ã§ã™ã€‚ -teams.admin_permission_desc=ã“ã®ãƒãƒ¼ãƒ ã¯ç®¡ç†è€…アクセス権をæŒã¡ã¾ã™: メンãƒãƒ¼ã¯ãƒãƒ¼ãƒ ãƒªãƒã‚¸ãƒˆãƒªã®èª­ã¿å–りã€ãƒ—ッシュã€å…±åŒä½œæ¥­è€…ã®è¿½åŠ ãŒå¯èƒ½ã§ã™ã€‚ +teams.admin_permission_desc=ã“ã®ãƒãƒ¼ãƒ ã¯ç®¡ç†è€…アクセス権ãŒä»˜ä¸Žã•れã¾ã™: メンãƒãƒ¼ã¯ãƒãƒ¼ãƒ ãƒªãƒã‚¸ãƒˆãƒªã®èª­ã¿å–りã€ãƒ—ッシュã€å…±åŒä½œæ¥­è€…ã®è¿½åŠ ãŒå¯èƒ½ã§ã™ã€‚ teams.create_repo_permission_desc=ã•らã«ã€ã“ã®ãƒãƒ¼ãƒ ã«ã¯ãƒªãƒã‚¸ãƒˆãƒªã®ä½œæˆæ¨©é™ãŒä¸Žãˆã‚‰ã‚Œã¦ã„ã¾ã™: メンãƒãƒ¼ã¯çµ„ç¹”ã®ãƒªãƒã‚¸ãƒˆãƒªã‚’æ–°ãŸã«ä½œæˆã§ãã¾ã™ã€‚ teams.repositories=ãƒãƒ¼ãƒ ã®ãƒªãƒã‚¸ãƒˆãƒª teams.search_repo_placeholder=リãƒã‚¸ãƒˆãƒªã‚’検索… @@ -2888,7 +2968,7 @@ dashboard=ダッシュボード identity_access=アイデンティティã¨ã‚¢ã‚¯ã‚»ã‚¹ users=ユーザーアカウント organizations=組織 -assets=コード アセット +assets=コードアセット repositories=リãƒã‚¸ãƒˆãƒª hooks=Webhook integrations=é€£æº @@ -2937,14 +3017,14 @@ dashboard.archive_cleanup=å¤ã„リãƒã‚¸ãƒˆãƒªã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã®å‰Šé™¤ dashboard.deleted_branches_cleanup=削除ブランãƒã®ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ— dashboard.update_migration_poster_id=移行ã™ã‚‹æŠ•稿者IDã®æ›´æ–° dashboard.git_gc_repos=ã™ã¹ã¦ã®ãƒªãƒã‚¸ãƒˆãƒªã§ã‚¬ãƒ™ãƒ¼ã‚¸ã‚³ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行 -dashboard.resync_all_sshkeys='.ssh/authorized_keys' ファイルをForgejo上ã®SSHã‚­ãƒ¼ã§æ›´æ–° -dashboard.resync_all_sshprincipals='.ssh/authorized_principals' ファイルをForgejo上ã®SSHãƒ—ãƒªãƒ³ã‚·ãƒ‘ãƒ«ã§æ›´æ–° -dashboard.resync_all_hooks=ã™ã¹ã¦ã®ãƒªãƒã‚¸ãƒˆãƒªã® pre-receive, update, post-receive フックを更新ã™ã‚‹ã€‚ +dashboard.resync_all_sshkeys=Forgejo SSH キーを使用ã—ã¦".ssh/authorized_keys"ファイルを更新ã—ã¾ã™ã€‚ +dashboard.resync_all_sshprincipals=Forgejo SSH プリンシパルを使用ã—ã¦".ssh/authorized_principals"ファイルを更新ã—ã¾ã™ã€‚ +dashboard.resync_all_hooks=ã™ã¹ã¦ã®ãƒªãƒã‚¸ãƒˆãƒªã® pre-receive, update, post-receive フックを更新ã™ã‚‹ dashboard.reinit_missing_repos=レコードãŒå­˜åœ¨ã™ã‚‹ãŒè¦‹å½“ãŸã‚‰ãªã„ã™ã¹ã¦ã®Gitリãƒã‚¸ãƒˆãƒªã‚’å†åˆæœŸåŒ–ã™ã‚‹ dashboard.sync_external_users=外部ユーザーデータã®åŒæœŸ dashboard.cleanup_hook_task_table=hook_taskテーブルã®ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ— dashboard.cleanup_packages=期é™åˆ‡ã‚Œãƒ‘ッケージã®ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ— -dashboard.cleanup_actions=Actionsã®æœŸé™åˆ‡ã‚Œã®ãƒ­ã‚°ã¨ã‚¢ãƒ¼ãƒ†ã‚£ãƒ•ァクトã®ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ— +dashboard.cleanup_actions=Actionsã‹ã‚‰æœŸé™åˆ‡ã‚Œã®ãƒ­ã‚°ã¨ã‚¢ãƒ¼ãƒ†ã‚£ãƒ•ァクトã®ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—ã™ã‚‹ dashboard.server_uptime=サーãƒãƒ¼ã®ç¨¼åƒæ™‚é–“ dashboard.current_goroutine=ç¾åœ¨ã®Goroutineæ•° dashboard.current_memory_usage=ç¾åœ¨ã®ãƒ¡ãƒ¢ãƒªä½¿ç”¨é‡ @@ -3001,7 +3081,7 @@ users.repos=リãƒã‚¸ãƒˆãƒª users.created=ä½œæˆæ—¥ users.last_login=å‰å›žã®ã‚µã‚¤ãƒ³ã‚¤ãƒ³ users.never_login=未サインイン -users.send_register_notify=ユーザーã«ç™»éŒ²é€šçŸ¥ã‚’é€ã‚‹ +users.send_register_notify=ユーザーã«ç™»éŒ²ãƒ¡ãƒ¼ãƒ«ã‚’é€ã‚‹ users.new_success=ユーザーアカウント "%s" を作æˆã—ã¾ã—ãŸã€‚ users.edit=編集 users.auth_source=èªè¨¼ã‚½ãƒ¼ã‚¹ @@ -3012,21 +3092,21 @@ users.update_profile_success=ユーザーアカウントを更新ã—ã¾ã—ãŸã€‚ users.edit_account=ユーザーアカウントã®ç·¨é›† users.max_repo_creation=リãƒã‚¸ãƒˆãƒªæ•°ã®ä¸Šé™ users.max_repo_creation_desc=( -1を設定ã™ã‚‹ã¨ãƒ‡ãƒ•ォルトã®åˆ¶é™ãŒé©ç”¨ã•れã¾ã™) -users.is_activated=ユーザーアカウントã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ™ãƒ¼ãƒˆæ¸ˆã¿ -users.prohibit_login=サインイン無効 +users.is_activated=有効化ã•れãŸã‚¢ã‚«ã‚¦ãƒ³ãƒˆ +users.prohibit_login=アカウントãŒåœæ­¢ã•れã¾ã—㟠users.is_admin=管ç†è€… -users.is_restricted=制é™ã‚り -users.allow_git_hook=Gitフックを作æˆå¯ +users.is_restricted=制é™ä»˜ãアカウント +users.allow_git_hook=Gitフックを作æˆå¯èƒ½ users.allow_git_hook_tooltip=Gitフックã¯ã€Forgejoを実行ã—ã¦ã„ã‚‹OSãƒ¦ãƒ¼ã‚¶ãƒ¼ã®æ¨©é™ã§å®Ÿè¡Œã•れã€åŒã˜ãƒ¬ãƒ™ãƒ«ã®ãƒ›ã‚¹ãƒˆã‚¢ã‚¯ã‚»ã‚¹æ¨©ã‚’æŒã¤ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ãã®çµæžœã€ã“ã®ç‰¹åˆ¥ãªGitフック権é™ã‚’æŒã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã€Forgejo上ã®ã™ã¹ã¦ã®ãƒªãƒã‚¸ãƒˆãƒªã¨Forgejoã§ä½¿ç”¨ã•れã¦ã„るデータベースã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã€å¤‰æ›´ã‚’加ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã—ãŸãŒã£ã¦ã€Forgejoã®ç®¡ç†è€…権é™ã‚’å–å¾—ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ -users.allow_import_local=ローカルリãƒã‚¸ãƒˆãƒªã‚’インãƒãƒ¼ãƒˆå¯ -users.allow_create_organization=組織を作æˆå¯ +users.allow_import_local=ローカルリãƒã‚¸ãƒˆãƒªã‚’インãƒãƒ¼ãƒˆå¯èƒ½ +users.allow_create_organization=組織を作æˆå¯èƒ½ users.update_profile=ユーザーアカウントを更新 users.delete_account=ユーザーアカウントを削除 users.cannot_delete_self=自分自身を削除ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ users.still_own_repo=ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã¾ã 1ã¤ä»¥ä¸Šã®ãƒªãƒã‚¸ãƒˆãƒªã‚’所有ã—ã¦ã„ã¾ã™ã€‚ å…ˆã«ãれらã®ãƒªãƒã‚¸ãƒˆãƒªã‚’削除ã™ã‚‹ã‹ç§»è»¢ã—ã¦ãã ã•ã„。 users.still_has_org=ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯çµ„ç¹”ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ãªã£ã¦ã„ã¾ã™ã€‚ å…ˆã«çµ„ç¹”ã‹ã‚‰ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’削除ã—ã¦ãã ã•ã„。 -users.purge=ユーザーを抹消 -users.purge_help=強制的ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¨ãã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒæ‰€æœ‰ã—ã¦ã„ãŸãƒªãƒã‚¸ãƒˆãƒªã€çµ„ç¹”ã€ãƒ‘ッケージを削除ã—ã¾ã™ã€‚コメントもã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã€‚ +users.purge=ユーザーを消去 +users.purge_help=強制的ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¨ãã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒæ‰€æœ‰ã—ã¦ã„ãŸãƒªãƒã‚¸ãƒˆãƒªã€çµ„ç¹”ã€ãƒ‘ッケージを削除ã—ã¾ã™ã€‚コメントã¨ã‚¤ã‚·ãƒ¥ãƒ¼ã‚‚ã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã€‚ users.still_own_packages=ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã¾ã 1ã¤ä»¥ä¸Šã®ãƒ‘ッケージを所有ã—ã¦ã„ã¾ã™ã€‚å…ˆã«ãれらã®ãƒ‘ッケージを削除ã—ã¦ãã ã•ã„。 users.deletion_success=ユーザーアカウントを削除ã—ã¾ã—ãŸã€‚ users.reset_2fa=2è¦ç´ èªè¨¼ã‚’リセット @@ -3423,8 +3503,24 @@ self_check.database_collation_case_insensitive = データベース㯠%s ã¨ã„ config_settings = 設定 config_summary = æ¦‚è¦ self_check.database_inconsistent_collation_columns = データベース㯠%s ã¨ã„ㆠcollation を用ã„ã¦ã„ã¾ã™ãŒã€ã“れらã®ã‚«ãƒ©ãƒ ã¯åˆ¥ã®collationを用ã„ã¦ã„ã¾ã™ã€‚ã“ã‚Œã¯æƒ³å®šå¤–ã®å•題を引ãèµ·ã“ã™å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ +users.organization_creation.description = æ–°ã—ã„組織ã®ä½œæˆã‚’許å¯ã—ã¾ã™ã€‚ +users.restricted.description = ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒå…±åŒä½œæ¥­è€…ã¨ã—ã¦è¿½åŠ ã•れã¦ã„るリãƒã‚¸ãƒˆãƒªãŠã‚ˆã³çµ„ç¹”ã¨ã®ã‚„りå–りã®ã¿ã‚’許å¯ã—ã¾ã™ã€‚ã“れã«ã‚ˆã‚Šã€ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ä¸Šã®ãƒ‘ブリックリãƒã‚¸ãƒˆãƒªã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒé˜²æ­¢ã•れã¾ã™ã€‚ +users.activated.description = メールèªè¨¼ã®å®Œäº†ã€‚アクティブ化ã•れã¦ã„ãªã„ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®æ‰€æœ‰è€…ã¯ã€ãƒ¡ãƒ¼ãƒ«èªè¨¼ãŒå®Œäº†ã™ã‚‹ã¾ã§ãƒ­ã‚°ã‚¤ãƒ³ã§ãã¾ã›ã‚“。 +users.admin.description = ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã€Web UI ãŠã‚ˆã³ API を通ã˜ã¦åˆ©ç”¨ã§ãã‚‹ã™ã¹ã¦ã®ç®¡ç†æ©Ÿèƒ½ã¸ã®ãƒ•ルアクセス権を付与ã—ã¾ã™ã€‚ +users.local_import.description = サーãƒãƒ¼ã®ãƒ­ãƒ¼ã‚«ãƒ«ãƒ•ァイル システムã‹ã‚‰ãƒªãƒã‚¸ãƒˆãƒªã‚’インãƒãƒ¼ãƒˆã§ãるよã†ã«ã—ã¾ã™ã€‚ã“れã¯ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ä¸Šã®å•題ã«ãªã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ +users.block.description = ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒè‡ªåˆ†ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’通ã˜ã¦ã“ã®ã‚µãƒ¼ãƒ“スã¨ã‚„りå–りã™ã‚‹ã“ã¨ã‚’ブロックã—ã€ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã‚’ç¦æ­¢ã—ã¾ã™ã€‚ +emails.delete = メールアドレスを削除 +emails.delete_desc = ã“ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? +config.cache_test_succeeded = キャッシュ ãƒ†ã‚¹ãƒˆãŒæˆåŠŸã—ã¾ã—ãŸã€‚%s ã§å¿œç­”ãŒè¿”ã•れã¾ã—ãŸã€‚ +config.cache_test_slow = キャッシュ ãƒ†ã‚¹ãƒˆã¯æˆåŠŸã—ã¾ã—ãŸãŒã€å¿œç­”ãŒé…ã„ã§ã™: %s。 +emails.deletion_success = メールアドレスã¯å‰Šé™¤ã•れã¾ã—ãŸã€‚ +emails.delete_primary_email_error = プライマリメールを削除ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 +config.app_slogan = インスタンスã®ã‚¹ãƒ­ãƒ¼ã‚¬ãƒ³ +config.cache_test = テストキャッシュ +config.cache_test_failed = キャッシュã®èª¿æŸ»ã«å¤±æ•—ã—ã¾ã—ãŸ: %v. + [action] create_repo=ãŒãƒªãƒã‚¸ãƒˆãƒª %s を作æˆã—ã¾ã—㟠rename_repo=ãŒãƒªãƒã‚¸ãƒˆãƒªåã‚’ %[1]s ã‹ã‚‰ %[3]s ã¸å¤‰æ›´ã—ã¾ã—㟠@@ -3668,6 +3764,8 @@ rpm.repository.multiple_groups = ã“ã®ãƒ‘ッケージã¯è¤‡æ•°ã®ã‚°ãƒ«ãƒ¼ãƒ— owner.settings.cargo.rebuild.no_index = 冿§‹ç¯‰ã§ãã¾ã›ã‚“ã€ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãŒåˆæœŸåŒ–ã•れã¦ã„ã¾ã›ã‚“。 npm.dependencies.bundle = ãƒãƒ³ãƒ‰ãƒ«ã•れãŸä¾å­˜é–¢ä¿‚ +search_in_external_registry = %s ã§æ¤œç´¢ + [secrets] secrets=シークレット description=シークレットã¯ç‰¹å®šã®Actionsã«æ¸¡ã•れã¾ã™ã€‚ ãれ以外ã§èª­ã¿å‡ºã•れるã“ã¨ã¯ã‚りã¾ã›ã‚“。 @@ -3746,8 +3844,8 @@ runs.actors_no_select=ã™ã¹ã¦ã®ã‚¢ã‚¯ã‚¿ãƒ¼ runs.status_no_select=ã™ã¹ã¦ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ runs.no_results=一致ã™ã‚‹çµæžœã¯ã‚りã¾ã›ã‚“。 runs.no_workflows=ワークフローã¯ã¾ã ã‚りã¾ã›ã‚“。 -runs.no_workflows.quick_start=Gitea Actions ã®å§‹ã‚æ–¹ãŒã‚ã‹ã‚‰ãªã„? ã§ã¯ã‚¯ã‚¤ãƒƒã‚¯ã‚¹ã‚¿ãƒ¼ãƒˆã‚¬ã‚¤ãƒ‰ã‚’ã”覧ãã ã•ã„。 -runs.no_workflows.documentation=Gitea Actions ã®è©³ç´°ã«ã¤ã„ã¦ã¯ã€ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’å‚ç…§ã—ã¦ãã ã•ã„。 +runs.no_workflows.quick_start = Forgejo Action ã®å§‹ã‚æ–¹ãŒã‚ã‹ã‚‰ãªã„? クイックスタートガイドをã”覧ãã ã•ã„。 +runs.no_workflows.documentation = Forgejo Action ã®è©³ç´°ã«ã¤ã„ã¦ã¯ã€ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’å‚ç…§ã—ã¦ãã ã•ã„。 runs.no_runs=ワークフローã¯ã¾ã å®Ÿè¡Œã•れã¦ã„ã¾ã›ã‚“。 runs.empty_commit_message=(空ã®ã‚³ãƒŸãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸) @@ -3773,20 +3871,29 @@ variables.creation.failed=変数を追加ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ variables.creation.success=変数 "%s" を追加ã—ã¾ã—ãŸã€‚ variables.update.failed=変数を更新ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ variables.update.success=変数を更新ã—ã¾ã—ãŸã€‚ -runs.no_workflows.quick_start = Forgejo Action ã®å§‹ã‚æ–¹ãŒã‚ã‹ã‚‰ãªã„? クイックスタートガイドをã”覧ãã ã•ã„。 -runs.no_workflows.documentation = Forgejo Action ã®è©³ç´°ã«ã¤ã„ã¦ã¯ã€ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’å‚ç…§ã—ã¦ãã ã•ã„。 variables.id_not_exist = idãŒ%dã®å¤‰æ•°ã¯å­˜åœ¨ã—ã¾ã›ã‚“。 runs.workflow = ワークフロー runs.no_job_without_needs = ワークフローã«ã¯ã€ä¾å­˜é–¢ä¿‚ã®ãªã„ジョブãŒå°‘ãªãã¨ã‚‚ 1 ã¤å«ã¾ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ +workflow.dispatch.run = ワークフローを実行 +workflow.dispatch.success = ワークフローã®å®Ÿè¡ŒãŒæ­£å¸¸ã«ãƒªã‚¯ã‚¨ã‚¹ãƒˆã•れã¾ã—ãŸã€‚ +workflow.dispatch.trigger_found = ã“ã®ãƒ¯ãƒ¼ã‚¯ãƒ•ローã«ã¯ workflow_dispatch イベントトリガーãŒã‚りã¾ã™ã€‚ +workflow.dispatch.use_from = ワークフローを使用ã™ã‚‹ +workflow.dispatch.input_required = 入力 "%s" ã«å€¤ãŒå¿…è¦ã§ã™ã€‚ +workflow.dispatch.invalid_input_type = 入力タイプ「%sã€ãŒç„¡åйã§ã™ã€‚ +workflow.dispatch.warn_input_limit = 最åˆã® %d 個ã®å…¥åŠ›ã®ã¿ã‚’表示ã—ã¾ã™ã€‚ +runs.no_job = ワークフローã«ã¯å°‘ãªãã¨ã‚‚1ã¤ã®ã‚¸ãƒ§ãƒ–ãŒå«ã¾ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ + +runs.expire_log_message = ログã¯å¤ã™ãŽã‚‹ãŸã‚消去ã•れã¦ã„ã¾ã™ã€‚ [projects] type-1.display_name=個人プロジェクト type-2.display_name=リãƒã‚¸ãƒˆãƒª プロジェクト type-3.display_name=組織プロジェクト +deleted.display_name = 削除ã•れãŸãƒ—ロジェクト + [git.filemode] changed_filemode=%[1]s → %[2]s -; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … directory=ディレクトリ normal_file=ノーマルファイル executable_file=実行å¯èƒ½ãƒ•ァイル @@ -3816,6 +3923,14 @@ no_results = 一致ã™ã‚‹çµæžœãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ fuzzy_tooltip = 入力ã•れãŸèªžå¥ã«è¿‘ã„ã‚‚ã®ã‚‚çµæžœã«å«ã‚ã‚‹ match = 一致 match_tooltip = 検索語å¥ã«å޳坆ã«ä¸€è‡´ã™ã‚‹ã‚‚ã®ã®ã¿çµæžœã«å«ã‚ã‚‹ +milestone_kind = マイルストーンを検索... +union_tooltip = 空白ã§åŒºåˆ‡ã‚‰ã‚ŒãŸã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã®ã„ãšã‚Œã‹ã«ä¸€è‡´ã™ã‚‹çµæžœã‚’å«ã‚ã‚‹ +exact_tooltip = 検索語å¥ã¨å®Œå…¨ã«ä¸€è‡´ã™ã‚‹çµæžœã®ã¿ã‚’å«ã‚ã‚‹ +issue_kind = イシューを検索... +pull_kind = プルを検索... +exact = 完全一致 +regexp_tooltip = 検索語å¥ã‚’æ­£è¦è¡¨ç¾ã¨ã—ã¦è§£é‡ˆã™ã‚‹ +regexp = æ­£è¦è¡¨ç¾ [munits.data] @@ -3830,4 +3945,27 @@ b = B [markup] filepreview.lines = %[3]s ã® %[1]d 行目ã‹ã‚‰ %[2]d 行目 filepreview.line = %[2]s ã® %[1]d 行目 -filepreview.truncated = プレビューã¯é€”中ã‹ã‚‰çœç•¥ã•れã¦ã„ã¾ã™ \ No newline at end of file +filepreview.truncated = プレビューã¯é€”中ã‹ã‚‰çœç•¥ã•れã¦ã„ã¾ã™ + +[repo.permissions] +actions.write = 書ãè¾¼ã¿: ä¿ç•™ä¸­ã® CI/CD パイプラインを手動ã§ãƒˆãƒªã‚¬ãƒ¼ã€å†èµ·å‹•ã€ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã€ã¾ãŸã¯æ‰¿èªã—ã¾ã™ã€‚ +ext_issues = 外部ã®ã‚¤ã‚·ãƒ¥ãƒ¼è¿½è·¡ã¸ã®ãƒªãƒ³ã‚¯ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¾ã™ã€‚権é™ã¯å¤–部ã§ç®¡ç†ã•れã¾ã™ã€‚ +ext_wiki = 外部 Wiki ã¸ã®ãƒªãƒ³ã‚¯ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¾ã™ã€‚権é™ã¯å¤–部ã§ç®¡ç†ã•れã¾ã™ã€‚ +projects.write = 書ãè¾¼ã¿: プロジェクトã¨åˆ—を作æˆã—ã€ç·¨é›†ã—ã¾ã™ã€‚ +packages.read = 読ã¿å–り: リãƒã‚¸ãƒˆãƒªã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸãƒ‘ッケージを表示ãŠã‚ˆã³ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ +packages.write = 書ãè¾¼ã¿: リãƒã‚¸ãƒˆãƒªã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸãƒ‘ッケージを公開ãŠã‚ˆã³å‰Šé™¤ã—ã¾ã™ã€‚ +code.read = 読ã¿å–り: リãƒã‚¸ãƒˆãƒªã®ã‚³ãƒ¼ãƒ‰ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã‚¯ãƒ­ãƒ¼ãƒ³ã‚’作æˆã—ã¾ã™ã€‚ +code.write = 書ãè¾¼ã¿: リãƒã‚¸ãƒˆãƒªã«ãƒ—ッシュã—ã€ãƒ–ランãƒã¨ã‚¿ã‚°ã‚’作æˆã—ã¾ã™ã€‚ +issues.read = 読ã¿å–り: イシューã¨ã‚³ãƒ¡ãƒ³ãƒˆã‚’読んã§ä½œæˆã—ã¾ã™ã€‚ +issues.write = 書ãè¾¼ã¿: イシューを解決ã—ã€ãƒ©ãƒ™ãƒ«ã€ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³ã€æ‹…å½“è€…ã€æœŸé™ã€ä¾å­˜é–¢ä¿‚ãªã©ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’管ç†ã—ã¾ã™ã€‚ +pulls.read = 読ã¿å–り: プルリクエストã®èª­ã¿å–りã¨ä½œæˆã€‚ +releases.read = 読ã¿å–り: リリースを表示ãŠã‚ˆã³ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ +releases.write = 書ãè¾¼ã¿: リリースã¨ãã®ã‚¢ã‚»ãƒƒãƒˆã‚’公開ã€ç·¨é›†ã€å‰Šé™¤ã—ã¾ã™ã€‚ +pulls.write = 書ãè¾¼ã¿: プルリクエストをクローズã—ã€ãƒ©ãƒ™ãƒ«ã€ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³ã€æ‹…å½“è€…ã€æœŸé™ã€ä¾å­˜é–¢ä¿‚ãªã©ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’管ç†ã—ã¾ã™ã€‚ +wiki.read = 読ã¿å–り: çµ±åˆã•れ㟠wiki ã¨ãã®å±¥æ­´ã‚’読ã¿å–れã¾ã™ã€‚ +wiki.write = 書ãè¾¼ã¿: çµ±åˆã•れ㟠Wiki 内ã®ãƒšãƒ¼ã‚¸ã‚’作æˆã€æ›´æ–°ã€å‰Šé™¤ã—ã¾ã™ã€‚ +projects.read = 読ã¿å–り: リãƒã‚¸ãƒˆãƒª プロジェクト ボードã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¾ã™ã€‚ +actions.read = 読ã¿å–り: çµ±åˆã•れ㟠CI/CD パイプラインã¨ãã®ãƒ­ã‚°ã‚’表示ã—ã¾ã™ã€‚ + +[translation_meta] +test = ã“れã¯ãƒ†ã‚¹ãƒˆæ–‡å­—列ã§ã™ã€‚Forgejo UI ã«ã¯è¡¨ç¤ºã•れã¾ã›ã‚“ãŒã€ãƒ†ã‚¹ãƒˆç›®çš„ã§ä½¿ç”¨ã•れã¾ã™ã€‚æ—©ãæ¸ˆã¾ã›ã‚‹ãŸã‚ã«"ok"ã¨å…¥åŠ›ã™ã‚‹ã‹æ¥½ã—ã‹ã£ãŸå‡ºæ¥äº‹ã‚’入力ã—ã¦ä¸‹ã•ã„。ãã†ã™ã‚Œã°ã€å®Œäº†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ :) diff --git a/options/locale/locale_ka.ini b/options/locale/locale_ka.ini new file mode 100644 index 0000000000..b1e1df74b3 --- /dev/null +++ b/options/locale/locale_ka.ini @@ -0,0 +1,836 @@ +[common] +home = სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ +dashboard = სáƒáƒ›áƒ£áƒ¨áƒáƒ მáƒáƒ’იდრ+explore = დáƒáƒ—ვáƒáƒšáƒ˜áƒ”რებრ+help = დáƒáƒ®áƒ›áƒáƒ áƒ”ბრ+logo = ლáƒáƒ’რ+sign_in = შესვლრ+sign_in_or = áƒáƒœ +sign_out = გáƒáƒ¡áƒ•ლრ+sign_up = რეგისტრáƒáƒªáƒ˜áƒ +link_account = áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ მიბმრ+register = რეგისტრáƒáƒªáƒ˜áƒ +version = ვერსირ+page = გვერდი +template = ნიმუში +language = ენრ+notifications = გáƒáƒ¤áƒ áƒ—ხილებები +create_new = შექმნáƒâ€¦ +licenses = ლიცენზიები +toggle_menu = მენიუს გáƒáƒ“áƒáƒ áƒ—ვრ+more_items = მეტი ელემენტი +username = მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი +email = ელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი +password = პáƒáƒ áƒáƒšáƒ˜ +access_token = წვდáƒáƒ›áƒ˜áƒ¡ ტáƒáƒ™áƒ”ნი +re_type = დáƒáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”თ პáƒáƒ áƒáƒšáƒ˜ +captcha = კáƒáƒžáƒ©áƒ +twofa = 2FA +passcode = სáƒáƒ™áƒ•áƒáƒœáƒ«áƒ კáƒáƒ“ი +repository = რეპáƒáƒ–იტáƒáƒ áƒ˜áƒ +organization = áƒáƒ áƒ’áƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ +mirror = სáƒáƒ áƒ™áƒ” +new_mirror = áƒáƒ®áƒáƒšáƒ˜ სáƒáƒ áƒ™áƒ” +new_project = áƒáƒ®áƒáƒšáƒ˜ პრáƒáƒ”ქტი +new_project_column = áƒáƒ®áƒáƒšáƒ˜ სვეტი +admin_panel = სáƒáƒ˜áƒ¢áƒ˜áƒ¡ áƒáƒ“მინისტრირებრ+settings = მáƒáƒ áƒ’ებრ+your_profile = პრáƒáƒ¤áƒ˜áƒšáƒ˜ +your_starred = ვáƒáƒ áƒ¡áƒ™áƒ•ლáƒáƒ•იáƒáƒœáƒ˜ +your_settings = მáƒáƒ áƒ’ებრ+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 = თáƒáƒ•იდáƒáƒœ გáƒáƒ¨áƒ•ებრ+save = შენáƒáƒ®áƒ•რ+add = დáƒáƒ›áƒáƒ¢áƒ”ბრ+add_all = ყველáƒáƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბრ+remove = წáƒáƒ¨áƒšáƒ +remove_all = ყველáƒáƒ¡ წáƒáƒ¨áƒšáƒ +edit = ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბრ+view = ხედი +test = შემáƒáƒ¬áƒ›áƒ”ბრ+enabled = ჩáƒáƒ áƒ—ულირ+disabled = გáƒáƒ›áƒáƒ áƒ—ულირ+locked = ჩáƒáƒ™áƒ”ტილირ+copy = კáƒáƒžáƒ˜áƒ áƒ”ბრ+copy_url = ბმულის კáƒáƒžáƒ˜áƒ áƒ”ბრ+copy_hash = ჰეშის კáƒáƒžáƒ˜áƒ áƒ”ბრ+copy_path = ბილიკის კáƒáƒžáƒ˜áƒ áƒ”ბრ+copy_content = შემცველáƒáƒ‘ის კáƒáƒžáƒ˜áƒ áƒ”ბრ+copy_success = დáƒáƒ™áƒáƒžáƒ˜áƒ áƒ”ბულიáƒ! +copy_error = კáƒáƒžáƒ˜áƒ áƒ”ბრჩáƒáƒ•áƒáƒ áƒ“რ+write = ჩáƒáƒ¬áƒ”რრ+preview = მინიáƒáƒ¢áƒ£áƒ áƒ +loading = ჩáƒáƒ¢áƒ•ირთვáƒâ€¦ +error = შეცდáƒáƒ›áƒ +never = áƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡ +unknown = უცნáƒáƒ‘ი +pin = áƒáƒ›áƒáƒ’რებრ+unpin = ჩáƒáƒ›áƒáƒ®áƒ¡áƒœáƒ +artifacts = áƒáƒ áƒ¢áƒ”ფáƒáƒ¥áƒ¢áƒ”ბი +archived = დáƒáƒáƒ áƒ¥áƒ˜áƒ•ებული +concept_system_global = გლáƒáƒ‘áƒáƒšáƒ£áƒ áƒ˜ +concept_user_individual = ინდივიდუáƒáƒšáƒ£áƒ áƒ˜ +concept_code_repository = რეპáƒáƒ–იტáƒáƒ áƒ˜áƒ +concept_user_organization = áƒáƒ áƒ’áƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ +name = სáƒáƒ®áƒ”ლი +value = მნიშვნელáƒáƒ‘რ+filter = ფილტრი +filter.is_archived = დáƒáƒáƒ áƒ¥áƒ˜áƒ•ებული +filter.is_fork = ფáƒáƒ áƒ™áƒ”ბი +filter.is_mirror = სáƒáƒ áƒ™áƒ”ები +filter.is_template = ნიმუშები +filter.public = სáƒáƒ¯áƒáƒ áƒ +filter.private = პირáƒáƒ“ი + +[search] +search = ძებნáƒâ€¦ +fuzzy = გáƒáƒ£áƒ áƒ™áƒ•ეველი +union = გáƒáƒ”რთიáƒáƒœáƒ”ბრ+exact = ზუსტი +regexp = რეგგáƒáƒ›áƒáƒ¡áƒ˜ + +[aria] +footer = ქვედრკáƒáƒšáƒáƒœáƒ¢áƒ˜áƒ¢áƒ£áƒšáƒ˜ +footer.links = ბმულები + +[heatmap] +contributions_one = შეწირულáƒáƒ‘რ+contributions_few = შეწირულáƒáƒ‘ები +less = ნáƒáƒ™áƒšáƒ”ბი +more = მეტი + +[editor] +table_modal.placeholder.header = ზედრკáƒáƒšáƒáƒœáƒ¢áƒ˜áƒ¢áƒ£áƒšáƒ˜ +table_modal.placeholder.content = შემცველáƒáƒ‘რ+table_modal.label.rows = მწკრივი +table_modal.label.columns = სვეტი +link_modal.url = Url +link_modal.description = áƒáƒ¦áƒ¬áƒ”რრ+ +[startpage] +platform = პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ—áƒáƒ¨áƒáƒ áƒ˜áƒ¡áƒ˜ +lightweight = მსუბუქი + +[install] +install = დáƒáƒ§áƒ”ნებრ+host = ჰáƒáƒ¡áƒ¢áƒ˜ +user = მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი +password = პáƒáƒ áƒáƒšáƒ˜ +db_schema = სქემრ+ssl_mode = SSL +path = ბილიკი +admin_password = პáƒáƒ áƒáƒšáƒ˜ + +[home] +my_repos = რეპáƒáƒ–იტáƒáƒ áƒ˜áƒ”ბი +my_orgs = áƒáƒ áƒ’áƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ”ბი +show_archived = დáƒáƒáƒ áƒ¥áƒ˜áƒ•ებული +show_private = პირáƒáƒ“ი + +[explore] +repos = რეპáƒáƒ–იტáƒáƒ áƒ˜áƒ”ბი +users = მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლები +organizations = áƒáƒ áƒ’áƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ”ბი +code = კáƒáƒ“ი + +[auth] +verify = გáƒáƒ“áƒáƒ›áƒáƒ¬áƒ›áƒ”ბრ+openid_connect_submit = მიერთებრ+ +[mail] +release.note = შენიშვნáƒ: +release.downloads = გáƒáƒ“მáƒáƒ¬áƒ”რები: +repo.transfer.to_you = თქვენ + +[modal] +yes = დიáƒáƒ® +no = áƒáƒ áƒ +confirm = დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბრ+cancel = გáƒáƒ£áƒ¥áƒ›áƒ”ბრ+modify = გáƒáƒœáƒáƒ®áƒšáƒ”ბრ+ +[form] +UserName = მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი +Description = áƒáƒ¦áƒ¬áƒ”რრ+Pronouns = ნáƒáƒªáƒ•áƒáƒšáƒ¡áƒáƒ®áƒ”ლები +Biography = ბიáƒáƒ’რáƒáƒ¤áƒ˜áƒ +Website = ვებგვერდი +Location = მდებáƒáƒ áƒ”áƒáƒ‘რ+Password = პáƒáƒ áƒáƒšáƒ˜ +Content = შემცველáƒáƒ‘რ+ +[user] +repositories = რეპáƒáƒ–იტáƒáƒ áƒ˜áƒ”ბი +followers.title.one = მáƒáƒ›áƒ§áƒáƒšáƒ˜ +followers.title.few = მáƒáƒ›áƒ§áƒáƒšáƒ”ბი +following.title.one = მიჰყვებით +following.title.few = მიჰყვებით +follow = მიყáƒáƒšáƒ +unfollow = მიყáƒáƒšáƒ˜áƒ¡ გáƒáƒ£áƒ¥áƒ›áƒ”ბრ+code = კáƒáƒ“ი +projects = პრáƒáƒ”ქტები +overview = გáƒáƒ“áƒáƒ®áƒ”დვრ+block = დáƒáƒ‘ლáƒáƒ™áƒ•რ+unblock = გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რ+user_bio = ბიáƒáƒ’რáƒáƒ¤áƒ˜áƒ + +[settings] +profile = პრáƒáƒ¤áƒ˜áƒšáƒ˜ +account = áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ +appearance = გáƒáƒ áƒ”გნáƒáƒ‘რ+password = პáƒáƒ áƒáƒšáƒ˜ +security = უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბრ+avatar = áƒáƒ•áƒáƒ¢áƒáƒ áƒ˜ +applications = áƒáƒžáƒ”ბი +orgs = áƒáƒ áƒ’áƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ”ბი +repos = რეპáƒáƒ–იტáƒáƒ áƒ˜áƒ”ბი +organization = áƒáƒ áƒ’áƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ”ბი +uid = UID +quota = კვáƒáƒ¢áƒ +website = ვებგვერდი +location = მდებáƒáƒ áƒ”áƒáƒ‘რ+pronouns = ნáƒáƒªáƒ•áƒáƒšáƒ¡áƒáƒ®áƒ”ლები +pronouns_unspecified = მითითებული áƒáƒ áƒáƒ +continue = გáƒáƒ’რძელებრ+cancel = გáƒáƒ£áƒ¥áƒ›áƒ”ბრ+language = ენრ+ui = თემრ+hints = მინიშნებები +comment_type_group_reference = მიმáƒáƒ áƒ—ვრ+comment_type_group_label = ჭდე +comment_type_group_milestone = მისáƒáƒ¦áƒ¬áƒ”ვი მიზáƒáƒœáƒ˜ +comment_type_group_assignee = მიმნიჭებელი +comment_type_group_title = სáƒáƒ—áƒáƒ£áƒ áƒ˜ +comment_type_group_branch = ბრენჩი +comment_type_group_deadline = პრáƒáƒ”ქტის ვáƒáƒ“რ+comment_type_group_dependency = დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებრ+comment_type_group_project = პრáƒáƒ”ქტი +privacy = კáƒáƒœáƒ¤áƒ˜áƒ“ენციáƒáƒšáƒáƒ‘რ+primary = ძირითáƒáƒ“ი +activated = გáƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ”ბულირ+delete_email = წáƒáƒ¨áƒšáƒ +gpg_key_verify = გáƒáƒ“áƒáƒ›áƒáƒ¬áƒ›áƒ”ბრ+gpg_token = ტáƒáƒ™áƒ”ნი +ssh_key_verify = გáƒáƒ“áƒáƒ›áƒáƒ¬áƒ›áƒ”ბრ+ssh_token = ტáƒáƒ™áƒ”ნი +subkeys = ქვეგáƒáƒ¡áƒáƒ¦áƒ”ბები +key_content = შემცველáƒáƒ‘რ+principal_content = შემცველáƒáƒ‘რ+delete_key = წáƒáƒ¨áƒšáƒ +can_read_info = წáƒáƒ™áƒ˜áƒ—ხვრ+can_write_info = ჩáƒáƒ¬áƒ”რრ+delete_token = წáƒáƒ¨áƒšáƒ +regenerate_token = რეგენერáƒáƒªáƒ˜áƒ +permission_read = წáƒáƒ™áƒ˜áƒ—ხვრ+permissions_list = წვდáƒáƒ›áƒ”ბი: +save_application = შენáƒáƒ®áƒ•რ+oauth2_application_edit = ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბრ+revoke_key = გáƒáƒ£áƒ¥áƒ›áƒ”ბრ+webauthn_nickname = მეტსáƒáƒ®áƒ”ლი +visibility.public = სáƒáƒ¯áƒáƒ áƒ +visibility.limited = შეზღუდული +visibility.private = პირáƒáƒ“ი +quota.rule.exceeded = გáƒáƒ“áƒáƒªáƒ˜áƒšáƒ”ბულირ+quota.rule.no_limit = შეუზღუდáƒáƒ•ი +quota.sizes.all = ყველრ+quota.sizes.repos.all = რეპáƒáƒ–იტáƒáƒ áƒ˜áƒ”ბი +quota.sizes.assets.all = áƒáƒ‘იექტები +quota.sizes.assets.attachments.all = მიმáƒáƒ’რებული ფáƒáƒ˜áƒšáƒ”ბი +quota.sizes.assets.artifacts = áƒáƒ áƒ¢áƒ”ფáƒáƒ¥áƒ¢áƒ”ბი +quota.sizes.assets.packages.all = პáƒáƒ™áƒ”ტები +quota.sizes.wiki = ვიკი + +[repo] +owner = მფლáƒáƒ‘ელი +template = ნიმუში +visibility = ხილვáƒáƒ“áƒáƒ‘რ+repo_desc = áƒáƒ¦áƒ¬áƒ”რრ+repo_lang = ენრ+issue_labels = ჭდეები +license = ლიცენზირ+readme = README +default_branch_label = ნáƒáƒ’ულისხმევი +mirror_prune = გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ებრ+mirror_sync = სინქრáƒáƒœáƒ˜áƒ–ებულირ+mirror_password_placeholder = (áƒáƒ  შეცვლილáƒ) +mirror_password_blank_placeholder = (დáƒáƒ§áƒ”ნებრგáƒáƒ£áƒ¥áƒ›áƒ”ბულიáƒ) +watchers = მáƒáƒ§áƒ£áƒ áƒ”ბლები +stargazers = ვáƒáƒ áƒ¡áƒ™áƒ•ლáƒáƒ•თმრიცხველები +forks = ფáƒáƒ áƒ™áƒ”ბი +stars = ვáƒáƒ áƒ¡áƒ™áƒ•ლáƒáƒ•ები +language_other = სხვრ+delete_preexisting_label = წáƒáƒ¨áƒšáƒ +desc.private = პირáƒáƒ“ი +desc.public = სáƒáƒ¯áƒáƒ áƒ +desc.template = ნიმუში +desc.internal = შიდრ+desc.archived = დáƒáƒáƒ áƒ¥áƒ˜áƒ•ებული +desc.sha256 = SHA256 +template.webhooks = ვებჰუკები +template.topics = თემები +template.avatar = áƒáƒ•áƒáƒ¢áƒáƒ áƒ˜ +need_auth = áƒáƒ•ტáƒáƒ áƒ˜áƒ–áƒáƒªáƒ˜áƒ +migrate_items_wiki = ვიკი +migrate_items_milestones = მისáƒáƒ¦áƒ¬áƒ”ვი გეგმები +migrate_items_labels = ჭდეები +migrate_items_issues = პრáƒáƒ‘ლემები +migrate_items_releases = რელიზები +watch = თვáƒáƒšáƒ§áƒ£áƒ áƒ˜áƒ¡ დევნებრ+unwatch = თვáƒáƒšáƒ§áƒ£áƒ áƒ˜áƒ¡ დევნების გáƒáƒ£áƒ¥áƒ›áƒ”ბრ+star = ვáƒáƒ áƒ¡áƒ™áƒ•ლáƒáƒ•ი +unstar = ვáƒáƒ áƒ¡áƒ™áƒ•ლáƒáƒ•ის მáƒáƒ®áƒ¡áƒœáƒ +fork = ფáƒáƒ áƒ™áƒ˜ +code = კáƒáƒ“ი +branch = ბრენჩი +tree = ხე +branches = ბრენჩები +tag = ჭდე +tags = ჭდეები +issues = პრáƒáƒ‘ლემები +project = პრáƒáƒ”ქტები +packages = პáƒáƒ™áƒ”ტები +actions = ქმედებები +release = რელიზი +releases = რელიზები +labels = ჭდეები +milestones = მისáƒáƒ¦áƒ¬áƒ”ვი გეგმები +org_labels_desc_manage = მáƒáƒ áƒ—ვრ+commits = კáƒáƒ›áƒ˜áƒ¢áƒ”ბი +commit = კáƒáƒ›áƒ˜áƒ¢áƒ˜ +file_raw = დáƒáƒ£áƒ›áƒ£áƒ¨áƒáƒ•ებელი +file_history = ისტáƒáƒ áƒ˜áƒ +file_permalink = მუდმივი ბმული +escape_control_characters = დáƒáƒ”კრáƒáƒœáƒ”ბრ+unescape_control_characters = დáƒáƒ”კრáƒáƒœáƒ”ბის მáƒáƒ®áƒ¡áƒœáƒ +vendored = გáƒáƒ áƒ”დáƒáƒœ მáƒáƒ¬áƒáƒ“ებული +generated = დáƒáƒ’ენერირებული +commit_graph.monochrome = მáƒáƒœáƒ +commit_graph.color = ფერი +blame = სáƒáƒáƒ•ტáƒáƒ áƒ უფლებები +line = ხáƒáƒ–ი +lines = ხáƒáƒ–ები +from_comment = (კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜) +editor.or = áƒáƒœ +editor.cancel_lower = გáƒáƒ£áƒ¥áƒ›áƒ”ბრ+editor.add_tmpl.filename = ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი +editor.patching = პáƒáƒ©áƒ”ბი: +editor.cancel = გáƒáƒ£áƒ¥áƒ›áƒ”ბრ+commits.commits = კáƒáƒ›áƒ˜áƒ¢áƒ”ბი +commits.author = áƒáƒ•ტáƒáƒ áƒ˜ +commits.message = შეტყáƒáƒ‘ინებრ+commits.date = თáƒáƒ áƒ˜áƒ¦áƒ˜ +commits.older = უფრრძველი +commits.newer = უფრრáƒáƒ®áƒáƒšáƒ˜ +commit.operations = áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ”ბი +commit.revert = დáƒáƒ‘რუნებრ+commit.cherry-pick = ზუსტი áƒáƒ áƒ©áƒ”ვრ+commitstatus.error = შეცდáƒáƒ›áƒ +commitstatus.failure = ჩáƒáƒ•áƒáƒ áƒ“ნრ+commitstatus.pending = რიგშირ+commitstatus.success = წáƒáƒ áƒ›áƒáƒ¢áƒ”ბრ+projects = პრáƒáƒ”ქტები +projects.description_placeholder = áƒáƒ¦áƒ¬áƒ”რრ+projects.title = სáƒáƒ—áƒáƒ£áƒ áƒ˜ +projects.type.none = áƒáƒ áƒªáƒ”რთი +projects.template.desc = ნიმუში +projects.column.edit_title = სáƒáƒ®áƒ”ლი +projects.column.new_title = სáƒáƒ®áƒ”ლი +projects.column.color = ფერი +projects.open = გáƒáƒ®áƒ¡áƒœáƒ +projects.close = დáƒáƒ®áƒ£áƒ áƒ•რ+issues.new.labels = ჭდეები +issues.new.projects = პრáƒáƒ”ქტები +issues.new.milestone = მისáƒáƒ¦áƒ¬áƒ”ვი მიზáƒáƒœáƒ˜ +issues.new.assignees = მიმნიჭებლები +issues.choose.open_external_link = გáƒáƒ®áƒ¡áƒœáƒ +issues.choose.blank = ნáƒáƒ’ულისხმევი +issues.new_label_desc_placeholder = áƒáƒ¦áƒ¬áƒ”რრ+issues.deleted_milestone = `(წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜áƒ)` +issues.deleted_project = `(წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜áƒ)` +issues.filter_label = ჭდე +issues.filter_milestone = მისáƒáƒ¦áƒ¬áƒ”ვი მიზáƒáƒœáƒ˜ +issues.filter_project = პრáƒáƒ”ქტი +issues.filter_assignee = მიმნიჭებელი +issues.filter_poster = áƒáƒ•ტáƒáƒ áƒ˜ +issues.filter_type = ტიპი +issues.filter_sort = დáƒáƒšáƒáƒ’ებრ+issues.filter_sort.relevance = შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒáƒ‘რ+issues.filter_sort.latest = უáƒáƒ®áƒšáƒ”სი +issues.filter_sort.oldest = უძველესი +issues.action_open = გáƒáƒ®áƒ¡áƒœáƒ +issues.action_close = დáƒáƒ®áƒ£áƒ áƒ•რ+issues.action_label = ჭდე +issues.action_milestone = მისáƒáƒ¦áƒ¬áƒ”ვი მიზáƒáƒœáƒ˜ +issues.action_assignee = მიმნიჭებელი +issues.action_check = ჩáƒáƒ áƒ—ვáƒ/გáƒáƒ›áƒáƒ áƒ—ვრ+issues.previous = წინრ+issues.next = შემდეგი +issues.open_title = გáƒáƒ®áƒ¡áƒœáƒ +issues.closed_title = დáƒáƒ®áƒ£áƒ áƒ£áƒšáƒ˜ +issues.all_title = ყველრ+issues.draft_title = მáƒáƒœáƒáƒ®áƒáƒ–ი +issues.context.edit = ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბრ+issues.context.delete = წáƒáƒ¨áƒšáƒ +issues.reopen_issue = თáƒáƒ•იდáƒáƒœ გáƒáƒ®áƒ¡áƒœáƒ +issues.create_comment = კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜ +issues.author = áƒáƒ•ტáƒáƒ áƒ˜ +issues.role.owner = მფლáƒáƒ‘ელი +issues.role.member = წევრი +issues.role.collaborator = თáƒáƒœáƒáƒ›áƒáƒœáƒáƒ¬áƒ˜áƒšáƒ” +issues.role.contributor = მáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ” +issues.edit = ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბრ+issues.cancel = გáƒáƒ£áƒ¥áƒ›áƒ”ბრ+issues.save = შენáƒáƒ®áƒ•რ+issues.label_title = სáƒáƒ®áƒ”ლი +issues.label_description = áƒáƒ¦áƒ¬áƒ”რრ+issues.label_color = ფერი +issues.label_exclusive = ექსკლუზიური +issues.label_edit = ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბრ+issues.label_delete = წáƒáƒ¨áƒšáƒ +issues.label.filter_sort.alphabetically = áƒáƒœáƒ‘áƒáƒœáƒ˜áƒ¡ მიხედვით +issues.subscribe = გáƒáƒ›áƒáƒ¬áƒ”რრ+issues.unsubscribe = გáƒáƒ›áƒáƒ¬áƒ”რის გáƒáƒ£áƒ¥áƒ›áƒ”ბრ+issues.lock_confirm = ჩáƒáƒ™áƒ”ტვრ+issues.unlock_confirm = ჩáƒáƒ™áƒ”ტვის გáƒáƒ£áƒ¥áƒ›áƒ”ბრ+issues.delete = წáƒáƒ¨áƒšáƒ +issues.cancel_tracking = მáƒáƒªáƒ˜áƒšáƒ”ბრ+issues.add_time_cancel = გáƒáƒ£áƒ¥áƒ›áƒ”ბრ+issues.add_time_hours = სáƒáƒáƒ—ი +issues.add_time_minutes = წუთი +issues.force_push_compare = შედáƒáƒ áƒ”ბრ+issues.due_date_form = წწწწ-თთ-დდ +issues.due_date_form_edit = ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბრ+issues.due_date_form_remove = წáƒáƒ¨áƒšáƒ +issues.due_date_overdue = გáƒáƒ“áƒáƒªáƒ˜áƒšáƒ”ბული +issues.dependency.title = დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებები +issues.dependency.cancel = გáƒáƒ£áƒ¥áƒ›áƒ”ბრ+issues.dependency.remove = წáƒáƒ¨áƒšáƒ +issues.dependency.blocks_short = ბლáƒáƒ™áƒ”ბი +issues.review.dismissed_label = მáƒáƒªáƒ˜áƒšáƒ”ბულირ+issues.review.pending = რიგშირ+issues.review.reviewers = გáƒáƒ“áƒáƒ›áƒ®áƒ”დáƒáƒ•ები +issues.review.outdated = ვáƒáƒ“áƒáƒ’áƒáƒ“áƒáƒªáƒ˜áƒšáƒ”ბული +issues.reference_issue.body = სხეული +issues.content_history.deleted = წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜áƒ +issues.content_history.edited = ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბულირ+issues.content_history.created = შეიქმნრ+issues.content_history.options = მáƒáƒ áƒ’ებრ+compare.compare_base = ბáƒáƒ–რ+compare.compare_head = შედáƒáƒ áƒ”ბრ+pulls.has_viewed_file = ნáƒáƒœáƒáƒ®áƒ˜áƒ +pulls.tab_conversation = სáƒáƒ£áƒ‘áƒáƒ áƒ˜ +pulls.tab_commits = კáƒáƒ›áƒ˜áƒ¢áƒ”ბი +pulls.merged = შერწყმულირ+pulls.status_checks_requested = áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელირ+pulls.status_checks_details = დეტáƒáƒšáƒ”ბი +pulls.cmd_instruction_checkout_title = გáƒáƒ›áƒáƒ—ხáƒáƒ•რ+pulls.cmd_instruction_merge_title = შერწყმრ+pulls.made_using_agit = AGit +pulls.editable = ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბáƒáƒ“ი +pull.deleted_branch = (წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜áƒ):%s +milestones.open = გáƒáƒ®áƒ¡áƒœáƒ +milestones.close = დáƒáƒ®áƒ£áƒ áƒ•რ+milestones.title = სáƒáƒ—áƒáƒ£áƒ áƒ˜ +milestones.desc = áƒáƒ¦áƒ¬áƒ”რრ+milestones.clear = გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ებრ+milestones.cancel = გáƒáƒ£áƒ¥áƒ›áƒ”ბრ+milestones.filter_sort.name = სáƒáƒ®áƒ”ლი +wiki = ვიკი +wiki.page = გვერდი +wiki.new_page = გვერდი +wiki.cancel = გáƒáƒ£áƒ¥áƒ›áƒ”ბრ+wiki.edit_page_button = ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბრ+wiki.pages = გვერდები +activity = áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘რ+activity.navbar.pulse = უáƒáƒ®áƒšáƒ”სი áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘ები +activity.navbar.contributors = მáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ები +activity.period.filter_label = პერიáƒáƒ“ი: +activity.overview = გáƒáƒ“áƒáƒ®áƒ”დვრ+activity.merged_prs_label = შერწყმულირ+activity.opened_prs_label = შეთáƒáƒ•áƒáƒ–ებულირ+activity.closed_issue_label = დáƒáƒ®áƒ£áƒ áƒ£áƒšáƒ˜áƒ +activity.new_issue_label = ღიáƒáƒ +activity.unresolved_conv_label = გáƒáƒ®áƒ¡áƒœáƒ +activity.published_release_label = რელიზი +activity.published_prerelease_label = პრე-რელიზი +activity.published_tag_label = ჭდე +activity.git_stats_and_deletions = დრ+contributors.contribution_type.commits = კáƒáƒ›áƒ˜áƒ¢áƒ”ბი +contributors.contribution_type.additions = დáƒáƒ›áƒáƒ¢áƒ”ბები +contributors.contribution_type.deletions = წáƒáƒ¨áƒšáƒ”ბი +settings = მáƒáƒ áƒ’ებრ+settings.options = რეპáƒáƒ–იტáƒáƒ áƒ˜áƒ +settings.collaboration = თáƒáƒœáƒáƒ›áƒáƒœáƒáƒ¬áƒ˜áƒšáƒ”ები +settings.collaboration.admin = áƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ˜ +settings.collaboration.write = ჩáƒáƒ¬áƒ”რრ+settings.collaboration.read = წáƒáƒ™áƒ˜áƒ—ხვრ+settings.collaboration.owner = მფლáƒáƒ‘ელი +settings.collaboration.undefined = áƒáƒ¦áƒ£áƒ¬áƒ”რელი +settings.hooks = ვებჰუკები +settings.mirror_settings.direction = მიმáƒáƒ áƒ—ულებრ+settings.mirror_settings.direction.pull = მიღებრ+settings.mirror_settings.direction.push = გáƒáƒ’ზáƒáƒ•ნრ+settings.mirror_settings.push_mirror.none_ssh = áƒáƒ áƒªáƒ”რთი +settings.units.units = ერთეულები +settings.units.overview = გáƒáƒ“áƒáƒ®áƒ”დვრ+settings.site = ვებგვერდი +settings.tracker_issue_style.numeric = რიცხვითი +settings.tracker_issue_style.alphanumeric = áƒáƒšáƒ¤áƒáƒ áƒ˜áƒªáƒ®áƒ•ითი +settings.admin_indexer_unindexed = áƒáƒ áƒáƒ“áƒáƒ˜áƒœáƒ“ექსებული +settings.trust_model.collaborator = თáƒáƒœáƒáƒ›áƒáƒœáƒáƒ¬áƒ˜áƒšáƒ” +settings.trust_model.committer = გáƒáƒ“áƒáƒ›áƒªáƒ”მი +settings.trust_model.collaboratorcommitter = თáƒáƒœáƒáƒ›áƒáƒœáƒáƒ¬áƒ˜áƒšáƒ”+გáƒáƒ“áƒáƒ›áƒªáƒ”მი +settings.delete_collaborator = წáƒáƒ¨áƒšáƒ +settings.teams = გუნდები +settings.webhook.request = მáƒáƒ—ხáƒáƒ•ნრ+settings.webhook.response = გáƒáƒ›áƒáƒ®áƒ›áƒáƒ£áƒ áƒ”ბრ+settings.webhook.headers = თáƒáƒ•სáƒáƒ áƒ—ები +settings.webhook.payload = შემცველáƒáƒ‘რ+settings.webhook.body = სხეული +settings.secret = სáƒáƒ˜áƒ“უმლრ+settings.slack_username = მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი +settings.slack_color = ფერი +settings.discord_username = მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი +settings.event_create = შექმნრ+settings.event_delete = წáƒáƒ¨áƒšáƒ +settings.event_fork = ფáƒáƒ áƒ™áƒ˜ +settings.event_wiki = ვიკი +settings.event_release = რელიზი +settings.event_push = გáƒáƒ’ზáƒáƒ•ნრ+settings.event_repository = რეპáƒáƒ–იტáƒáƒ áƒ˜áƒ +settings.event_issues = ცვლილებრ+settings.event_issue_assign = მინიჭებრ+settings.event_issue_label = ჭდეები +settings.event_issue_milestone = მისáƒáƒ¦áƒ¬áƒ”ვი გეგმები +settings.event_issue_comment = კáƒáƒ›áƒ”ნტáƒáƒ áƒ”ბი +settings.event_pull_request = ცვლილებრ+settings.event_pull_request_assign = მინიჭებრ+settings.event_pull_request_label = ჭდეები +settings.event_pull_request_milestone = მისáƒáƒ¦áƒ¬áƒ”ვი გეგმები +settings.event_pull_request_comment = კáƒáƒ›áƒ”ნტáƒáƒ áƒ”ბი +settings.event_pull_request_review = გáƒáƒ“áƒáƒ®áƒ”დვები +settings.event_pull_request_sync = სინქრáƒáƒœáƒ˜áƒ–ებულირ+settings.event_pull_request_enforcement = ფáƒáƒ áƒ¡áƒ˜áƒ áƒ”ბრ+settings.event_package = პáƒáƒ™áƒ”ტი +settings.active = áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜áƒ +settings.slack_token = ტáƒáƒ™áƒ”ნი +settings.slack_domain = დáƒáƒ›áƒ”ნი +settings.slack_channel = áƒáƒ áƒ®áƒ˜ +settings.web_hook_name_gitea = Gitea +settings.web_hook_name_forgejo = Forgejo +settings.web_hook_name_gogs = Gogs +settings.web_hook_name_slack = Slack +settings.web_hook_name_discord = Discord +settings.web_hook_name_dingtalk = DingTalk +settings.web_hook_name_telegram = Telegram +settings.web_hook_name_matrix = Matrix +settings.web_hook_name_feishu_only = Feishu +settings.web_hook_name_packagist = Packagist +settings.sourcehut_builds.secrets = სáƒáƒ˜áƒ“უმლáƒáƒ”ბი +settings.title = სáƒáƒ—áƒáƒ£áƒ áƒ˜ +settings.deploy_key_content = შემცველáƒáƒ‘რ+settings.branches = ბრენჩები +settings.protect_status_check_matched = დáƒáƒ›áƒ—ხვეული +settings.protect_patterns = ნიმუშები +settings.edit_protected_branch = ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბრ+settings.tags = ჭდეები +settings.tags.protection.allowed = დáƒáƒ¨áƒ•ებულირ+settings.lfs = LFS +settings.lfs_locks = დáƒáƒ‘ლáƒáƒ™áƒ•რ+settings.lfs_lock = ჩáƒáƒ™áƒ”ტვრ+settings.lfs_pointers.oid = OID +diff.parent = მშáƒáƒ‘ელი +diff.commit = კáƒáƒ›áƒ˜áƒ¢áƒ˜ +diff.git-notes = შენიშვნები +diff.whitespace_button = ჰáƒáƒ áƒ” +diff.bin = BIN +diff.file_before = მáƒáƒœáƒáƒ›áƒ“ე +diff.file_after = შემდეგ +diff.file_image_width = სიგáƒáƒœáƒ” +diff.file_image_height = სიმáƒáƒ¦áƒšáƒ” +diff.file_byte_size = ზáƒáƒ›áƒ +diff.generated = გენერირებულირ+diff.vendored = გáƒáƒ áƒ”დáƒáƒœ შემáƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜áƒ +diff.comment.reply = პáƒáƒ¡áƒ£áƒ®áƒ˜ +diff.review.comment = კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜ +diff.review.approve = დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბრ+diff.protected = დáƒáƒªáƒ£áƒšáƒ˜áƒ +diff.image.swipe = გáƒáƒ£áƒ¡áƒ•ით +diff.image.overlay = ზემáƒáƒ“áƒáƒœ დáƒáƒ“ებრ+release.releases = რელიზები +release.tags = ჭდეები +release.draft = მáƒáƒœáƒáƒ®áƒáƒ–ი +release.prerelease = პრე-რელიზი +release.stable = სტáƒáƒ‘ილური +release.compare = შედáƒáƒ áƒ”ბრ+release.edit = ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბრ+release.target = სáƒáƒ›áƒ˜áƒ–ნე +release.cancel = გáƒáƒ£áƒ¥áƒ›áƒ”ბრ+release.downloads = გáƒáƒ“მáƒáƒ¬áƒ”რები +release.type_attachment = მიმáƒáƒ’რებული ფáƒáƒ˜áƒšáƒ˜ +branch.delete_head = წáƒáƒ¨áƒšáƒ +branch.included = ჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜áƒ +topic.done = დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბრ+ +[graphs] +contributors.what = მáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ები + +[org] +members = წევრები +teams = გუნდები +code = კáƒáƒ“ი +lower_members = წევრები +lower_repositories = რეპáƒáƒ–იტáƒáƒ áƒ˜áƒ”ბი +org_desc = áƒáƒ¦áƒ¬áƒ”რრ+team_desc = áƒáƒ¦áƒ¬áƒ”რრ+team_permission_desc = წვდáƒáƒ›áƒ +team_unit_disabled = (გáƒáƒ—იშულიáƒ) +settings = მáƒáƒ áƒ’ებრ+settings.options = áƒáƒ áƒ’áƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ +settings.website = ვებგვერდი +settings.location = მდებáƒáƒ áƒ”áƒáƒ‘რ+settings.permission = წვდáƒáƒ›áƒ”ბი +settings.visibility = ხილვáƒáƒ“áƒáƒ‘რ+settings.visibility.public = სáƒáƒ¯áƒáƒ áƒ +settings.visibility.limited_shortname = შეზღუდული +settings.visibility.private_shortname = პირáƒáƒ“ი +members.public = ხილული +members.private = დáƒáƒ›áƒáƒšáƒ£áƒšáƒ˜ +members.owner = მფლáƒáƒ‘ელი +members.member = წევრი +members.remove = წáƒáƒ¨áƒšáƒ +members.leave = გáƒáƒ¡áƒ•ლრ+teams.join = შეერთებრ+teams.leave = გáƒáƒ¡áƒ•ლრ+teams.read_access = წáƒáƒ™áƒ˜áƒ—ხვრ+teams.write_access = ჩáƒáƒ¬áƒ”რრ+teams.settings = მáƒáƒ áƒ’ებრ+ +[admin] +dashboard = სáƒáƒ›áƒ£áƒ¨áƒáƒ მáƒáƒ’იდრ+organizations = áƒáƒ áƒ’áƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ”ბი +repositories = რეპáƒáƒ–იტáƒáƒ áƒ˜áƒ”ბი +hooks = ვებჰუკები +integrations = ინტეგრáƒáƒªáƒ˜áƒ”ბი +config = მáƒáƒ áƒ’ებრ+config_summary = შეჯáƒáƒ›áƒ”ბრ+config_settings = მáƒáƒ áƒ’ებრ+monitor = მáƒáƒœáƒ˜áƒ¢áƒáƒ áƒ˜áƒœáƒ’ი +first_page = პირველი +last_page = ბáƒáƒšáƒ +dashboard.statistic = შეჯáƒáƒ›áƒ”ბრ+dashboard.operation_switch = გáƒáƒ“áƒáƒ áƒ—ვრ+dashboard.operation_run = გáƒáƒ¨áƒ•ებრ+users.name = მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი +users.activated = გáƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ”ბულირ+users.admin = áƒáƒ“მინი +users.restricted = შეზღუდული +users.reserved = დáƒáƒªáƒ£áƒšáƒ˜ +users.bot = ბáƒáƒ¢áƒ˜ +users.remote = დáƒáƒ¨áƒáƒ áƒ”ბული +users.2fa = 2FA +users.repos = რეპáƒáƒ”ბი +users.created = შეიქმნრ+users.edit = ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბრ+users.local = ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ +users.list_status_filter.menu_text = ფილტრი +users.list_status_filter.reset = ჩáƒáƒ›áƒáƒ§áƒ áƒ +users.list_status_filter.is_active = áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜áƒ +users.list_status_filter.not_active = áƒáƒ áƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜áƒ +users.list_status_filter.is_admin = áƒáƒ“მინი +users.list_status_filter.is_restricted = შეზღუდული +emails.primary = ძირითáƒáƒ“ი +emails.activated = გáƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ”ბულირ+emails.filter_sort.email = ელფáƒáƒ¡áƒ¢áƒ +emails.filter_sort.name = მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი +orgs.name = სáƒáƒ®áƒ”ლი +orgs.teams = გუნდები +orgs.members = წევრები +repos.owner = მფლáƒáƒ‘ელი +repos.name = სáƒáƒ®áƒ”ლი +repos.private = პირáƒáƒ“ი +repos.issues = პრáƒáƒ‘ლემები +repos.size = ზáƒáƒ›áƒ +packages.owner = მფლáƒáƒ‘ელი +packages.creator = შემქმნელი +packages.name = სáƒáƒ®áƒ”ლი +packages.version = ვერსირ+packages.type = ტიპი +packages.repository = რეპáƒáƒ–იტáƒáƒ áƒ˜áƒ +packages.size = ზáƒáƒ›áƒ +packages.published = გáƒáƒ›áƒáƒ¥áƒ•ეყნებულირ+auths.name = სáƒáƒ®áƒ”ლი +auths.type = ტიპი +auths.enabled = ჩáƒáƒ áƒ—ულირ+auths.updated = გáƒáƒœáƒáƒ®áƒšáƒ”ბულირ+auths.domain = დáƒáƒ›áƒ”ნი +auths.host = ჰáƒáƒ¡áƒ¢áƒ˜ +auths.port = პáƒáƒ áƒ¢áƒ˜ +auths.oauth2_tenant = ტენáƒáƒœáƒ¢áƒ˜ +auths.tips = რჩევები +config.ssh_enabled = ჩáƒáƒ áƒ—ულირ+config.ssh_port = პáƒáƒ áƒ¢áƒ˜ +config.lfs_enabled = ჩáƒáƒ áƒ—ულირ+config.db_type = ტიპი +config.db_host = ჰáƒáƒ¡áƒ¢áƒ˜ +config.db_name = სáƒáƒ®áƒ”ლი +config.db_user = მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი +config.db_schema = სქემრ+config.db_ssl_mode = SSL +config.db_path = ბილიკი +config.mailer_enabled = ჩáƒáƒ áƒ—ულირ+config.mailer_name = სáƒáƒ®áƒ”ლი +config.mailer_protocol = პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜ +config.mailer_user = მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი +config.mailer_use_dummy = სულელი +config.send_test_mail_submit = გáƒáƒ’ზáƒáƒ•ნრ+config.oauth_enabled = ჩáƒáƒ áƒ—ულირ+config.disabled_logger = გáƒáƒ›áƒáƒ áƒ—ულირ+monitor.stats = სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ +monitor.name = სáƒáƒ®áƒ”ლი +monitor.schedule = გეგმრ+monitor.execute_times = შესრულებები +monitor.stacktrace = სტეკის დáƒáƒ¢áƒ áƒ”ისებრ+monitor.desc = áƒáƒ¦áƒ¬áƒ”რრ+monitor.last_execution_result = შედეგი +monitor.process.children = შვილები +monitor.queues = რიგები +monitor.queue.name = სáƒáƒ®áƒ”ლი +monitor.queue.type = ტიპი +notices.operations = áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ”ბი +notices.type = ტიპი +notices.type_1 = რეპáƒáƒ–იტáƒáƒ áƒ˜áƒ +notices.type_2 = áƒáƒ›áƒáƒªáƒáƒœáƒ +notices.desc = áƒáƒ¦áƒ¬áƒ”რრ+notices.op = áƒáƒž. + +[action] +compare_branch = შედáƒáƒ áƒ”ბრ+review_dismissed_reason = მიზეზი: + +[tool] +now = áƒáƒ®áƒšáƒ +future = მáƒáƒ›áƒáƒ•áƒáƒšáƒ¨áƒ˜ +raw_seconds = წáƒáƒ›áƒ˜ +raw_minutes = წუთი + +[munits.data] +b = ბ +kib = კიბ +mib = მიბ +gib = გიბ +tib = ტიბ +pib = პიბ +eib = ეიბ + +[notification] +notifications = გáƒáƒ¤áƒ áƒ—ხილებები +unread = წáƒáƒ™áƒ˜áƒ—ხულáƒáƒ‘ის გáƒáƒ£áƒ¥áƒ›áƒ”ბრ+read = წáƒáƒ™áƒ˜áƒ—ხვრ+subscriptions = გáƒáƒ›áƒáƒ¬áƒ”რები +watching = უყურებთ + +[units] +unit = ერთეული + +[packages] +title = პáƒáƒ™áƒ”ტები +filter.type = ტიპი +filter.type.all = ყველრ+filter.container.tagged = ჭდით +filter.container.untagged = ჭდემáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜ +installation = დáƒáƒ§áƒ”ნებრ+requirements = მáƒáƒ—ხáƒáƒ•ნები +dependencies = დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებები +keywords = სáƒáƒ™áƒ•áƒáƒœáƒ«áƒ სიტყვები +details = დეტáƒáƒšáƒ”ბი +details.author = áƒáƒ•ტáƒáƒ áƒ˜ +details.license = ლიცენზირ+assets = áƒáƒ‘იექტები +versions = ვერსიები +dependency.id = ID +dependency.version = ვერსირ+alpine.repository.branches = ბრენჩები +alpine.repository.repositories = რეპáƒáƒ–იტáƒáƒ áƒ˜áƒ”ბი +alpine.repository.architectures = áƒáƒ áƒ¥áƒ˜áƒ¢áƒ”ქტურები +arch.version.description = áƒáƒ¦áƒ¬áƒ”რრ+arch.version.provides = მáƒáƒ’áƒáƒ¬áƒ•დით +arch.version.groups = ჯგუფი +arch.version.depends = დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულირ+arch.version.conflicts = კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ¨áƒ˜áƒ +arch.version.replaces = áƒáƒœáƒáƒªáƒ•ლებს +arch.version.backup = მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ +composer.dependencies = დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებები +conan.details.repository = რეპáƒáƒ–იტáƒáƒ áƒ˜áƒ +container.images.title = áƒáƒ¡áƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბი +container.details.platform = პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒ +container.digest = დáƒáƒ˜áƒ¯áƒ”სტი +container.labels = ჭდეები +container.labels.key = გáƒáƒ¡áƒáƒ¦áƒ”ბი +container.labels.value = მნიშვნელáƒáƒ‘რ+debian.repository.distributions = დისტრიბუტივები +debian.repository.components = კáƒáƒ›áƒžáƒáƒœáƒ”ნტები +debian.repository.architectures = áƒáƒ áƒ¥áƒ˜áƒ¢áƒ”ქტურები +npm.dependencies = დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებები +npm.details.tag = ჭდე +rpm.repository.architectures = áƒáƒ áƒ¥áƒ˜áƒ¢áƒ”ქტურები +alt.repository.architectures = áƒáƒ áƒ¥áƒ˜áƒ¢áƒ”ქტურები +owner.settings.cleanuprules.enabled = ჩáƒáƒ áƒ—ულირ+ +[secrets] +secrets = სáƒáƒ˜áƒ“უმლáƒáƒ”ბი + +[actions] +actions = ქმედებები +status.unknown = უცნáƒáƒ‘ი +status.waiting = ველáƒáƒ“ები +status.running = მიმდინáƒáƒ áƒ”áƒáƒ‘ს შესრულებრ+status.success = წáƒáƒ áƒ›áƒáƒ¢áƒ”ბრ+status.failure = ჩáƒáƒ•áƒáƒ áƒ“ნრ+status.cancelled = გáƒáƒ£áƒ¥áƒ›áƒ”ბულირ+status.skipped = გáƒáƒ›áƒáƒ¢áƒáƒ•ებულირ+status.blocked = დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ +runners = გáƒáƒ›áƒ¡áƒ•ებები +runners.status = სტáƒáƒ¢áƒ£áƒ¡áƒ˜ +runners.id = ID +runners.name = სáƒáƒ®áƒ”ლი +runners.owner_type = ტიპი +runners.description = áƒáƒ¦áƒ¬áƒ”რრ+runners.labels = ჭდეები +runners.runner_title = გáƒáƒ›áƒ¨áƒ•ები +runners.task_list.run = გáƒáƒ¨áƒ•ებრ+runners.task_list.status = სტáƒáƒ¢áƒ£áƒ¡áƒ˜ +runners.task_list.repository = რეპáƒáƒ–იტáƒáƒ áƒ˜áƒ +runners.task_list.commit = კáƒáƒ›áƒ˜áƒ¢áƒ˜ +runners.status.unspecified = უცნáƒáƒ‘ი +runners.status.idle = უქმე +runners.status.active = áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜áƒ +runners.status.offline = ქსელგáƒáƒ áƒ”შე +runners.version = ვერსირ+runs.commit = კáƒáƒ›áƒ˜áƒ¢áƒ˜ +runs.scheduled = დáƒáƒ’ეგმილირ+runs.workflow = შრáƒáƒ›áƒ˜áƒ¡ პრáƒáƒªáƒ”სი +runs.actor = áƒáƒ•ტáƒáƒ áƒ˜ +runs.status = სტáƒáƒ¢áƒ£áƒ¡áƒ˜ +variables = ცვლáƒáƒ“ები + +[git.filemode] +directory = სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე +submodule = ქვემáƒáƒ“ული diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index 9c5b6ca3c1..6329dc9fe6 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -128,7 +128,7 @@ copy_success = 복사ë˜ì—ˆìŠµë‹ˆë‹¤! copy_error = 복사 실패 copy_type_unsupported = ì´ íŒŒì¼ í˜•ì‹ì€ 복사할 수 없습니다 error = 오류 -error404 = ë„달하려는 페ì´ì§€ê°€ 존재하지 않거나 ë³¼ 수 있ë„ë¡ ì¸ì¦ë˜ì§€ 않았습니다. +error404 = ë„달하려는 페ì´ì§€ê°€ 존재하지 않거나 , 제거 ë˜ì—ˆê±°ë‚˜ ë˜ëŠ” ë³¼ ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤. go_back = ëŒì•„가기 invalid_data = 유효하지 않는 ë°ì´í„°: %v unknown = 알 수 ì—†ìŒ @@ -159,6 +159,14 @@ filter.not_template = í…œí”Œë¦¿ì´ ì•„ë‹˜ view = 보기 never = 안함 test = 테스트 +copy_path = 경로 복사 +new_repo.link = 새 저장소 +new_org.link = 새 ì¡°ì§ +new_repo.title = 새 저장소 +new_org.title = 새 ì¡°ì§ +error413 = 사용 가능한 í• ë‹¹ëŸ‰ì„ ëª¨ë‘ ì†Œì§„í•˜ì˜€ìŠµë‹ˆë‹¤. +new_migrate.title = 마ì´ê·¸ë ˆì´ì…˜ +new_migrate.link = 새 마ì´ê·¸ë ˆì´ì…˜ [aria] navbar = 내비게ì´ì…˜ ë°” @@ -168,10 +176,10 @@ footer.software = ì´ ì†Œí”„íŠ¸ì›¨ì–´ì— ëŒ€í•˜ì—¬ [heatmap] number_of_contributions_in_the_last_12_months = 지난 12달간 %s ëª…ì˜ ê¸°ì—¬ìž -contributions_zero = 기여 ì—†ìŒ -contributions_format = {year}ë…„ {month} {day}ì¼ì— {contributions} -contributions_one = 기여 -contributions_few = 기여 +contributions_zero = ê¸°ì—¬ìž ì—†ìŒ +contributions_format = {year}ë…„ {month}ì›” {day}ì¼ì˜ ê¸°ì—¬ìž {contributions} +contributions_one = ê¸°ì—¬ìž +contributions_few = ê¸°ì—¬ìž less = ì ì€ more = ë§Žì€ @@ -182,6 +190,20 @@ buttons.bold.tooltip = ë‘꺼운 í…스트 추가 buttons.code.tooltip = 코드 추가 buttons.link.tooltip = ë§í¬ 추가 buttons.quote.tooltip = ì¸ìš©êµ¬ 추가 +buttons.list.unordered.tooltip = 불릿 리스트 추가 +buttons.ref.tooltip = ì´ìŠˆ ë˜ëŠ” í’€ 리퀘스트 참조 +buttons.list.ordered.tooltip = 번호로 ëœ ë¦¬ìŠ¤íŠ¸ 추가 +buttons.mention.tooltip = ì‚¬ìš©ìž ë˜ëŠ” íŒ€ì„ ì–¸ê¸‰ +buttons.switch_to_legacy.tooltip = ëŒ€ì‹ ì— êµ¬í˜• 편집기 사용 +buttons.enable_monospace_font = ê³ ì • í­ ê¸€ê¼´ 활성화 +buttons.disable_monospace_font = ê³ ì • í­ ê¸€ê¼´ 비활성화 +buttons.list.task.tooltip = 작업 ëª©ë¡ ì¶”ê°€ +buttons.new_table.tooltip = í…Œì´ë¸” 추가 +table_modal.header = í…Œì´ë¸” 추가 +table_modal.placeholder.header = í—¤ë” +table_modal.placeholder.content = ë‚´ìš© +table_modal.label.rows = í–‰ +table_modal.label.columns = ì—´ [filter] string.desc = 하 - ê°€ @@ -190,6 +212,9 @@ string.asc = ê°€ - 하 [error] network_error = ë„¤íŠ¸ì›Œí¬ ì˜¤ë¥˜ server_internal = ë‚´ë¶€ 서버 오류 +not_found = íƒ€ê²Ÿì„ ì°¾ì„ ìˆ˜ 없습니다. +occurred = ì—러가 ë°œìƒí•¨ +report_message = ì´ê²ƒì´ Forgejoì˜ ë²„ê·¸ë¼ê³  ìƒê°í•œë‹¤ë©´, Codeberg ì—서 ì´ìŠˆë¥¼ 검색하거나 필요하다면 새 ì´ìŠˆë¥¼ 만들어주세요. [startpage] app_desc=편리한 설치형 Git 서비스 @@ -197,6 +222,10 @@ install=쉬운 설치 platform=í¬ë¡œìФ í”Œëž«í¼ lightweight=가벼움 license=오픈 소스 +platform_desc = Forgejo는 Linux와 FreeBSDë“±ì˜ ìžìœ  오픈소스 ìš´ì˜ ì²´ì œë¥¼ í¬í•¨í•œ 다양한 CPU 아키í…처ì—서 실행ë©ë‹ˆë‹¤. ë§ˆìŒ ê°€ëŠ”ëŒ€ë¡œ 고르세요! +lightweight_desc = Forgejoì˜ ë‚®ì€ ì „ë ¥ ì†Œëª¨ëŸ‰ì€ ê°’ì‹¼ Raspberry Pi마저 구ë™í•  수 있게 합니다. ê¸°ê¸°ì˜ ì—너지를 절약하세요! +license_desc = Forgejo를 설치해보세요! Forgejo를 개선하기 위해 기여할 수 있습니다. 기여ìžê°€ ë˜ê¸°ë¥¼ ë§ì„¤ì´ì§€ 마세요! +install_desc = 간단히 ë‹¹ì‹ ì˜ ê¸°ê¸°ì—서바ì´ë„ˆë¦¬ë¥¼ 실행하거나, Docker를 사용하거나, 패키지 저장소ì—서 설치할 수 있습니다. [install] install=설치 @@ -205,7 +234,7 @@ docker_helper=Forgejo를 Dockerì—서 실행하려면 설정 ì „ì— ì´ í˜•ì‹ìœ¼ë¡œ 입력하세요. -mailer_user=SMTP 사용ìžì´ë¦„ +mailer_user=SMTP 사용ìžëª… mailer_password=SMTP 비밀번호 register_confirm=가입시 ì´ë©”ì¼ í™•ì¸ í•„ìˆ˜ mail_notify=ì´ë©”ì¼ ì•Œë¦¼ 켜기 @@ -250,9 +279,9 @@ server_service_title=서버 ë° ê¸°íƒ€ 서비스 설정 offline_mode=로컬 모드 켜기 offline_mode.description=타사 콘í…츠 전송 네트워í¬ë¥¼ 사용하지 않ë„ë¡ ì„¤ì •í•˜ê³  모든 리소스를 로컬ì—서 제공합니다. disable_gravatar=Gravatar 사용안함 -disable_gravatar.description=Gravatar ë° íƒ€ì‚¬ 아바타 소스를 사용하지 않ë„ë¡ ì„¤ì •í•©ë‹ˆë‹¤. 사용ìžê°€ 로컬로 아바타를 업로드하지 않는 한 기본 아바타가 사용ë©ë‹ˆë‹¤. +disable_gravatar.description=Gravatar를 비롯한 타사 아바타 출처를 사용하지 않ë„ë¡ ì„¤ì •í•©ë‹ˆë‹¤. 사용ìžê°€ ì§ì ‘ 아바타를 업로드하지 않는 한 기본 아바타를 사용합니다. federated_avatar_lookup=탈중앙화 아바타 사용 -federated_avatar_lookup.description=libravatar 기반 오픈소스 ì—°í•© 아바타 조회를 허용합니다. +federated_avatar_lookup.description=Libravatar 아바타를 조회합니다. disable_registration=ì‚¬ìš©ìž ë“±ë¡ ë¹„í™œì„±í™” disable_registration.description=ì¸ìŠ¤í„´ìŠ¤ 관리ìžë§Œì´ 새 ì‚¬ìš©ìž ê³„ì •ì„ ì¶”ê°€í•  수 있게 ë©ë‹ˆë‹¤. 공개 ì¸ìŠ¤í„´ìŠ¤ë¥¼ 제공할 예정ì´ê³  ë§Žì€ ì–‘ì˜ ìŠ¤íŒ¸ ê³„ì •ì„ ê°ë‹¹í•  준비가 ë˜ì–´ 있지 않다면 ì‚¬ìš©ìž ë“±ë¡ì„ 비활성화 í•  ê²ƒì„ ê°•ë ¥ížˆ 권고합니다. allow_only_external_registration.description=새 ê³„ì •ì„ ë“±ë¡í•˜ë ¤ëŠ” 사용ìžëŠ” ì„¤ì •ëœ ì™¸ë¶€ 서비스를 ì´ìš©í•´ì•¼ë§Œ 새 ê³„ì •ì„ ë“±ë¡í•  수 있습니다. @@ -264,7 +293,7 @@ enable_captcha.description=ì‚¬ìš©ìž ë“±ë¡ì‹œ 캡차를 요구합니다. require_sign_in_view=ì¸ìŠ¤í„´ìŠ¤ì˜ ì½˜í…츠를 볼때 ë¡œê·¸ì¸ ìš”êµ¬ admin_setting.description=ê´€ë¦¬ìž ê³„ì •ì„ ë§Œë“œëŠ” ê²ƒì€ ì„ íƒì‚¬í•­ìž…니다. 첫번째로 등ë¡ëœ 사용ìžëŠ” ìžë™ì ìœ¼ë¡œ 관리ìžë¡œ 지정ë©ë‹ˆë‹¤. admin_title=ê´€ë¦¬ìž ê³„ì • 설정 -admin_name=ê´€ë¦¬ìž ì´ë¦„ +admin_name=관리ìžì˜ 사용ìžëª… admin_password=비밀번호 confirm_password=비밀번호 í™•ì¸ admin_email=ì´ë©”ì¼ ì£¼ì†Œ @@ -273,27 +302,37 @@ test_git_failed='git' 명령 테스트 실패: %v sqlite3_not_available=해당 버전ì—서는 SQLite3를 ì§€ì›í•˜ì§€ 않습니다. %sì—서 ê³µì‹ ë²„ì „ì„ ë‹¤ìš´ë¡œë“œí•´ì£¼ì„¸ìš”. ('gobuild' ë²„ì „ì´ ì•„ë‹™ë‹ˆë‹¤). invalid_db_setting=ë°ì´í„°ë² ì´ìФ ì„¤ì •ì´ ì˜¬ë°”ë¥´ì§€ 않습니다: %v invalid_repo_path=저장소(레파지토리) ì˜ ê²½ë¡œê°€ 올바르지 않습니다: %v -run_user_not_match=실행 사용ìžëª…ì´ í˜„ìž¬ 사용ìžëª…ê³¼ 다릅니다: %s -> %s +run_user_not_match="실행 사용ìžëª…"ì´ í˜„ìž¬ 사용ìžëª…ê³¼ 다릅니다: %s -> %s save_config_failed=ì„¤ì •ì„ ì €ìž¥í•  수 없습니다: %v invalid_admin_setting=ê´€ë¦¬ìž ê³„ì • ì„¤ì •ì´ ì˜¬ë°”ë¥´ì§€ 않습니다: %v invalid_log_root_path=로그(Log) ì˜ ê²½ë¡œê°€ 올바르지 않습니다: %v default_keep_email_private=ì´ë©”ì¼ ì£¼ì†Œ 숨김처리를 기본값으로 설정 -default_keep_email_private.description=새 사용ìžì— 대한 ì´ë©”ì¼ ì£¼ì†Œ 숨김처리를 기본값으로 설정합니다. +default_keep_email_private.description=새 사용ìžì— 대한 ì´ë©”ì¼ ì£¼ì†Œ 숨김처리를 기본값으로 설정해 가입 ì§í›„ ì •ë³´ê°€ 유출ë˜ëŠ”ê²ƒì„ ë°©ì§€í•©ë‹ˆë‹¤. default_allow_create_organization=ì¡°ì§ ìƒì„± í—ˆìš©ì„ ê¸°ë³¸ê°’ìœ¼ë¡œ 설정 -default_allow_create_organization.description=ì‹ ê·œ ì‚¬ìš©ìž ìƒì„±ì‹œ ì¡°ì§ ìƒì„±ì„ 기본값으로 설정합니다. -default_enable_timetracking=시간 ì¶”ì  ì‚¬ìš©ì„ ê¸°ë³¸ê°’ìœ¼ë¡œ 설정 -default_enable_timetracking.description=ì‹ ê·œ ë ˆí¬ì§€í† ë¦¬ì— 대한 시간 ì¶”ì  ì‚¬ìš©ì„ ê¸°ë³¸ê°’ìœ¼ë¡œ 설정합니다. +default_allow_create_organization.description=ì‹ ê·œ 사용ìžì—게 기본ì ìœ¼ë¡œ ì¡°ì§ ìƒì„± ê¶Œí•œì„ ë¶€ì—¬í•©ë‹ˆë‹¤. ì´ ì˜µì…˜ì´ êº¼ì ¸ìžˆë‹¤ë©´, 관리ìžê°€ ì‹ ê·œ 사용ìžì—게 ì¡°ì§ ìƒì„± ê¶Œí•œì„ ë¶€ì—¬í•´ì•¼í•©ë‹ˆë‹¤. +default_enable_timetracking=시간 ê¸°ë¡ ê¸°ëŠ¥ì„ ê¸°ë³¸ì ìœ¼ë¡œ 사용 +default_enable_timetracking.description=ì‹ ê·œ 저장소가 ì‹œê°„ê¸°ë¡ ê¸°ëŠ¥ì„ ê¸°ë³¸ì ìœ¼ë¡œ 사용할 수 있습니다. no_reply_address=가려진 ì´ë©”ì¼ ë„ë©”ì¸ -no_reply_address_helper=가려진 ì´ë©”ì¼ì„ 가진 사용ìžì—게 ì ìš©ë  ì´ë©”ì¼ ë„ë©”ì¸ìž…니다. 예를 들어, ì‚¬ìš©ìž 'joe'ì˜ ê°€ë ¤ìž” ì´ë©”ì¼ ë„ë©”ì¸ì´ 'noreply.example.org'로 설정ë˜ì–´ 있으면 'joe@noreply.example.org'로 처리 ë©ë‹ˆë‹¤. +no_reply_address_helper=ì´ë©”ì¼ì„ 가린 사용ìžì—게 ì ìš©ë  ì´ë©”ì¼ ë„ë©”ì¸ìž…니다. 예를 들어, 사용ìžëª… 'joe'ê°€ ë„ë©”ì¸'noreply.example.org'로 ì´ë©”ì¼ì„ 가리면 Gitì— 'joe@noreply.example.org'로 ë¡œê·¸ì¸ í•˜ê²Œ ë©ë‹ˆë‹¤. db_schema_helper = ë°ì´í„°ë² ì´ìФ 기본값 ("공개")를 사용하려면 빈 칸으로 ë‘세요. require_db_desc = Forgejo를 사용하려면 MySQL, PostgreSQL, SQLite3 ë˜ëŠ” TiDB (MySQL 프로토콜) ì´ ì„¤ì¹˜ë˜ì–´ 있어야 합니다. domain = 서버 ë„ë©”ì¸ smtp_from_invalid = "ì´ë©”ì¼ ë°œì‹ ì¸" 주소가 유효하지 않습니다 enable_captcha = ë“±ë¡ ì‹œ CAPTCHA 활성화 allow_only_external_registration = 외부 서비스를 통한 등ë¡ë§Œ 허용 +reinstall_confirm_check_3 = Forgejoê°€ 올바른 app.ini 위치로 실행중ì´ë©° ê·¸ê²ƒì´ ë‹¤ì‹œ 설치할 대ìƒì´ ë§žë‹¤ëŠ”ê²ƒì„ ì „ì ìœ¼ë¡œ 확신합니다. ìœ„ì˜ ìœ„í—˜ì„±ë“¤ì„ ì¸ì§€í•˜ê³  있ìŒì— ë™ì˜í•©ë‹ˆë‹¤. +reinstall_error = ì´ë¯¸ 존재하는 Forgejo ë°ì´í„°ë² ì´ìŠ¤ì— ì„¤ì¹˜ë¥¼ 시ë„중임 +reinstall_confirm_message = ì´ë¯¸ 존재하는 Forgejo ë°ì´í„°ë² ì´ìŠ¤ì— ìž¬ì„¤ì¹˜ë¥¼ í•˜ëŠ”ê²ƒì€ ë‹¤ìˆ˜ì˜ ë¬¸ì œì˜ ì›ì¸ì´ ë  ìˆ˜ 있습니다. ëŒ€ë¶€ë¶„ì˜ ê²½ìš° ì´ë¯¸ 존재하는 "app.ini" 를 사용해 Forgejo를 구ë™í•´ì•¼í•©ë‹ˆë‹¤. ë‹¹ì‹ ì´ ë¬´ì—‡ì„ í•˜ê³ ìžˆëŠ”ì§€ 명확히 알고있다면 ë‹¤ìŒ ì‚¬í•­ë“¤ì„ í™•ì¸í•˜ì„¸ìš”: +err_admin_name_pattern_not_allowed = 관리ìžì˜ 사용ìžëª…ì´ ì˜¬ë°”ë¥´ì§€ 않ìŒ, 사용ìžëª…ì´ ì˜ˆì•½ëœ íŒ¨í„´ê³¼ ì¼ì¹˜í•¨ +allow_dots_in_usernames = 사용ìžë“¤ì´ 마침표를 사용ìžëª…ì— ì‚¬ìš©í•  수 있ë„ë¡ í—ˆê°€í•©ë‹ˆë‹¤. ì´ë¯¸ 존재하는 계정ì—는 ì˜í–¥ì„ 주지 않습니다. +app_slogan = ì¸ìŠ¤í„´ìŠ¤ 슬로건 +app_slogan_helper = ì¸ìŠ¤í„´ìŠ¤ì˜ ìŠ¬ë¡œê±´ì„ ìž…ë ¥í•˜ì„¸ìš”. 비워ë‘ë©´ 비활성화ë©ë‹ˆë‹¤. +reinstall_confirm_check_1 = app.iniì˜ SECRET_KEY로 암호화 ë˜ì–´ìžˆëŠ” ë°ì´í„°ë¥¼ ìžƒì„ ìˆ˜ 있습니다: 2FA/OTP를 통해 ë¡œê·¸ì¸ í•  수 없으며 & 미러가 제대로 ìž‘ë™í•˜ì§€ 않게ë©ë‹ˆë‹¤. app.ini 파ì¼ì— 정확한 SECRET_KEYê°€ ìžˆëŠ”ê²ƒì´ í™•ì‹¤í•˜ë‹¤ë©´ ì²´í¬í•˜ì„¸ìš”. +run_user_helper = Forgejo를 구ë™í•˜ëŠ” ìš´ì˜ì²´ì œì˜ 사용ìžëª…입니다. ì´ ì‚¬ìš©ìžëŠ” 저장소 루트 ê²½ë¡œì— ì ‘ê·¼ê¶Œí•œì´ ìžˆì–´ì•¼ 합니다. +reinstall_confirm_check_2 = 저장소와 ì„¤ì •ì— ìž¬ë™ê¸°í™”ê°€ ìš”êµ¬ë  ìˆ˜ 있습니다. ì´ ë°•ìŠ¤ì— ì²´í¬í•˜ë©´ ì €ìž¥ì†Œì˜ í›…ê³¼ authorized_key ë“¤ì„ ìˆ˜ë™ìœ¼ë¡œ 재ë™ê¸°í™”해야 한다는 ê²ƒì„ ì¸ì§€í•œë‹¤ëŠ” ê²ƒì„ ì˜ë¯¸í•©ë‹ˆë‹¤. 저장소와 ë¯¸ëŸ¬ì˜ ì„¤ì •ì´ ì˜¬ë°”ë¥¸ì§€ 확ì¸í•˜ì„¸ìš”. [home] -uname_holder=ì‚¬ìš©ìž ì´ë¦„ ë˜ëŠ” ì´ë©”ì¼ ì£¼ì†Œ +uname_holder=사용ìžëª… ë˜ëŠ” ì´ë©”ì¼ ì£¼ì†Œ password_holder=비밀번호 switch_dashboard_context=대시보드 컨í…스트 바꾸기 my_repos=저장소 @@ -337,7 +376,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=여기를 눌러 í™•ì¸ ë©”ì¼ ìž¬ì „ì†¡ @@ -374,7 +413,6 @@ authorization_failed=ì¸ì¦ 실패 sspi_auth_failed=SSPI ì¸ì¦ 실패 [mail] - activate_account=ê³„ì •ì„ í™œì„±í™”í•˜ì„¸ìš” activate_email=ì´ë©”ì¼ ì£¼ì†Œ í™•ì¸ @@ -396,6 +434,7 @@ issue.action.merge = @%[1]së‹˜ì´ #%[2]d를 %[3]sì— ë³‘í•©í–ˆìŠµë‹ˆë‹¤. issue.action.review_dismissed = @%[1]së‹˜ì´ ì´ í’€ ë¦¬í€˜ìŠ¤íŠ¸ì— ëŒ€í•œ %[2]sì˜ ë§ˆì§€ë§‰ 검토를 거부했습니다. issue.action.reject = @%[1]së‹˜ì´ ì´ í’€ ë¦¬í€˜ìŠ¤íŠ¸ì— ìˆ˜ì •ì„ ìš”ì²­í–ˆìŠµë‹ˆë‹¤. issue.action.new = @%[1]së‹˜ì´ #%[2]d를 만들었습니다. +register_notify.text_2 = ë‹¹ì‹ ì˜ ê³„ì •ì— ì‚¬ìš©ìžëª…으로 ë¡œê·¸ì¸ í•  수 있습니다: %s @@ -410,8 +449,8 @@ cancel=취소 modify=변경하기 [form] -UserName=ì‚¬ìš©ìž ì´ë¦„ -RepoName=저장소 ì´ë¦„ +UserName=사용ìžëª… +RepoName=저장소명 Email=ì´ë©”ì¼ ì£¼ì†Œ Password=비밀번호 Retype=비밀번호 í™•ì¸ @@ -445,14 +484,14 @@ captcha_incorrect=CAPTCHA 코드가 올바르지 않습니다. password_not_match=비밀번호가 ì¼ì¹˜í•˜ì§€ 않습니다. lang_select_error=목ë¡ì—서 언어를 ì„ íƒí•´ì£¼ì„¸ìš”. -username_been_taken=ì´ë¯¸ 사용하고 있는 ì•„ì´ë””입니다. -repo_name_been_taken=ì´ë¯¸ 사용하고 있는 저장소 ì´ë¦„입니다. +username_been_taken=ì´ë¯¸ 사용ë˜ëŠ” 사용ìžëª…입니다. +repo_name_been_taken=ì´ë¯¸ ì‚¬ìš©ì¤‘ì¸ ì €ìž¥ì†Œëª… 입니다. org_name_been_taken=ì´ë¯¸ ì‚¬ìš©ì¤‘ì¸ ì¡°ì§ ì´ë¦„입니다. team_name_been_taken=ì´ë¯¸ ì‚¬ìš©ì¤‘ì¸ íŒ€ ì´ë¦„입니다. team_no_units_error=최소 하나 ì´ìƒì˜ ë ˆí¬ì§€í† ë¦¬ ì„¹ì…˜ì— ëŒ€í•œ ì ‘ê·¼ì„ í—ˆìš©í•˜ì‹­ì‹œì˜¤. email_been_used=ì´ë¯¸ 사용 ì¤‘ì¸ ì´ë©”ì¼ ì£¼ì†Œìž…ë‹ˆë‹¤. -username_password_incorrect=ì‚¬ìš©ìž ì´ë¦„ ë˜ëŠ” 암호가 올바르지 않습니다. -enterred_invalid_repo_name=입력한 ì €ìž¥ì†Œì˜ ì´ë¦„ì´ ì˜¬ë°”ë¥´ì§€ 않습니다. +username_password_incorrect=사용ìžëª… ë˜ëŠ” 암호가 올바르지 않습니다. +enterred_invalid_repo_name=입력한 ì €ìž¥ì†Œëª…ì´ ì˜¬ë°”ë¥´ì§€ 않습니다. enterred_invalid_owner_name=새로운 ì†Œìœ ìž ì´ë¦„ì´ ì˜¬ë°”ë¥´ì§€ 않습니다. enterred_invalid_password=입력한 비밀번호는 올바르지 않습니다. user_not_exist=존재하지 않는 사용ìžìž…니다. @@ -468,8 +507,10 @@ target_branch_not_exist=ëŒ€ìƒ ë¸Œëžœì¹˜ê°€ 존재하지 않습니다. url_error = `"%s"는 유효한 URLì´ ì•„ë‹™ë‹ˆë‹¤.` include_error = `"%s"ì„/를 í¬í•¨í•´ì•¼ 합니다.` regex_pattern_error = `regex íŒ¨í„´ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤: %s` -username_error = `ì˜ë¬¸("a-z", "A-Z"), 숫ìž("0-9"), 대시("-"), 밑줄("_"), ì (".")ë§Œ í¬í•¨í•  수 있습니다. ì˜ë¬¸ í˜¹ì€ ìˆ«ìžê°€ 아닌 문ìžë¡œ 시작하거나 ëë‚  수 없으며 ì—°ì†ëœ ì˜ë¬¸ í˜¹ì€ ìˆ«ìžê°€ 아닌 문ìžë„ 금지ë©ë‹ˆë‹¤.` +username_error = `ì˜ë¬¸("a-z", "A-Z"), 숫ìž("0-9"), 대시("-"), 밑줄("_"), 마침표(".")ë§Œ í¬í•¨í•  수 있습니다. ì˜ë¬¸ í˜¹ì€ ìˆ«ìžê°€ 아닌 문ìžë¡œ 시작하거나 ëë‚  수 없으며 ì—°ì†ëœ ì˜ë¬¸ í˜¹ì€ ìˆ«ìžê°€ 아닌 문ìžë„ 금지ë©ë‹ˆë‹¤.` glob_pattern_error = `glob íŒ¨í„´ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤: %s` +username_error_no_dots = `ì˜ë¬¸("a-z", "A-Z"), 숫ìž("0-9"), 대시("-"), 밑줄("_")ë§Œ í¬í•¨í•  수 있습니다. ì˜ë¬¸ í˜¹ì€ ìˆ«ìžê°€ 아닌 문ìžë¡œ 시작하거나 ëë‚  수 없으며 ì—°ì†ëœ ì˜ë¬¸ í˜¹ì€ ìˆ«ìžê°€ 아닌 문ìžë„ 금지ë©ë‹ˆë‹¤.` +username_change_not_local_user = 외부 사용ìžë“¤ì€ 사용ìžëª…ì„ ë³€ê²½í•  수 없습니다. [user] @@ -485,6 +526,9 @@ unfollow=ì¶”ì í•´ì œ user_bio=소개 projects = 프로ì íЏ watched = ì£¼ì‹œì¤‘ì¸ ì €ìž¥ì†Œ +form.name_reserved = "%s" 사용ìžëª…ì´ ì˜ˆì•½(reserved)ë˜ì—ˆìŠµë‹ˆë‹¤. +form.name_pattern_not_allowed = "%s" íŒ¨í„´ì´ ì‚¬ìš©ìžëª…으로 사용할 수 없습니다. +form.name_chars_not_allowed = "%s" 사용ìžëª…ì´ ìœ íš¨í•˜ì§€ ì•Šì€ ë¬¸ìžë¥¼ í¬í•¨í•©ë‹ˆë‹¤. [settings] @@ -504,14 +548,14 @@ account_link=ì—°ê²°ëœ ê³„ì • organization=ì¡°ì§ public_profile=공개 프로필 -password_username_disabled=로컬 사용ìžê°€ 아닌 경우 ì‚¬ìš©ìž ì´ë¦„ ë³€ê²½ì„ í•  수 없습니다. ìžì„¸í•œ ë‚´ìš©ì€ ê´€ë¦¬ìžì—게 문ì˜í•´ì£¼ì„¸ìš”. +password_username_disabled=로컬 사용ìžê°€ 아닌 경우 사용ìžëª…ì„ ë³€ê²½ í•  수 없습니다. ìžì„¸í•œ ë‚´ìš©ì€ ê´€ë¦¬ìžì—게 문ì˜í•´ì£¼ì„¸ìš”. full_name=성명 website=웹 사ì´íЏ location=위치 update_theme=테마 변경 update_profile=프로필 ì—…ë°ì´íЏ update_profile_success=í”„ë¡œí•„ì´ ì—…ë°ì´íЏ ë˜ì—ˆìŠµë‹ˆë‹¤. -change_username=ì‚¬ìš©ìž ì´ë¦„ 변경 ë˜ì—ˆìŠµë‹ˆë‹¤. +change_username=사용ìžëª…ì´ ë³€ê²½ ë˜ì—ˆìŠµë‹ˆë‹¤. continue=계ì†í•˜ê¸° cancel=취소 language=언어 @@ -662,11 +706,14 @@ visibility.private=비공개 change_password = 비밀번호 변경 email_desc = ë‹¹ì‹ ì˜ ëŒ€í‘œ ì´ë©”ì¼ ì£¼ì†ŒëŠ” 알림, 비밀번호 재설정과 웹ì—ì„œì˜ Git ìž‘ë™ì— 사용ë˜ë©° 가려지지 않습니다. comment_type_group_dependency = 전제조건 +change_username_prompt = 참고: 사용ìžëª…ì˜ ë³€ê²½ì€ ê³„ì •ì˜ URLì„ ë³€ê²½ì‹œí‚µë‹ˆë‹¤. +change_username_redirect_prompt = 과거 사용ìžëª…ì€ ëˆ„êµ°ê°€ 사용하기 전까지 리디렉트ë©ë‹ˆë‹¤. +comment_type_group_time_tracking = 시간 ê¸°ë¡ [repo] owner=ì†Œìœ ìž -repo_name=저장소 ì´ë¦„ -repo_name_helper=ì¢‹ì€ ì €ìž¥ì†Œ ì´ë¦„ì€ ë³´í†µ ì§§ê³  기억하기 ì¢‹ì€ íŠ¹ë³„í•œ 키워드로 ì´ë£¨ì–´ 집니다. +repo_name=저장소명 +repo_name_helper=ì¢‹ì€ ì €ìž¥ì†Œëª…ì€ ë³´í†µ ì§§ê³  기억하기 ì¢‹ì€ íŠ¹ë³„í•œ 키워드로 ì´ë£¨ì–´ 집니다. repo_size=저장소 용량 template=템플릿 template_select=í…œí”Œë¦¿ì„ ì„ íƒí•©ë‹ˆë‹¤. @@ -764,6 +811,7 @@ file_too_large=보여주기ì—는 파ì¼ì´ 너무 í½ë‹ˆë‹¤. video_not_supported_in_browser=ë‹¹ì‹ ì˜ ë¸Œë¼ìš°ì €ê°€ HTML5ì˜ "video" 태그를 ì§€ì›í•˜ì§€ 않습니다. audio_not_supported_in_browser=ë‹¹ì‹ ì˜ ë¸Œë¼ìš°ì €ê°€ HTML5ì˜ "audio" 태그를 ì§€ì›í•˜ì§€ 않습니다. stored_lfs=Git LFSì— ì €ìž¥ë˜ì–´ 있습니다 +stored_annex=Git Annexì— ì €ìž¥ë˜ì–´ 있습니다 commit_graph=커밋 그래프 editor.new_file=새 íŒŒì¼ @@ -778,7 +826,7 @@ editor.or=í˜¹ì€ editor.cancel_lower=취소 editor.commit_changes=변경 ë‚´ìš©ì„ ì»¤ë°‹ editor.commit_message_desc=ì„ íƒì  확장 설명 추가… -editor.commit_directly_to_this_branch=%s 브랜치ì—서 ì§ì ‘ 커밋해주세요. +editor.commit_directly_to_this_branch=%[1]s 브랜치ì—서 ì§ì ‘ 커밋해주세요. editor.create_new_branch=ì´ ì»¤ë°‹ì— ëŒ€í•œ 새로운 브랜치를 만들고 ëŒì–´ì˜¤ê¸° ìš”ì²­ì„ ì‹œìž‘í•©ë‹ˆë‹¤. editor.new_branch_name_desc=새로운 브랜치 ì´ë¦„… editor.cancel=취소 @@ -915,7 +963,7 @@ issues.subscribe=구ë…하기 issues.unsubscribe=êµ¬ë… ì·¨ì†Œ issues.delete=ì‚­ì œ issues.tracker=타임 트래커 -issues.start_tracking=타임 트래킹 시작 +issues.start_tracking=시간 ê¸°ë¡ ì‹œìž‘ issues.start_tracking_history=`ë‹˜ì´ %s 작업 시작` issues.stop_tracking_history=`ë‹˜ì´ %s 작업 중단` issues.add_time=수ë™ìœ¼ë¡œ 시간 ìž…ë ¥ @@ -973,7 +1021,7 @@ pulls.compare_compare=다ìŒìœ¼ë¡œë¶€í„° í’€ pulls.filter_branch=Filter Branch pulls.no_results=결과를 ì°¾ì„ ìˆ˜ 없습니다. pulls.create=í’€ 리퀘스트 ìƒì„± -pulls.title_desc_few=%[2]s ì—서 %[3]s 로 %[1]dê°œì˜ ì»¤ë°‹ë“¤ì„ ë³‘í•©í•˜ë ¤í•¨ +pulls.title_desc_few=%[2]s ì—서 %[3]s 로 %[1]dê°œì˜ ì»¤ë°‹ë“¤ì„ ë³‘í•©í•˜ë ¤í•¨ pulls.merged_title_desc_few=ë‹˜ì´ %[2]s ì—서 %[3]s 로 %[1]d ì»¤ë°‹ì„ %[4]s 병합함 pulls.tab_conversation=대화 pulls.tab_commits=커밋 @@ -1081,7 +1129,6 @@ contributors.contribution_type.commits=커밋 search=검색 search.search_repo=저장소 검색 -search.results="%s ì—서 \"%s\" ì— ëŒ€í•œ 검색 ê²°ê³¼" search.code_no_results=검색어와 ì¼ì¹˜í•˜ëŠ” 소스코드가 없습니다. settings=설정 @@ -1116,7 +1163,7 @@ settings.tracker_url_format=외부 ì´ìŠˆ 트래커 URL í˜•ì‹ settings.tracker_issue_style=외부 ì´ìŠˆ 트래커 ìˆ«ìž í¬ë§· settings.tracker_issue_style.numeric=ìˆ«ìž settings.tracker_issue_style.alphanumeric=ë¬¸ìž ìˆ«ìž -settings.enable_timetracker=시간 ì¶”ì  í™œì„±í™” +settings.enable_timetracker=시간 ê¸°ë¡ í™œì„±í™” settings.allow_only_contributors_to_track_time=ê¸°ì—¬ìž íŠ¸ëž™ 타임만 settings.pulls_desc=저장소 í’€ 리퀘스트 활성화 settings.pulls.ignore_whitespace=ê³µë°±ì€ ì¶©ëŒì—서 무시하기 @@ -1162,7 +1209,7 @@ settings.update_githook=Hook 갱신 settings.payload_url=ëŒ€ìƒ URL settings.content_type=POST Content Type settings.secret=비밀 -settings.slack_username=ì‚¬ìš©ìž ì´ë¦„ +settings.slack_username=사용ìžëª… settings.slack_icon_url=ì•„ì´ì½˜ URL settings.discord_username=사용ìžëª… settings.discord_icon_url=ì•„ì´ì½˜ URL @@ -1303,7 +1350,7 @@ settings.trust_model.committer.desc = 유효한 ì„œëª…ì´ ì»¤ë¯¸í„°ì™€ ì¼ì¹˜í•  visibility_helper = 저장소 비공개로 만들기 projects.description = 설명 (ì„ íƒ) settings.external_tracker_url_desc = 방문ìžë“¤ì´ ì´ìŠˆ íƒ­ì„ í´ë¦­í•˜ë©´ 외부 ì´ìŠˆ 트레커 URL로 ì—°ê²°ë©ë‹ˆë‹¤. -settings.tracker_url_format_desc = {user}, {repo} and {index}를 ì‚¬ìš©ìž ì´ë¦„, 저장소 ì´ë¦„, ì´ìŠˆ 번호로 사용할 수 있습니다. +settings.tracker_url_format_desc = {user}를 사용ìžëª…, {repo}를 저장소명, {index}를 ì´ìŠˆ 번호로 사용할 수 있습니다. projects = 프로ì íЏ projects.desc = ì´ìŠˆì™€ í’€ 리퀘스트를 프로ì íЏì—서 관리합니다. projects.create = 프로ì íЏ 만들기 @@ -1365,14 +1412,27 @@ issues.blocked_by_user = ë‹¹ì‹ ì€ ì´ ì €ìž¥ì†Œì˜ ì†Œìœ ìžì—게 차단당했 issues.comment.blocked_by_user = ë‹¹ì‹ ì€ ì´ ì €ìž¥ì†Œì˜ ì†Œìœ ìž í˜¹ì€ ì´ ì´ìŠˆì˜ ìž‘ì„±ìž ì—게 차단당했기 ë–„ë¬¸ì— ì´ìŠˆì— ëŒ“ê¸€ì„ ë‹¬ 수 없습니다. author_search_tooltip = 최대 30ëª…ì˜ ì‚¬ìš©ìžë¥¼ 표시함 pulls.merged_title_desc_one = ë‹˜ì´ %[2]s ì—서 %[3]s 로 %[1]d ì»¤ë°‹ì„ %[4]s 병합함 +issues.stop_tracking = 타ì´ë¨¸ ì •ì§€ +issues.start_tracking_short = 타ì´ë¨¸ 시작 +mirror_password_help = 사용ìžëª…ì„ ë³€ê²½í•´ ì €ìž¥ëœ ë¹„ë°€ë²ˆí˜¸ë¥¼ 지우세요. +issues.cancel_tracking_history = `ì·¨ì†Œëœ ì‹œê°„ ê¸°ë¡ %s` +settings.enter_repo_name = í‘œì‹œëœ ì†Œìœ ìžì™€ ì €ìž¥ì†Œëª…ì„ ì •í™•í•˜ê²Œ 입력하세요: +settings.packagist_username = Packagist 사용ìžëª… +issues.tracking_already_started = `ë‹¹ì‹ ì€ ì´ë¯¸ 다른 ì´ìŠˆì—서 ì‹œê°„ì„ ê¸°ë¡ì¤‘입니다!` +adopt_search = 사용ìžëª…ì„ ìž…ë ¥í•´ 소유ìžê°€ 누ë½ëœ 저장소를 검색... (ëª¨ë‘ ì°¾ìœ¼ë ¤ë©´ 비워ë‘기) +form.name_reserved = "%s" ì €ìž¥ì†Œëª…ì´ ì˜ˆì•½ë˜ì–´ 있습니다. +form.name_pattern_not_allowed = "%s" íŒ¨í„´ì´ ì €ìž¥ì†Œëª…ìœ¼ë¡œ 사용할 수 없습니다. +archive.title_date = ì´ ì €ìž¥ì†ŒëŠ” %sì— ë³´ê´€ì²˜ë¦¬ë˜ì—ˆìŠµë‹ˆë‹¤. 파ì¼ì„ ë³¼ 수 있고 복제할 ìˆ˜ë„ ìžˆì§€ë§Œ, 푸시하거나 ì´ìŠˆë¥¼ 열거나 í’€ 리퀘스트를 만들 수 없습니다. +milestones.filter_sort.name = ì´ë¦„ + [graphs] [org] org_name_holder=ì¡°ì§ ì´ë¦„ -org_full_name_holder=ì¡°ì§ ì „ì²´ ì´ë¦„ +org_full_name_holder=ì¡°ì§ ë³„ëª… create_org=새로운 ì¡°ì§ repo_updated=ì—…ë°ì´íŠ¸ë¨ %s members=멤버 @@ -1409,7 +1469,7 @@ members.public=ë³´ìž„ members.public_helper=숨기기 members.private=숨김 members.private_helper=ë³´ì´ê¸° -members.member_role=íšŒì› ì—­í• : +members.member_role=멤버 ì—­í• : members.owner=ì†Œìœ ìž members.member=멤버 members.remove=제거 @@ -1433,6 +1493,7 @@ teams.repositories=팀 저장소 teams.search_repo_placeholder=저장소 찾기... teams.add_duplicate_users=사용ìžê°€ ì´ë¯¸ 팀 멤버입니다. teams.members.none=ì´ íŒ€ì— ë©¤ë²„ê°€ 없습니다. +form.name_pattern_not_allowed = "%s" íŒ¨í„´ì´ ì¡°ì§ëª…으로 사용할 수 없습니다. [admin] dashboard=대시보드 @@ -1633,9 +1694,9 @@ config.db_path=경로 config.service_config=서비스 설정 config.register_email_confirm=가입시 ì´ë©”ì¼ í™•ì¸ í•„ìˆ˜ -config.disable_register=ìžì²´ë“±ë¡ 사용안함 +config.disable_register=ì‚¬ìš©ìž ë“±ë¡ ê±°ë¶€ config.allow_only_external_registration=외부 서비스를 통해서만 ë“±ë¡ í—ˆìš© -config.enable_openid_signup=OpenID ìžì²´ë“±ë¡ 활성화 +config.enable_openid_signup=OpenID ë“±ë¡ í™œì„±í™” config.enable_openid_signin=OpenID ë¡œê·¸ì¸ í™œì„±í™” config.show_registration_button=ë“±ë¡ ë²„íŠ¼ì„ í‘œì‹œ config.require_sign_in_view=페ì´ì§€ë¥¼ 보려면 ë¡œê·¸ì¸ í•„ìˆ˜ @@ -1644,8 +1705,8 @@ config.enable_captcha=CAPTCHA 활성화 config.active_code_lives=코드 만료 기한 config.default_keep_email_private=기본ì ìœ¼ë¡œ ì´ë©”ì¼ ì£¼ì†Œë¥¼ 숨김 config.default_allow_create_organization=기본ì ìœ¼ë¡œ ì¡°ì§ ìƒì„±ì„ 허용 -config.enable_timetracking=타임 트래킹 활성화 -config.default_enable_timetracking=기본 타임 트래킹 활성화 +config.enable_timetracking=시간 ê¸°ë¡ í™œì„±í™” +config.default_enable_timetracking=기본으로 시간 기ë¡ì„ 활성화 config.default_allow_only_contributors_to_track_time=ê¸°ì—¬ìž íŠ¸ëž™ 타임만 config.no_reply_address=가려진 ì´ë©”ì¼ ë„ë©”ì¸ config.default_enable_dependencies=기본ì ìœ¼ë¡œ ì´ìŠˆ 종ì†ì„±ì„ 활성화 @@ -1731,8 +1792,17 @@ notices.op=ì¼. notices.delete_success=시스템 ì•Œë¦¼ì´ ì‚­ì œë˜ì—ˆìŠµë‹ˆë‹¤. users.allow_git_hook_tooltip = Git í›…ì€ Forgejoê°€ ì‹¤í–‰ì¤‘ì¸ OS 유저로 실행ë˜ë©° ê°™ì€ ìˆ˜ì¤€ì˜ ê¶Œí•œì„ ê°–ìŠµë‹ˆë‹¤. ê²°ê³¼ì ìœ¼ë¡œ, Git í›… ì‚¬ìš©ê¶Œí•œì´ ìžˆëŠ” 사용ìžëŠ” Forgejoì—서 사용하는 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ í¬í•¨í•œ 모든 ì €ìž¥ì†Œì— ì ‘ê·¼í•˜ê±°ë‚˜ 수정할 수 있습니다. ê¶ê·¹ì ìœ¼ë¡œ ì´ëŸ¬í•œ 사용ìžë“¤ì€ Forgejoì˜ ê´€ë¦¬ìž ê¶Œí•œì„ íšë“í•  수 있습니다. emails.primary = 대표 +auths.sspi_strip_domain_names = 사용ìžëª…들ì—서 ë„ë©”ì¸ëª…ì„ ì œê±°í•¨ +auths.tip.yandex = %sì— ìƒˆ 애플리케ì´ì…˜ì„ 만듭니다. "Yandex.Passport API"ë¶€ë¶„ì˜ "Access to email address", "Access to user avatar", "Access to username, first name and surname, gender" ê¶Œí•œì„ í™œì„±í™” 하세요. +emails.filter_sort.name = 사용ìžëª… +auths.attribute_username_placeholder = 비워ë‘ë©´ Forgejoì— ìž…ë ¥ëœ ì‚¬ìš©ìžëª…ì„ ì‚¬ìš©í•©ë‹ˆë‹¤. +emails.filter_sort.name_reverse = 사용ìžëª… (예약ë¨) +config.allow_dots_in_usernames = 사용ìžë“¤ì´ 마침표를 사용ìžëª…ì— ì‚¬ìš©í•  수 있ë„ë¡ í—ˆê°€í•©ë‹ˆë‹¤. ì´ë¯¸ 존재하는 계정ì—는 ì˜í–¥ì„ 주지 않습니다. +config_summary = 요약 +config_settings = 설정 + [action] create_repo=저장소를 만들었습니다. %s rename_repo=저장소 ì´ë¦„ì„ %[1]sì—서ì—서 %[3]s으로 변경함 @@ -1804,9 +1874,6 @@ details.author = ìž‘ì„±ìž [secrets] [actions] - - - runners.name=ì´ë¦„ runners.owner_type=유형 runners.description=설명 @@ -1823,9 +1890,6 @@ runs.commit=커밋 [projects] [git.filemode] -; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … - - [search] code_search_by_git_grep = 현재 코드 검색 결과는 "git grep"ì— ì˜í•´ 제공ë©ë‹ˆë‹¤.관리ìžê°€ 코드 ì¸ë±ì„œë¥¼ 활성화하면 ë” ë‚˜ì€ ê²°ê³¼ê°€ ì œê³µë  ìˆ˜ 있습니다. @@ -1833,17 +1897,24 @@ branch_kind = 브랜치 검색... keyword_search_unavailable = ì§€ê¸ˆì€ í‚¤ì›Œë“œë¡œ ê²€ìƒ‰ì´ ì§€ì›ë˜ì§€ 않습니다. 사ì´íЏ 관리ìžì—게 문ì˜í•˜ì‹­ì‹œì˜¤. commit_kind = 커밋 검색... no_results = ì¼ì¹˜í•˜ëŠ” 결과를 ì°¾ì„ ìˆ˜ 없습니다. -search = 검색... +search = 검색… type_tooltip = 검색 타입 fuzzy_tooltip = 검색어와 밀접하게 ì¼ì¹˜í•˜ëŠ” ê²°ê³¼ë„ í¬í•¨ -repo_kind = 저장소 검색... -user_kind = ì‚¬ìš©ìž ê²€ìƒ‰... -org_kind = ì¡°ì§ ê²€ìƒ‰... +repo_kind = 저장소 검색… +user_kind = ì‚¬ìš©ìž ê²€ìƒ‰â€¦ +org_kind = ì¡°ì§ ê²€ìƒ‰â€¦ team_kind = 팀 검색... code_kind = 코드 검색... code_search_unavailable = 코드 ê²€ìƒ‰ì€ í˜„ìž¬ 허용ë˜ì§€ 않았습니다. 사ì´íЏ 관리ìžì™€ ì—°ë½í•˜ì„¸ìš”. package_kind = 패키지 검색... project_kind = 프로ì íЏ 검색... exact_tooltip = 검색어와 정확하게 ì¼ì¹˜í•˜ëŠ” 결과만 í¬í•¨ -issue_kind = ì´ìŠˆ 검색... -pull_kind = í’€ 검색... \ No newline at end of file +issue_kind = ì´ìŠˆ 검색… +pull_kind = í’€ 검색… +milestone_kind = 마ì¼ìŠ¤í†¤ 검색... +fuzzy = 모호함 +union = 통합 검색 +union_tooltip = 공백으로 êµ¬ë¶„ëœ í‚¤ì›Œë“œ 중 하나ë¼ë„ ì¼ì¹˜í•˜ëŠ” 결과를 í¬í•¨í•˜ì„¸ìš” +exact = 정확한 +regexp = ì •ê·œ í‘œí˜„ì‹ +regexp_tooltip = 검색어를 ì •ê·œ 표현ì‹ìœ¼ë¡œ í•´ì„합니다 \ No newline at end of file diff --git a/options/locale/locale_lt.ini b/options/locale/locale_lt.ini index 35f56fa4fd..868e5bff6e 100644 --- a/options/locale/locale_lt.ini +++ b/options/locale/locale_lt.ini @@ -1,6 +1,3 @@ - - - [common] dashboard = SÄ…vadas explore = NarÅ¡yti @@ -159,6 +156,20 @@ fuzzy_tooltip = Ä®traukti rezultatus, kurie taip pat labai atitinka paieÅ¡kos te repo_kind = IeÅ¡koti saugyklų... code_search_unavailable = Kodų paieÅ¡ka Å¡iuo metu nepasiekiama. Kreipkis į svetainÄ—s administratorių. org_kind = IeÅ¡koti organizacijų... +union = Bendrinis +code_search_by_git_grep = Dabartiniai kodo paieÅ¡kos rezultatai pateikiami atliekant „git grep“. Rezultatai gali bÅ«ti geresni, jei svetainÄ—s administratorius įjungs kodo indeksuotojÄ…. +package_kind = IeÅ¡koti paketų... +project_kind = IeÅ¡koti projektų... +commit_kind = IeÅ¡koti įsipareigojimų... +runner_kind = IeÅ¡koti vykdyklių... +no_results = Nerasta atitinkamų rezultatų. +issue_kind = IeÅ¡koti problemų... +branch_kind = IeÅ¡koti Å¡akų... +milestone_kind = IeÅ¡koti gairių... +pull_kind = IeÅ¡koti sujungimų... +keyword_search_unavailable = IeÅ¡koti pagal raktažodį Å¡iuo metu nepasiekiamas. Susisiekite su svetainÄ—s administratoriumi. +regexp = Reguliarusis reiÅ¡kinys +regexp_tooltip = Interpretuoti paieÅ¡kos terminÄ… kaip reguliariÄ…jÄ… reiÅ¡kinį [actions] workflow.disable = IÅ¡jungti darbo eigÄ… @@ -171,6 +182,9 @@ runs.empty_commit_message = (tuÅ¡Äias įsipareigojimo praneÅ¡imas) submodule = Pomodulis changed_filemode = %[1]s → %[2]s symbolic_link = Virtualusis aplankas +directory = Katalogas +executable_file = Vykdomasis failas +normal_file = Ä®prastas failas [projects] deleted.display_name = IÅ¡trintas projektas @@ -182,4 +196,82 @@ type-3.display_name = Organizacijos projektas filepreview.truncated = PeržiÅ«ra buvo sutrumpinta [mail] -reset_password.text = Jei tai buvote jÅ«s, spustelÄ—kite toliau esanÄiÄ… nuorodÄ…, kad atkurtumÄ—te savo paskyrÄ… per %s: \ No newline at end of file +reset_password.text = Jei tai buvote jÅ«s, spustelÄ—kite toliau esanÄiÄ… nuorodÄ…, kad atkurtumÄ—te savo paskyrÄ… per %s: + +[heatmap] +contributions_one = įnaÅ¡as +contributions_few = įnaÅ¡ai +less = Mažiau +more = Daugiau +number_of_contributions_in_the_last_12_months = %s įnašų per pastaruosius 12 mÄ—nesių +contributions_zero = Ä®našų nÄ—ra +contributions_format = {contributions} {year} {month} {day} + +[aria] +navbar = NarÅ¡ymo juosta +footer = PuslapinÄ— poraÅ¡tÄ— +footer.software = Apie Å¡iÄ… programinÄ™ įrangÄ… +footer.links = Nuorodos + +[editor] +buttons.quote.tooltip = Cituoti tekstÄ… +buttons.code.tooltip = PridÄ—ti kodÄ… +buttons.link.tooltip = PridÄ—ti nuorodÄ… +buttons.heading.tooltip = PridÄ—ti antraÅ¡tÄ™ +buttons.bold.tooltip = PridÄ—ti pusjuodį tekstÄ… +buttons.italic.tooltip = PridÄ—ti kursyvinį tekstÄ… +buttons.list.unordered.tooltip = PridÄ—ti punktų sÄ…rašą +buttons.list.ordered.tooltip = PridÄ—ti numeruotÄ… sÄ…rašą +buttons.list.task.tooltip = PridÄ—ti užduoÄių sÄ…rašą +buttons.mention.tooltip = MinÄ—ti naudotojÄ… arba komandÄ… +buttons.ref.tooltip = Nurodyti į problemÄ… arba sujungimo praÅ¡ymÄ… +buttons.switch_to_legacy.tooltip = Vietoj to naudoti senÄ…jį rengyklÄ™ +buttons.enable_monospace_font = Ä®jungti vienspalvį Å¡riftÄ… +buttons.disable_monospace_font = IÅ¡jungti vienspalvį Å¡riftÄ… +buttons.indent.tooltip = Ä®dÄ—ti elementus vienu lygiu +buttons.unindent.tooltip = IÅ¡dÄ—ti elementus vienu lygiu + +[error] +network_error = Tinklo klaida +server_internal = Vidinio serverio klaida +occurred = Ä®vyko klaida. +report_message = Jei manote, kad tai „Forgejo“ riktas, ieÅ¡kokite problemų platformoje „Codeberg“ arba, jei reikia, atidarykite naujÄ… problemÄ…. + +[startpage] +app_desc = NesudÄ—tinga, savarankiÅ¡kai teikiama „Git“ paslauga +install = Lengva įdiegti +license = Atvirojo kodo + +[install] +path = Kelias +err_admin_name_is_reserved = Administratoriaus naudotojo vardas netinkamas. Naudotojo vardas yra rezervuotas. +enable_update_checker = Ä®jungti naujinimų tikrintuvÄ… +env_config_keys = Aplinkos konfigÅ«racija +db_title = Duomenų bazÄ—s nustatymai +db_type = Duomenų bazÄ—s tipas +user = Naudotojo vardas +password = Slaptažodis +db_name = Duomenų bazÄ—s pavadinimas +db_schema = Schema +ssl_mode = SSL +host = Pagrindinis komputeris +general_title = Bendrieji nustatymai +email_title = El. paÅ¡to nustatymai +federated_avatar_lookup.description = IeÅ¡kokite pseudoportretų naudojant „Libravatar“. +db_schema_helper = Palikite tuÅ¡ÄiÄ…, jei tai numatytoji duomenų bazÄ— („public“). +err_empty_admin_password = Administratoriaus slaptažodis negali bÅ«ti tuÅ¡Äias. +err_empty_admin_email = Administratoriaus el. paÅ¡tas negali bÅ«ti tuÅ¡Äias. +install = Diegimas + +[explore] +go_to = Eiti į +code = Kodas + +[auth] +remember_me = Prisiminti šį įrenginį +forgot_password_title = PamirÅ¡tas slaptažodis +forgot_password = PamirÅ¡ote slaptažodį? + +[filter] +string.asc = A – Ž +string.desc = Ž – A \ No newline at end of file diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index f4616cd1ff..4bd379c8e2 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -1,13 +1,13 @@ [common] home=SÄkums -dashboard=Infopanelis +dashboard=PÄrskata panelis explore=IzpÄ“tÄ«t help=PalÄ«dzÄ«ba logo=Logo sign_in=Pieteikties sign_in_with_provider=Pieteikties ar %s sign_in_or=vai -sign_out=IzrakstÄ«ties +sign_out=Atteikties sign_up=ReÄ£istrÄ“ties link_account=SasaistÄ«t kontu register=ReÄ£istrÄ“ties @@ -17,7 +17,7 @@ page=Lapa template=Sagatave language=Valoda notifications=Paziņojumi -active_stopwatch=AktÄ«vÄ laika uzskaite +active_stopwatch=PaÅ¡reizÄ“jÄ laika uzskaite tracked_time_summary=IzsekojamÄ laika apkopojums, kas ir balstÄ«ts uz pieteikumu saraksta atlasi create_new=Izveidot… user_profile_and_more=Profils un iestatÄ«jumi… @@ -31,66 +31,66 @@ username=LietotÄjvÄrds email=E-pasta adrese password=Parole access_token=Piekļuves pilnvara -re_type=Apstipriniet paroli +re_type=ApstiprinÄt paroli captcha=CilvÄ“ktests -twofa=Divfaktoru autentifikÄcija -twofa_scratch=Divfaktoru vienreizÄ“jais kods +twofa=DivpakÄpju pieteikÅ¡anÄs +twofa_scratch=DivpakÄpju vienreiz izmantojamais kods passcode=Kods -webauthn_insert_key=Ievietojiet JÅ«su drošības atslÄ“gu -webauthn_sign_in=Nospiediet pogu uz drošības atslÄ“gas. Ja tai nav pogas, izņemiet un ievietojiet to atkÄrtoti. -webauthn_press_button=Nospiediet drošības atslÄ“gas pogu… -webauthn_use_twofa=Izmantot divfaktoru kodu no tÄlruņa +webauthn_insert_key=JÄievieto sava drošības atslÄ“ga +webauthn_sign_in=JÄnospiež poga uz drošības atslÄ“gas. Ja tai nav pogas, drošības atslÄ“ga ir atkÄrtoti jÄievieto. +webauthn_press_button=LÅ«gums nospiest pogu uz savas drošības atslÄ“gas… +webauthn_use_twofa=Izmantot divpakÄpju kodu no sava tÄlruņa webauthn_error=Nevar nolasÄ«t drošības atslÄ“gu. -webauthn_unsupported_browser=JÅ«su pÄrlÅ«ks neatbalsta WebAuthn standartu. -webauthn_error_unknown=Notikusi nezinÄma kļūda. AtkÄrtojiet darbÄ«bu vÄ“lreiz. -webauthn_error_insecure=`WebAuthn atbalsta tikai droÅ¡us savienojumus. PÄrbaudīšanai ar HTTP var izmantot izcelsmi "localhost" vai "127.0.0.1"` +webauthn_unsupported_browser=PÄrlÅ«ks paÅ¡laik nenodroÅ¡ina WebAuthn. +webauthn_error_unknown=AtgadÄ«jÄs nezinÄma kļūda. LÅ«gums mēģinÄt vÄ“lreiz. +webauthn_error_insecure=WebAuthn atbalsta tikai droÅ¡us savienojumus. PÄrbaudīšanai ar HTTP var izmantot pirmavotu "localhost" vai "127.0.0.1" webauthn_error_unable_to_process=Serveris nevarÄ“ja apstrÄdÄt pieprasÄ«jumu. -webauthn_error_duplicated=Drošības atslÄ“ga nav atļauta Å¡im pieprasÄ«jumam. PÄrliecinieties, ka šī atslÄ“ga jau nav reÄ£istrÄ“ta. +webauthn_error_duplicated=Drošības atslÄ“ga nav atļauta Å¡im pieprasÄ«jumam. LÅ«gums pÄrliecinÄties, ka šī atslÄ“ga nav jau reÄ£istrÄ“ta. webauthn_error_empty=JÄnorÄda šīs atslÄ“gas nosaukums. -webauthn_error_timeout=IestÄjusies noildze, mēģinot, nolasÄ«t atslÄ“gu. PÄrlÄdÄ“jiet lapu un mēģiniet vÄ“lreiz. +webauthn_error_timeout=IestÄjÄs noildze, pirms varÄ“ja nolasÄ«t atslÄ“gu. LÅ«gums pÄrlÄdÄ“t Å¡o lapu un mēģinÄt vÄ“lreiz. webauthn_reload=PÄrlÄdÄ“t -repository=Repozitorijs -organization=OrganizÄcija -mirror=Spogulis +repository=GlabÄtava +organization=ApvienÄ«ba +mirror=SpoguļglabÄtava new_repo=Jauns repozitorijs new_migrate=Jauna migrÄcija -new_mirror=Jauns spogulis -new_fork=Jauns atdalÄ«ts repozitorijs +new_mirror=Jauna spoguļglabÄtava +new_fork=Jauns glabÄtavas atzarojums new_org=Jauna organizÄcija new_project=Jauns projekts -new_project_column=Jauna kolonna +new_project_column=Jauna aile manage_org=PÄrvaldÄ«t organizÄcijas -admin_panel=Vietnes administrēšana +admin_panel=Vietnes pÄrvaldÄ«ba account_settings=Konta iestatÄ«jumi settings=IestatÄ«jumi your_profile=Profils -your_starred=Pievienots izlasÄ“ +your_starred=Izlase your_settings=IestatÄ«jumi all=Visi sources=Avoti -mirrors=Spoguļi -collaborative=SadarbÄ«bas -forks=AtdalÄ«tie +mirrors=SpoguļglabÄtavas +collaborative=LÄ«dzdarboÅ¡anÄs +forks=Atzarojumi -activities=AktivitÄte +activities=DarbÄ«bas pull_requests=Izmaiņu pieprasÄ«jumi -issues=ProblÄ“mas +issues=Pieteikumi milestones=Atskaites punkti ok=Labi cancel=Atcelt retry=MēģinÄt vÄ“lreiz -rerun=Palaist atkÄrtoti -rerun_all=Palaist atkÄrtoti visus darbus +rerun=AtkÄrtoti izpildÄ«t +rerun_all=AtkÄrtoti izpildÄ«t visus darbus save=SaglabÄt add=Pievienot add_all=Pievienot visus remove=Noņemt remove_all=Noņemt visus -remove_label_str=`Noņemt ierakstu "%s"` +remove_label_str=Noņemt vienumu "%s" edit=Labot view=SkatÄ«t @@ -98,21 +98,21 @@ enabled=IespÄ“jots disabled=AtspÄ“jots locked=SlÄ“gts -copy=KopÄ“t -copy_url=KopÄ“t saiti -copy_hash=KopÄ“t jaucÄ“jkodu -copy_content=KopÄ“t saturu -copy_branch=KopÄ“t atzara nosaukumu -copy_success=NokopÄ“ts! -copy_error=Kopēšana neizdevÄs -copy_type_unsupported=Å Ä« veida failus nav iespÄ“jams nokopÄ“t +copy=Ievietot starpliktuvÄ“ +copy_url=Ievietot URL starpliktuvÄ“ +copy_hash=Ievietot jaucÄ“jvÄ“rtÄ«bu starpliktuvÄ“ +copy_content=Ievietot saturu starpliktuvÄ“ +copy_branch=Ievietot zara nosaukumu starpliktuvÄ“ +copy_success=Ievietots starpliktuvÄ“. +copy_error=IevietoÅ¡ana starpliktuvÄ“ neizdevÄs +copy_type_unsupported=Å Äda veida datnes nevar ievietot starpliktuvÄ“ write=RakstÄ«t -preview=PriekÅ¡skatÄ«tÄ«jums +preview=PriekÅ¡skatÄ«jums loading=Notiek ielÄde… error=Kļūda -error404=Lapa, ko vÄ“laties atvÄ“rt, neeksistÄ“ vai arÄ« Jums nav tiesÄ«bas to aplÅ«kot. +error404=Å Ä« lapa vai nu nepastÄv, vai ir noņemta, vai arÄ« nav tiesÄ«bu to apskatÄ«t. go_back=Atgriezties never=Nekad @@ -129,34 +129,63 @@ archived=ArhivÄ“tie concept_system_global=GlobÄls concept_user_individual=IndividuÄls -concept_code_repository=Repozitorijs -concept_user_organization=OrganizÄcija +concept_code_repository=GlabÄtava +concept_user_organization=ApvienÄ«ba -show_timestamps=RÄdÄ«t laika zÄ«mogus +show_timestamps=RÄdÄ«t laikspiedolus show_log_seconds=RÄdÄ«t sekundes -show_full_screen=AtvÄ“rt pilnÄ logÄ +show_full_screen=AtvÄ“rt pilnekrÄnÄ download_logs=LejupielÄdÄ“t žurnÄlus confirm_delete_selected=ApstiprinÄt, lai izdzÄ“stu visus atlasÄ«tos vienumus? name=Nosaukums value=VÄ“rtÄ«ba +toggle_menu = PÄrslÄ“gt izvÄ“lni +more_items = VairÄk vienumu +error413 = Ir pÄrsniegts ierobežojums. +new_repo.title = Jauna glabÄtava +new_migrate.title = Jauna pÄrcelÅ¡ana +new_org.title = Jauna apvienÄ«ba +new_repo.link = Jauna glabÄtava +new_migrate.link = Jauna pÄrcelÅ¡ana +new_org.link = Jauna apvienÄ«ba +invalid_data = NederÄ«gi dati: %v +test = PÄrbaude +copy_generic = Ievietot starpliktuvÄ“ +filter = Atlasīšana +filter.not_mirror = Nav spoguļglabÄtavas +filter.is_template = Sagataves +filter.not_template = Nav sagataves +filter.is_archived = ArhivÄ“tas +filter.not_archived = Nav arhivÄ“tas +filter.is_fork = Atzarojumi +filter.not_fork = Nav atzarojumi +filter.is_mirror = SpoguļglabÄtavas +filter.public = AtklÄtas +filter.private = PrivÄtas +filter.clear = NotÄ«rÄ«t atlasi +confirm_delete_artifact = Vai tieÅ¡Äm izdzÄ“st artefaktu '%s'? +copy_path = Ievietot ceļu starpliktuvÄ“ [aria] -navbar=NavigÄcijas josla +navbar=PÄrieÅ¡anas josla footer=KÄjene -footer.software=Par programmatÅ«ru +footer.software=Par Å¡o programmatÅ«ru footer.links=Saites [heatmap] -number_of_contributions_in_the_last_12_months=%s darbÄ«bas pÄ“dÄ“jo 12 mÄ“neÅ¡u laikÄ -contributions_zero=Nav aktivitÄtes +number_of_contributions_in_the_last_12_months=%s iesaistes pÄ“dÄ“jo 12 mÄ“neÅ¡u laikÄ +contributions_zero=Nav iesaistīšanos less=MazÄk more=VairÄk +contributions_format = {contributions] {day}. {month}, {year}. +contributions_few = iesaistīšanÄs +contributions_one = iesaistīšanÄs [editor] -buttons.heading.tooltip=Pievienot virsrakstu -buttons.bold.tooltip=Izcelt tekstu +buttons.heading.tooltip=Virsraksts +buttons.bold.tooltip=Treknraksts buttons.italic.tooltip=SlÄ«praksta teksts buttons.quote.tooltip=CitÄ“t tekstu buttons.code.tooltip=Pievienot kodu @@ -165,10 +194,22 @@ buttons.list.unordered.tooltip=Pievienot sarakstu buttons.list.ordered.tooltip=Pievienot numurÄ“tu sarakstu buttons.list.task.tooltip=Pievienot uzdevumu sarakstu buttons.mention.tooltip=PieminÄ“t lietotÄju vai komandu -buttons.ref.tooltip=Atsaukties uz problÄ“mu vai izmaiņu pieprasÄ«jumu +buttons.ref.tooltip=Atsaukties uz pieteikumu vai izmaiņu pieprasÄ«jumu buttons.switch_to_legacy.tooltip=Izmantot vÄ“sturisko redaktoru -buttons.enable_monospace_font=Izmantot vienÄda izmÄ“ra fontu -buttons.disable_monospace_font=Neizmantot vienÄda izmÄ“ra fontu +buttons.enable_monospace_font=IespÄ“jot vienplatuma fontu +buttons.disable_monospace_font=AtspÄ“jot vienplatuma fontu +table_modal.placeholder.header = Galvene +table_modal.placeholder.content = Saturs +table_modal.label.rows = Rindas +table_modal.label.columns = Ailes +buttons.indent.tooltip = PÄrvietot vienumus vienu lÄ«meni dziļÄk +buttons.unindent.tooltip = PÄrvietot vienumus vienu lÄ«meni augstÄk +buttons.new_table.tooltip = Pievienot tabulu +table_modal.header = Pievienot tabulu +link_modal.header = Pievienot saiti +link_modal.url = URL +link_modal.description = Apraksts +link_modal.paste_reminder = NorÄde: starpliktuvÄ“ esoÅ¡u URL var ielÄ«mÄ“t uzreiz redaktorÄ, lai izveidotu saiti. [filter] string.asc=A - Z @@ -176,148 +217,156 @@ string.desc=Z - A [error] occurred=Radusies kļūda -report_message=Ja ir pÄrliecÄ«ba, ka šī ir Gitea nepilnÄ«ba, lÅ«gums pÄrbaudÄ«t GitHub, vai tÄ jau nav zinÄma, vai izveidot jaunu pieteikumu, ja nepiecieÅ¡ams. +report_message=Ja ir pÄrliecÄ«ba, ka šī ir Forgejo nepilnÄ«ba, lÅ«gums pÄrbaudÄ«t Codeberg, vai tÄ jau nav zinÄma, vai izveidot jaunu pieteikumu, ja nepiecieÅ¡ams. missing_csrf=Kļūdains pieprasÄ«jums: netika iesÅ«tÄ«ta drošības pilnvara invalid_csrf=Kļūdains pieprasÄ«jums: iesÅ«tÄ«ta kļūdaina drošības pilnvara not_found=PieprasÄ«tie dati netika atrasti. network_error=TÄ«kla kļūda +server_internal = Iekšēja servera kļūda [startpage] -app_desc=Viegli uzstÄdÄms Git serviss -install=VienkÄrÅ¡i instalÄ“jams -install_desc=VienkÄrÅ¡i jÄpalaiž izpildÄmais fails vajadzÄ«gajai platformai, jÄizmanto Docker, vai jÄiegÅ«st pakotne. -platform=Pieejama dažÄdÄm platformÄm -platform_desc=Forgejo iespÄ“jams uzstÄdÄ«t jebkur, kam Go var nokompilÄ“t: Windows, macOS, Linux, ARM utt. IzvÄ“lies to, kas tev patÄ«k! +app_desc=PaÅ¡mitinÄms Git pakalpojums bez galvassÄpÄ“m +install=Viegli uzstÄdÄ«t +install_desc=VienkÄrÅ¡i jÄpalaiž izpildÄmÄ datne vajadzÄ«gajai sistÄ“mai, jÄizmanto Docker vai jÄiegÅ«st pakotne. +platform=DažÄdas platformas lightweight=Viegla -lightweight_desc=Forgejo ir miminÄlas prasÄ«bas un to var darbinÄt uz nedÄrga Raspberry Pi datora. Ietaupi savai ierÄ«cei resursus! +lightweight_desc=Forgejo ir zemas tehniskÄs prasÄ«bas, un to var darbinÄt nedÄrgÄ Raspberry Pi datorÄ. TaupÄm savas ierÄ«ces patÄ“rÄ“to enerÄ£iju! license=AtvÄ“rtÄ pirmkoda -license_desc=IegÅ«sti Forgejo! Pievienojies un palÄ«dzi uzlabot, lai padarÄ«tu Å¡o projektu vÄ“l labÄku! NekautrÄ“jies un lÄ«dzdarbojies! +license_desc=IegÅ«sti Forgejo! Pievienojies mums lÄ«dzdarbojoties, lai padarÄ«tu Å¡o projektu vÄ“l labÄku! NekautrÄ“jies un lÄ«dzdarbojies! +platform_desc = Ir apstiprinÄts, ka Forgejo darbojas brÄ«vÄs operÄ“tÄjsistÄ“mÄs, piemÄ“ram, GNU/Linux un FreeBSD, kÄ arÄ« ar dažÄdÄm procesoru arhitektÅ«rÄm. IzvÄ“lies to, kas patÄ«k! [install] -install=InstalÄcija +install=UzstÄdīšana title=SÄkotnÄ“jÄ konfigurÄcija -docker_helper=Ja Forgejo ir uzstÄdÄ«ts Docker konteinerÄ«, izlasiet vadlÄ«ninas pirms mainÄt iestatÄ«jumus. -require_db_desc=Forgejo nepiecieÅ¡ams MySQL, PostgreSQL, SQLite3 vai TiDB (izmantojot MySQL protokolu). -db_title=Datu bÄzes iestatÄ«jumi -db_type=Datu bÄzes veids +docker_helper=Ja Forgejo ir uzstÄdÄ«ts Docker konteinerÄ, lÅ«gums izlasÄ«t vadlÄ«nijas, pirms tiek mainÄ«ti iestatÄ«jumi. +require_db_desc=Forgejo nepiecieÅ¡ams MySQL, PostgreSQL, SQLite3 vai TiDB (ar MySQL protokolu). +db_title=DatubÄzes iestatÄ«jumi +db_type=DatubÄzes veids host=Resursdators user=LietotÄjvÄrds password=Parole -db_name=Datu bÄzes nosaukums +db_name=DatubÄzes nosaukums db_schema=ShÄ“ma -db_schema_helper=AtstÄjiet tukÅ¡u, lai izmantu datubÄzes noklusÄ“to ("public"). +db_schema_helper=AtstÄt tukÅ¡u, lai izmantotu datubÄzes noklusÄ“jumu ("public"). ssl_mode=SSL path=Ceļš -sqlite_helper=Faila ceļš SQLite3 datubÄzei.
      Ievadiet absolÅ«to ceļu, ja Forgejo tiek startÄ“ts kÄ serviss. -reinstall_error=Nevar instalÄ“t datubÄzÄ“, kura jau satur Forgejo datus -reinstall_confirm_message=Veicot Forgejo datubÄzÄ“s atkÄrtotu instalēšanu, tas var izraisÄ«t vairÄkas problÄ“mas. BÅ«tu jÄizmanto esoÅ¡ais "app.ini", lai palaistu Forgejo. Apstipriniet, ja patieÅ¡Äm vÄ“laties to darÄ«t: -reinstall_confirm_check_1=Dati, kas Å¡ifrÄ“ti ar SECRET_KEY atslÄ“gu, kas ir norÄdÄ«ta app.ini failÄ, var tikt pazaudÄ“ti: lietotaji nevÄrÄ“s autorizÄ“ties ar divfaktoru autorizÄciju, kÄ arÄ« spoguļi var pÄrstÄt darboties. AtzÄ«mÄ“jot Å¡o pazÄ«mi, apstipriniet, ka paÅ¡reizÄ“jais app.ini fails satur korektu SECRET_KEY vÄ“rtÄ«bu. -reinstall_confirm_check_2=Repozitorijus un iestatÄ«jumus iespÄ“jams nepiecieÅ¡ams pÄrsinhronizÄ“t. AtzÄ«mÄ“jot, apstipriniet, ka vÄ“laties pÄrsinhronizÄ“t repozitorija ÄÄ·us un authorized_keys failu. PÄrliecinieties, ka repozitorija un spoguļoÅ¡anas iestatÄ«jumi ir pareizi. -reinstall_confirm_check_3=Apstiprinat, ka esat pÄrliecinÄts, ka Forgejo izmanto pareizu app.ini faila atraÅ¡anÄs vietu un patieÅ¡Äm vÄ“laties veikt atkÄrtotu instalÄciju, tÄpat apstiprinat, ka tas var radÄ«t augstÄk minÄ“tÄs problÄ“mas. -err_empty_db_path=Nav norÄdÄ«ts SQLite3 datu bÄzes ceļš. -no_admin_and_disable_registration=ReÄ£istrÄciju nevar atslÄ“gt, kamÄ“r nav izveidots administratora konts. -err_empty_admin_password=Administratora kontam ir obligÄti jÄnorÄda parole. -err_empty_admin_email=Administratora e-pasta adrese nevar bÅ«t tukÅ¡a. -err_admin_name_is_reserved=Administratora lietotÄjvÄrds nav korekts, Å¡Äds lietotÄjvÄrds ir rezervÄ“ts -err_admin_name_pattern_not_allowed=Administratora lietotÄjvÄrds nav korekts, Å¡Äds lietotÄjvÄrds nav atļauts -err_admin_name_is_invalid=Administratora lietotÄja nav korekts +sqlite_helper=SQLite3 datubÄzes datnes ceļš.
      JÄievada pilns ceļš, ja Forgejo tiek palaists kÄ sistÄ“mas pakalpojums. +reinstall_error=Tiek mēģinÄts uzstÄdÄ«t esoÅ¡Ä Forgejo datubÄzÄ“ +reinstall_confirm_message=AtkÄrtota uzstÄdīšana ar esoÅ¡u Forgejo datubÄzi var izraisÄ«t vairÄkas nebūšanas. VairumÄ gadÄ«jumu vajadzÄ“tu izmantot esoÅ¡o "app.ini", lai palaistu Forgejo. JÄapstiprina zemÄk esoÅ¡ais, ja ir skaidrs, kas tiek darÄ«ts: +reinstall_confirm_check_1=Dati, kas Å¡ifrÄ“ti ar SECRET_KEY, kas ir norÄdÄ«ta app.ini datnÄ“, var tikt pazaudÄ“ti: lietotÄji nevarÄ“s pieteikties ar 2FA/OTP, kÄ arÄ« spoguļglabÄtavas var pÄrstÄt darboties. Ar šīs izvÄ“les rÅ«tiņas atzÄ«mēšanu tiek apstiprinÄts, ka paÅ¡reizÄ“jÄ app.ini datne satur pareizu SECRET_KEY vÄ“rtÄ«bu. +reinstall_confirm_check_2=GlabÄtavas un iestatÄ«jumus var bÅ«t nepiecieÅ¡ams atkÄrtoti sinhronizÄ“t. Ar šīs izvÄ“les rÅ«tiņas atzÄ«mēšanu tiek apstiprinÄts, ka paÅ¡rocÄ«gi tiks veikta glabÄtavu aizÄ·eru un authorized_keys datnes atkÄrtota sinhronizēšana. Tiek apstiprinÄts, ka tiks nodroÅ¡inÄts, ka glabÄtavas un spoguļoÅ¡anas iestatÄ«jumi ir pareizi. +reinstall_confirm_check_3=Ar Å¡o tiek apstiprinÄts, ka ir pilnÄ«ga pÄrliecÄ«ba, ka Forgejo darbojas ar pareizu app.ini atraÅ¡anÄs vietu un ka tieÅ¡Äm ir nepiecieÅ¡ama atkÄrtota uzstÄdīšana. Tiek apliecinÄts, ka iepriekÅ¡minÄ“tais var novest pie kļūmÄ“m. +err_empty_db_path=SQLite3 datubÄzes ceļš nevar bÅ«t tukÅ¡s. +no_admin_and_disable_registration=LietotÄju reÄ£istrēšanos nevar atspÄ“jot bez pÄrvaldÄ«tÄja konta izveidoÅ¡anas. +err_empty_admin_password=PÄrvaldÄ«tÄja parole nevar bÅ«t tukÅ¡a. +err_empty_admin_email=PÄrvaldÄ«tÄja e-pasta adrese nevar bÅ«t tukÅ¡a. +err_admin_name_is_reserved=PÄrvaldÄ«tÄja lietotÄjvÄrds ir nederÄ«gs, Å¡is lietotÄjvÄrds ir aizņemts +err_admin_name_pattern_not_allowed=PÄrvaldÄ«tÄja lietotÄjvÄrds ir nederÄ«gs, Å¡is lietotÄjvÄrds atbilst aizņemto lietotÄjvÄrdu paraugam +err_admin_name_is_invalid=PÄrvaldÄ«tÄja lietotÄjvÄrds ir nederÄ«gs -general_title=VispÄrÄ«gie iestatÄ«jumi +general_title=VispÄrÄ«gi iestatÄ«jumi app_name=Vietnes nosaukums -app_name_helper=Å eit var ievadÄ«t savas kompÄnijas nosaukumu. -repo_path=Repozitoriju glabÄÅ¡anas ceļš -repo_path_helper=Git repozitoriji tiks glabÄti Å¡ajÄ direktorijÄ. -lfs_path=Git LFS glabÄÅ¡anas vieta -lfs_path_helper=Faili, kas pievienoti Git LFS, tiks glabÄti Å¡ajÄ direktorijÄ. AtstÄjiet tukÅ¡u, lai atspÄ“jotu. -run_user=Izpildes lietotÄjs -run_user_helper=OperÄ“tÄjsistÄ“ms lietotÄjs, ar kuru tiks palaists Gitea. JÄņem vÄ“rÄ, ka Å¡im lietotÄjam ir jÄbÅ«t piekļuvei repozitorija atraÅ¡anÄs vietai. -domain=Servera domÄ“ns +app_name_helper=Å eit ir ievadÄms sava servera nosaukums. Tas tiks attÄ“lots katrÄ lapÄ. +repo_path=GlabÄtavu atraÅ¡anÄs vieta +repo_path_helper=AttÄlÄs Git glabÄtavas tiks saglabÄtas Å¡ajÄ mapÄ“. +lfs_path=Git LFS atraÅ¡anÄs vieta +lfs_path_helper=Datnes, kas pievienotas Git LFS, tiks glabÄtas Å¡ajÄ mapÄ“. AtstÄt tukÅ¡u, lai atspÄ“jotu. +run_user=LietotÄjs, ar kuru palaist +run_user_helper=OperÄ“tÄjsistÄ“ms lietotÄjs, ar kuru tiks palaists Forgejo. JÄņem vÄ“rÄ, ka Å¡im lietotÄjam ir jÄbÅ«t piekļuvei glabÄtavas atraÅ¡anÄs vietai. +domain=Servera domÄ“na vÄrds domain_helper=DomÄ“ns vai servera adrese. ssh_port=SSH servera ports -ssh_port_helper=Porta numurs, kuru SSH serveris klausÄ«sies. AtstÄjiet tukÅ¡u, lai atspÄ“jotu. -http_port=Forgejo HTTP klausīšanÄs ports -http_port_helper=Porta numurs, kuru Forgejo tÄ«mekļa serveris klausÄ«sies. -app_url=Forgejo pamata URL +ssh_port_helper=Porta numurs, kuru izmantos SSH serveris. AtstÄt tukÅ¡u, lai atspÄ“jotu SSH serveri. +http_port=HTTP klausīšanÄs ports +http_port_helper=Porta numurs, kuru izmantos Forgejo tÄ«mekļa serveris. +app_url=Pamata URL app_url_helper=Pamata adrese HTTP(S) klonēšanas URL un e-pastu paziņojumiem. -log_root_path=Žurnalizēšanas ceļš -log_root_path_helper=Žurnalizēšanas faili tiks rakstÄ«ti Å¡ajÄ direktorijÄ. +log_root_path=ŽurnÄlu atraÅ¡anÄs vieta +log_root_path_helper=ŽurnÄlu datnes tiks rakstÄ«tas Å¡ajÄ mapÄ“. -optional_title=NeobligÄtie iestatÄ«jumi -email_title=E-pastu iestatÄ«jumi -smtp_addr=SMTP resursdators +optional_title=IzvÄ“les iestatÄ«jumi +email_title=E-pasta iestatÄ«jumi +smtp_addr=SMTP saimniekdators smtp_port=SMTP ports -smtp_from=NosÅ«tÄ«t e-pastu kÄ -smtp_from_helper=E-pasta adrese, ko Forgejo izmantos. Ievadiet tika e-pasta adrese vai izmantojiet "VÄrds" formÄtu. +smtp_from=SÅ«tÄ«t e-pasta ziņojumus kÄ +smtp_from_helper=E-pasta adrese, ko izmantos Forgejo. JÄievada tikai e-pasta adrese vai jÄizmanto pieraksts "VÄrds" . mailer_user=SMTP lietotÄjvÄrds mailer_password=SMTP parole -register_confirm=ReÄ£istrÄ“joties pieprasÄ«t apstiprinÄt e-pastu +register_confirm=ReÄ£istrÄ“joties pieprasÄ«t e-pasta adreses apstiprinÄÅ¡anu mail_notify=IespÄ“jot e-pasta paziņojumus -server_service_title=Servera un citu servisu iestatÄ«jumi +server_service_title=Servera un treÅ¡o puÅ¡u pakalpojumu iestatÄ«jumi offline_mode=IespÄ“jot bezsaistes režīmu -offline_mode.description=AtspÄ“jot ÄrÄ“jos satura piegÄdes tÄ«klus, lai visi resursi tiktu piegÄdÄti lokÄli. +offline_mode.description=AtspÄ“jot ÄrÄ“jos satura piegÄdes tÄ«klus, lai visi resursi tiktu nodroÅ¡inÄti vietÄ“ji. disable_gravatar=AtspÄ“jot Gravatar -disable_gravatar.description=AtspÄ“jot Gravatar un citus avotus, visus avatarus augÅ¡upielÄdÄ“s lietotÄji vai izmantos noklusÄ“to attÄ“lu. -federated_avatar_lookup=IespÄ“jot apvienotÄs profila bildes -federated_avatar_lookup.description=IespÄ“jot apvienoto profila bilžu meklÄ“tÄju, lai izmantotu atvÄ“rtÄ koda apvienoto servisu balstÄ«tu uz Libravatar. -disable_registration=AtspÄ“jot lietotÄju reÄ£istrÄciju -disable_registration.description=AtspÄ“jot iespÄ“ju reÄ£istrÄ“ties. Tikai administratori varÄ“s izveidot jaunus kontus. -allow_only_external_registration.description=Atļaut reÄ£istrÄ“ties tikai ar ÄrÄ“jiem servisiem +disable_gravatar.description=AtspÄ“jot Gravatar un citu treÅ¡o puÅ¡u attÄ“lu avotu izmantoÅ¡anu. KÄ lietotÄju attÄ“li tiks izmantoti noklusÄ“juma attÄ“li, lÄ«dz lietotÄji augÅ¡upielÄdÄ“s paÅ¡i savus. +federated_avatar_lookup=IespÄ“jot apvienotos profila attÄ“lus +federated_avatar_lookup.description=UzmeklÄ“t profila attÄ“lus ar Libravatar. +disable_registration=AtspÄ“jot paÅ¡reÄ£istrēšanos +disable_registration.description=Tikai servera pÄrvaldÄ«tÄji varÄ“s izveidot jaunus lietotÄju kontus. Ir ļoti ieteicams reÄ£istrēšanos paturÄ“t atspÄ“jotu, ja vien nav iecerÄ“ts mitinÄt visiem pieejamu serveri un ir gatavÄ«ba tikt galÄ ar lielu negodprÄtÄ«gu kontu skaitu. +allow_only_external_registration.description=LietotÄji varÄ“s izveidot jaunos kontus tikai izmantojot konfigurÄ“tus ÄrÄ“jos pakalpojumus. openid_signin=IespÄ“jot pieteikÅ¡anos ar OpenID -openid_signin.description=IespÄ“jot lietotÄju pieteikÅ¡anos ar OpenID. -openid_signup=IespÄ“jot reÄ£istrÄciju, izmantojot OpenID -openid_signup.description=IespÄ“jot lietotÄju reÄ£istrÄciju pirms tam autorizÄ“joties ar OpenID. +openid_signin.description=Ä»aut lietotÄjiem pieteikties ar OpenID. +openid_signup=IespÄ“jot paÅ¡reÄ£istrēšanos ar OpenID +openid_signup.description=Ä»aut lietotÄjiem izveidot kontus caur OpenID, ja ir iespÄ“jota paÅ¡reÄ£istrēšanÄs. enable_captcha=PieprasÄ«t drošības kodu lietotÄju reÄ£istrÄcijÄ -enable_captcha.description=LietotÄjam reÄ£istrÄ“joties, pieprasÄ«t ievadÄ«t drošības kodu. -require_sign_in_view=PieprasÄ«t pieteikÅ¡anos, lai aplÅ«kotu lapas -require_sign_in_view.description=Ierobežot piekļuvi lapÄm tikai lietotÄjiem, kuri ir pieteikuÅ¡ies. ApmeklÄ“tÄji redzÄ“s tikai pieteikÅ¡anÄs un reÄ£istrēšanÄs lapu. -admin_setting.description=Nav nepiecieÅ¡ams izveidot administratora kontu uzreiz, pirmais reÄ£istrÄ“tais lietotÄjs saņems administratora tiesÄ«bas automÄtiski. -admin_title=Administratora konta iestatÄ«jumi -admin_name=Administratora lietotÄjvÄrds +enable_captcha.description=PieprasÄ«t lietotÄjus atrisinÄt CAPTCHA, lai varÄ“tu izveidot kontus. +require_sign_in_view=PieprasÄ«t pieteikÅ¡anos, lai skatÄ«tu servera saturu +require_sign_in_view.description=Ierobežot piekļuvi saturam tikai lietotÄjiem, kuri ir pieteikuÅ¡ies. Viesi varÄ“s apmeklÄ“t tikai autentificēšanÄs lapas. +admin_setting.description=Var izvÄ“lÄ“ties, vai izveidot pÄrvaldÄ«tÄja kontu vai nÄ“. Pirmais reÄ£istrÄ“tais lietotÄjs automÄtiski kļūs par pÄrvaldÄ«tÄju. +admin_title=PÄrvaldÄ«tÄja konta iestatÄ«jumi +admin_name=PÄrvaldÄ«tÄja lietotÄjvÄrds admin_password=Parole -confirm_password=Apstipriniet paroli +confirm_password=ApstiprinÄt paroli admin_email=E-pasta adrese -install_btn_confirm=InstalÄ“t Forgejo -test_git_failed=Kļūda pÄrbaudot 'git' komandu: %v -sqlite3_not_available=JÅ«su paÅ¡reizÄ“jÄ versija neatbalsta SQLite3, lÅ«dzu lejupielÄdÄ“jiet oficiÄlo binÄro versiju no %s, NEVIS gobuild versiju. +install_btn_confirm=UzstÄdÄ«t Forgejo +test_git_failed=NevarÄ“ja pÄrbaudÄ«t "git" komandu: %v +sqlite3_not_available=Å Ä« Forgejo versija neatbalsta SQLite3. LÅ«gums lejupielÄdÄ“t oficiÄlo binÄro versiju no %s (ne 'gobuild' versiju). invalid_db_setting=NederÄ«gi datu bÄzes iestatÄ«jumi: %v invalid_db_table=DatubÄzes tabula "%s" ir kļūdaina: %v -invalid_repo_path=NederÄ«ga repozitorija glabÄÅ¡anas vieta: %v -invalid_app_data_path=Lietojumprogrammas datu ceļš ir kļūdains: %v -run_user_not_match=Izpildes lietotÄjs nav paÅ¡reizÄ“jais lietotÄjs: %s -> %s -internal_token_failed=NeizdevÄs uzÄ£enerÄ“t iekšējÄs saziņas pilnvaru: %v -secret_key_failed=NeizdevÄs uzÄ£enerÄ“t drošības atslÄ“gu: %v +invalid_repo_path=NederÄ«ga glabÄtavu atraÅ¡anÄs vieta: %v +invalid_app_data_path=Lietotnes datu ceļš ir nederÄ«gs: %v +run_user_not_match="LietotÄjs, ar kuru palaist" lietotÄjvÄrds neatbilst paÅ¡reizÄ“jam lietotÄjam: %s -> %s +internal_token_failed=NeizdevÄs izveidot iekšējo pilnvaru: %v +secret_key_failed=NeizdevÄs izveidot drošības atslÄ“gu: %v save_config_failed=NeizdevÄs saglabÄt konfigurÄciju: %v -invalid_admin_setting=NederÄ«gs administratora iestatÄ«jums: %v -invalid_log_root_path=NederÄ«gs žurnalizēšanas ceļš: %v +invalid_admin_setting=PÄrvaldÄ«tÄja konta iestatÄ«jums ir nederÄ«gs: %v +invalid_log_root_path=ŽurnÄla atraÅ¡anÄs vieta ir nederÄ«ga: %v default_keep_email_private=PÄ“c noklusÄ“juma slÄ“pt e-pasta adreses -default_keep_email_private.description=Å Ä« ir noklusÄ“tÄ pazÄ«me, lai noteiktu lietotÄja e-pasta adreses redzamÄ«bu. AtzÄ«mÄ“jot to e-pasta adrese visiem jaunajiem lietotÄjiem nebÅ«s redzama lÄ«dz lietotÄjs neizmainÄ«s to savos iestatÄ«jumos. -default_allow_create_organization=PÄ“c noklusÄ“juma ļaut veidot organizÄcijas -default_allow_create_organization.description=AtzÄ«mÄ“jiet Å¡o pazÄ«mi, ja vÄ“laties, lai jauniem lietotÄjiem pÄ“c noklusÄ“juma tiek piešķirtas tiesÄ«bas veidot organizÄcijas. +default_keep_email_private.description=PÄ“c noklusÄ“juma iespÄ“jot e-pasta adreses slÄ“pÅ¡anu jauniem lietotÄjiem, lai šī informÄciju nenoplÅ«stu uzreiz pÄ“c reÄ£istrēšanÄs. +default_allow_create_organization=PÄ“c noklusÄ“juma ļaut apvienÄ«bu izveidoÅ¡anu +default_allow_create_organization.description=PÄ“c noklusÄ“juma ļaut jauniem lietotÄjiem izveidot apvienÄ«bas. Kad šī iespÄ“ja ir atspÄ“jota, pÄrvaldÄ«tÄjam bÅ«s jÄnodroÅ¡ina apvienÄ«bu izveidoÅ¡anas atļauja jaunajiem lieotÄjiem. default_enable_timetracking=PÄ“c noklusÄ“juma iespÄ“jot laika uzskaiti -default_enable_timetracking.description=Repozitorijiem pÄ“c noklusÄ“juma tiks iespÄ“jota laika uzskaite atkarÄ«bÄ no šī iestatÄ«juma. -no_reply_address=NeatbildÄ“t e-pasta adreses domÄ“ns -no_reply_address_helper=DomÄ“ns lietotÄja e-pasta adresei git žurnÄlos, ja lietotÄjs izvÄ“las paturÄ“t savu e-pasta adresi privÄtu. PiemÄ“ram, ja lietotÄjs ir 'janis' un domÄ“ns 'neatbildet.piemers.lv', tad e-pasta adrese bÅ«s 'janis@neatbildet.piemers.lv'. -password_algorithm=Paroles jaucÄ“jsummas algoritms +default_enable_timetracking.description=PÄ“c noklusÄ“juma ļaut laika uzskaites iespÄ“jas izmantoÅ¡anu jaunÄs glabÄtavÄs. +no_reply_address=SlÄ“pjamo e-pasta adreÅ¡u domÄ“na vÄrds +no_reply_address_helper=DomÄ“na vÄrds lietotÄjiem ar paslÄ“ptu e-pasta adresi. PiemÄ“ram, lietotÄjs 'janis' tiks ierakstÄ«ts žurnÄlÄ kÄ 'janis@noreply.example.org', ja kÄ paslÄ“pto e-pasta adreÅ¡u domÄ“na vÄrds ir iestatÄ«ts 'noreply.example.org'. +password_algorithm=Paroles jaucÄ“jkoda algoritms invalid_password_algorithm=Kļūdaina paroles jaucÄ“jfunkcija -password_algorithm_helper=NorÄdiet paroles jaucÄ“jalgoritmu. Algoritmi atšķirÄs pÄ“c prasÄ«bÄm pret resursiem un stipruma. Argon2 algoritms ir droÅ¡s, bet tam nepiecieÅ¡ams daudz operatÄ«vÄs atmiņas, lÄ«dz ar ko tas var nebÅ«t piemÄ“rots sistÄ“mÄm ar maz pieejamajiem resursiem. -enable_update_checker=IespÄ“jot jaunu versiju paziņojumus +password_algorithm_helper=JÄnorÄda paroles jaukÅ¡anas algoritms. Algoritmiem ir atšķirÄ«gas prasÄ«bas un stiprums. argon2 algoritms ir samÄ“rÄ droÅ¡s, bet tas izmanto daudz atmiņas un var nebÅ«t piemÄ“rots mazÄm sistÄ“mÄm. +enable_update_checker=IespÄ“jot atjauninÄjumu pÄrbaudÄ«tÄju env_config_keys=Vides konfigurÄcija -env_config_keys_prompt=Å ie vides mainÄ«gie tiks pielietoti arÄ« konfigurÄcijas failÄ: +env_config_keys_prompt=Å ie vides mainÄ«gie tiks pielietoti arÄ« konfigurÄcijas datnÄ“: +smtp_from_invalid = "SÅ«tÄ«t e-pastu kÄ" adrese ir nederÄ«ga +app_slogan = Servera sauklis +config_location_hint = Å Ä«s konfigurÄcijas iespÄ“jas tiks saglabÄtas: +allow_only_external_registration = Atļaut reÄ£istrēšanos tikai ar ÄrÄ“jiem pakalpojumiem +allow_dots_in_usernames = Laut lietotÄjiem izmantot punktus savÄ lietotÄjvÄrdÄ. NeietekmÄ“ esoÅ¡os kontus. +app_slogan_helper = Å eit ir ievadÄms servera sauklis. AtstÄt tukÅ¡u, lai atspÄ“jotu. +enable_update_checker_helper_forgejo = Tas laiku pa laikam pÄrbaudÄ«s, vai ir pieejamas jaunas Forgejo versijas, izmantojot release.forgejo.org TXT DNS ierakstu. [home] -uname_holder=LietotÄjvÄrds vai e-pasts +uname_holder=LietotÄjvÄrds vai e-pasta adrese password_holder=Parole -switch_dashboard_context=MainÄ«t infopaneļa kontekstu -my_repos=Repozitoriji +switch_dashboard_context=MainÄ«t pÄrskata paneļa kontekstu +my_repos=GlabÄtavas show_more_repos=ParÄdÄ«t vairÄk repozitorijus… collaborative_repos=SadarbÄ«bas repozitoriji -my_orgs=Manas organizÄcijas +my_orgs=ApvienÄ«bas my_mirrors=Mani spoguļi -view_home=SkatÄ«ties %s +view_home=ApskatÄ«t %s search_repos=MeklÄ“t repozitoriju… -filter=Citi filtri -filter_by_team_repositories=FiltrÄ“t pÄ“c komandas repozitorijiem -feed_of=`"%s" plÅ«sma` +filter=Citas atlases +filter_by_team_repositories=AtlasÄ«t pÄ“c komandas glabÄtavÄm +feed_of="%s" barotne show_archived=ArhivÄ“tie show_both_archived_unarchived=AttÄ“lot gan arhivÄ“tos, gan nearhivÄ“tos @@ -325,16 +374,16 @@ show_only_archived=AttÄ“lot tikai arhivÄ“tos show_only_unarchived=AttÄ“lot tikai nearhivÄ“tos show_private=PrivÄts -show_both_private_public=AttÄ“lot gan publiskos, gan privÄtos +show_both_private_public=RÄda gan atklÄtÄs, gan privÄtÄs show_only_private=AttÄ“lot tikai privÄtos -show_only_public=AttÄ“lot tikai publiskos +show_only_public=AttÄ“lo tikai atklÄtÄs -issues.in_your_repos=JÅ«su repozitorijos +issues.in_your_repos=ManÄs glabÄtavÄs [explore] -repos=Repozitoriji +repos=GlabÄtavas users=LietotÄji -organizations=OrganizÄcijas +organizations=ApvienÄ«bas search=MeklÄ“t go_to=Iet uz code=Kods @@ -350,145 +399,178 @@ org_no_results=Netika atrasta neviena organizÄcija, kas atbilstu kritÄ“rijiem. code_no_results=Netika atrasts pirmkods, kas atbilstu kritÄ“rijiem. code_search_results=`Meklēšanas rezultÄti "%s"` code_last_indexed_at=PÄ“dÄ“jo reizi indeksÄ“ts %s -relevant_repositories_tooltip=Repozitoriju, kas ir atdalÄ«ti vai kuriem nav tÄ“mas, ikonas un apraksta ir paslÄ“pti. -relevant_repositories=Tikai bÅ«tiskie repozitoriji tiek rÄdÄ«ti, pÄrÄdÄ«t nefiltrÄ“tus rezultÄtus. +relevant_repositories_tooltip=GlabÄtavas, kas ir atzarojumi vai kam nav temata, ikonas un apraksta, ir paslÄ“ptas. +relevant_repositories=Tiek rÄdÄ«tas tikai atbilstoÅ¡Äs glabÄtavas, rÄdÄ«t neatsijÄtu iznÄkumu. +stars_one = %d zvaigzne +stars_few = %d zvaignznes +forks_one = %d atzarojums +forks_few = %d atzarojumi [auth] -create_new_account=ReÄ£istrÄ“t kontu +create_new_account=Izveidot kontu register_helper_msg=Jau ir konts? Piesakieties tagad! social_register_helper_msg=Jau ir konts? Piesaisti to! -disable_register_prompt=ReÄ£istrÄcija ir atspÄ“jota. LÅ«dzu, sazinieties ar vietnes administratoru. -disable_register_mail=ReÄ£istrÄcijas e-pasta apstiprinÄÅ¡ana ir atspÄ“jota. -manual_activation_only=Sazinieties ar lapas administratoru, lai pabeigtu konta aktivizÄciju. +disable_register_prompt=ReÄ£istrēšanÄs ir atspÄ“jota. LÅ«gums sazinÄties ar vietnes pÄrvaldÄ«tÄju. +disable_register_mail=E-pasta adreses apstiprinÄÅ¡ana reÄ£istrÄ“joties ir atspÄ“jota. +manual_activation_only=JÄsazinÄs ar vietnes pÄrvaldÄ«tÄju, lai pabeigtu aktivēšanu. remember_me=AtcerÄ“ties Å¡o ierÄ«ci remember_me.compromised=PieteikÅ¡anÄs pilnvara vairs nav derÄ«ga, kas var norÄdÄ«t uz ļaunprÄtÄ«gÄm darbÄ«bÄm kontÄ. LÅ«gums pÄrbaudÄ«t, vai kontÄ nav neparastu darbÄ«bu. -forgot_password_title=Aizmirsu paroli +forgot_password_title=Aizmirsta parole forgot_password=Aizmirsi paroli? sign_up_now=NepiecieÅ¡ams konts? ReÄ£istrÄ“jies tagad. -sign_up_successful=Konts tika veiksmÄ«gi izveidots. Laipni lÅ«dzam! -confirmation_mail_sent_prompt=Jauns apstiprinÄÅ¡anas e-pasts ir nosÅ«tÄ«ts uz %s, pÄrbaudies savu e-pasta kontu tuvÄko %s laikÄ, lai pabeigtu reÄ£istrÄcijas procesu. -must_change_password=MainÄ«t paroli +sign_up_successful=Konts tika sekmÄ«gi izveidots. Laipni lÅ«dzam! +confirmation_mail_sent_prompt=Jauns apstiprinÄÅ¡anas e-pasta ziņojums tika nosÅ«tÄ«ts uz %s. LÅ«gums pÄrbaudÄ«t savu iesÅ«tni nÄkamajÄs %s, lai pabeigtu reÄ£istrēšanos. Ja e-pasta adrese ir nepareiza, ir iespÄ“jams pieteikties un pieprasÄ«t vÄ“l viena apstiprinÄÅ¡anas e-pasta ziņojuma nosÅ«tīšanu uz citu adresi. +must_change_password=AtjauninÄt savu paroli allow_password_change=PieprasÄ«t lietotÄjam mainÄ«t paroli (ieteicams) -reset_password_mail_sent_prompt=ApstiprinÄÅ¡anas e-pasts tika nosÅ«tÄ«ts uz %s. PÄrbaudiet savu e-pasta kontu tuvÄko %s laikÄ, lai pabeigtu paroles atjaunoÅ¡anas procesu. -active_your_account=AktivizÄ“t savu kontu -account_activated=Konts ir aktivizÄ“ts -prohibit_login=PieteikÅ¡anÄs liegta -prohibit_login_desc=JÅ«su konts ir bloÄ·Ä“ts, sazinieties ar sistÄ“mas administratoru. -resent_limit_prompt=JÅ«s pieprasÄ«jÄt aktivizÄcijas e-pastu pÄrÄk bieži. LÅ«dzu, uzgaidiet 3 minÅ«tes un mēģiniet vÄ“lreiz. -has_unconfirmed_mail=Sveiki %s, Jums ir neapstiprinÄta e-pasta adrese (%s). Ja neesat saņēmis apstiprinÄÅ¡anas e-pastu vai Jums ir nepiecieÅ¡ams nosÅ«tÄ«t jaunu, lÅ«dzu, nospiediet pogu, kas atrodas zemÄk. -resend_mail=Nospiediet Å¡eit, lai vÄ“lreiz nosÅ«tÄ«tu aktivizÄcijas e-pastu +reset_password_mail_sent_prompt=ApstiprinÄjuma e-pasta ziņojums tika nosÅ«tÄ«ts uz %s. LÅ«gums pÄrbaudÄ«t savu iesÅ«tni un atvÄ“rt tajÄ saņemto saiti, lai pabeigtu konta atkopi. +active_your_account=AktivÄ“t savu kontu +account_activated=Konts ir aktivÄ“ts +prohibit_login=Konta darbÄ«ba ir apturÄ“ta +prohibit_login_desc=Kontam ir liegts mijiedarboties ar serveri. JÄsazinÄs ar tÄ pÄrvaldÄ«tÄju, lai atgÅ«tu piekļuvi. +resent_limit_prompt=Nesen jau tika pieprasÄ«ts aktivēšanas e-pasta ziņojums. LÅ«gums uzgaidÄ«t 3 minÅ«tes un mēģinÄt vÄ“lreiz. +has_unconfirmed_mail=Sveiciens, %s! Tev ir neapstiprinÄta e-pasta adrese (%s). Ja nav saņemts apstiprinÄjuma e-pasta ziņojums vai ir nepiecieÅ¡ams nosÅ«tÄ«t jaunu, lÅ«gums klikšķinÄt uz zemÄk esoÅ¡Äs pogas. +resend_mail=KlikšķinÄt Å¡eit, lai atkÄrtoti nosÅ«tÄ«tu aktivēšanas e-pasta ziņojumu email_not_associate=Å Ä« e-pasta adrese nav saistÄ«ta ar nevienu kontu. -send_reset_mail=NosÅ«tÄ«t paroles atjaunoÅ¡anas e-pastu -reset_password=Paroles atjaunoÅ¡ana -invalid_code=JÅ«su apstiprinÄÅ¡anas kodam ir beidzies derÄ«guma termiņš vai arÄ« tas ir nepareizs. -invalid_code_forgot_password=ApliecinÄjuma kods ir nederÄ«gs vai tÄ derÄ«gums ir beidzies. Nospiediet Å¡eit, lai uzsÄktu jaunu sesiju. -invalid_password=JÅ«su parole neatbilst parolei, kas tika ievadÄ«ta veidojot so kontu. +send_reset_mail=NosÅ«tÄ«t atkopes e-pasta ziņojumu +reset_password=Konta atkope +invalid_code=ApstiprinÄÅ¡anas kods ir nederÄ«gs, vai ir beidzies tÄ derÄ«gums. +invalid_code_forgot_password=ApstiprinÄÅ¡anas kods ir nederÄ«gs, vai tÄ derÄ«gums ir beidzies. JÄklikšķina Å¡eit, lai uzsÄktu jaunu sesiju. +invalid_password=Parole neatbilst tai, kas tika izmantota konta izveidoÅ¡anas laikÄ. reset_password_helper=Atjaunot paroli -reset_password_wrong_user=JÅ«s esat pieteicies kÄ %s, bet konta atkopÅ¡anas saite ir paredzÄ“ta lietotÄjam %s -password_too_short=Paroles garums nedrÄ«kst bÅ«t mazÄks par %d simboliem. +reset_password_wrong_user=Tu pieteicies kÄ %s, bet konta atkopes saite ir paredzÄ“ta %s +password_too_short=Paroles garums nevar bÅ«t mazÄks par %d rakstzÄ«mÄ“m. non_local_account=Ä€rÄ“jie konti nevar mainÄ«t paroli, izmantojot, Forgejo saskarni. -verify=PÄrbaudÄ«t +verify=ApliecinÄt scratch_code=VienreizÄ“jais kods use_scratch_code=Izmantot vienreizÄ“jo kodu -twofa_scratch_used=VienreizÄ“jais kods tika izmantots. Notika pÄrvirzīšana uz divfaktoru iestatÄ«jumu lapu, lai varÄ“tu pÄrsaistÄ«t jaunu ierÄ«ci vai uzÄ£enerÄ“t jaunu vienreizÄ“jo kodu. -twofa_passcode_incorrect=Piekļuves kods nav pareizs. Ja esat pazaudÄ“jis ierÄ«ci, izmantojiet vienreizÄ“jo kodu, lai pieteiktos. +twofa_scratch_used=Ir izmantots vienreizÄ“jais kods. Notika pÄrvirzīšana uz divpakÄpju iestatÄ«jumu lapu, lai varÄ“tu noņemt savas ierÄ«ces piesaisti vai izveidot jaunu vienreizÄ“jo kodu. +twofa_passcode_incorrect=Piekļuves kods ir nepareizs. Ja ierÄ«ce ir pazaudÄ“ta, jÄizmanto vienreizÄ“jais kods, lai pieteiktos. twofa_scratch_token_incorrect=IevadÄ«ts nepareizs vienreizÄ“jais kods. login_userpass=Pieteikties tab_openid=OpenID -oauth_signup_tab=ReÄ£istrÄ“t jaunu kontu -oauth_signup_title=Pabeigt konta veidoÅ¡anu -oauth_signup_submit=Pabeigt reÄ£istrÄciju +oauth_signup_tab=Izveidot jaunu kontu +oauth_signup_title=Pabeigt jauna konta izveidoÅ¡anu +oauth_signup_submit=Pabeigt konta izveidoÅ¡anu oauth_signin_tab=SasaistÄ«t ar esoÅ¡u kontu -oauth_signin_title=Pieteikties, lai autorizÄ“tu saistÄ«to kontu +oauth_signin_title=Pieteikties, lai pilnvarotu sasaistÄ«to kontu oauth_signin_submit=SasaistÄ«t kontu -oauth.signin.error=RadÄs kļūda apstrÄdÄjot pieteikÅ¡anÄs pieprasÄ«jumu. Ja šī kļūda atkÄrtojas, sazinieties ar lapas administratoru. -oauth.signin.error.access_denied=AutorizÄcijas pieprasÄ«jums tika noraidÄ«ts. -oauth.signin.error.temporarily_unavailable=PieteikÅ¡anÄs neizdevÄs, jo autentifikÄcijas serveris ir Ä«slaicÄ«gi nepieejams. Mēģiniet autorizÄ“ties vÄ“lÄk. +oauth.signin.error=PilnvaroÅ¡anas pieprasÄ«juma apstrÄdes laikÄ atgadÄ«jÄs kļūda. JÄ tÄ atkÄrtojas, lÅ«gums sazinÄties ar vietnes pÄrvaldÄ«tÄju. +oauth.signin.error.access_denied=PilnvaroÅ¡anas pieprasÄ«jums tika noraidÄ«ts. +oauth.signin.error.temporarily_unavailable=PilnvaroÅ¡ana neizdevÄs, jo autentificēšanÄs serveris Ä«slaicÄ«gi nav pieejams. LÅ«gums vÄ“lÄk mēģinÄt vÄ“lreiz. openid_connect_submit=Pievienoties openid_connect_title=Pievienoties jau esoÅ¡am kontam -openid_connect_desc=IzvÄ“lÄ“tais OpenID konts sistÄ“mÄ netika atpazÄ«ts, bet JÅ«s to varat piesaistÄ«t esoÅ¡am kontam. +openid_connect_desc=IzvÄ“lÄ“tais OpenID URI ir nezinÄms. Tas ir jÄasasaista ar jaunu kontu Å¡eit. openid_register_title=Izveidot jaunu kontu -openid_register_desc=IzvÄ“lÄ“tais OpenID konts sistÄ“mÄ netika atpazÄ«ts, bet JÅ«s to varat piesaistÄ«t esoÅ¡am kontam. +openid_register_desc=IzvÄ“lÄ“tais OpenID URI ir nezinÄms. Tas ir jÄasasaista ar jaunu kontu Å¡eit. openid_signin_desc=JÄievada OpenID URI. PiemÄ“ram, anna.openid.example.org vai https://openid.example.org/anna. -disable_forgot_password_mail=Konta atjaunoÅ¡ana ir atspÄ“jota, jo nav uzstÄdÄ«ti e-pasta servera iestatÄ«jumi. Sazinieties ar lapas administratoru. -disable_forgot_password_mail_admin=Kontu atjaunoÅ¡ana ir pieejama tikai, ja ir veikta e-pasta servera iestatÄ«jumu konfigurēšana. NorÄdiet e-pasta servera iestatÄ«jumus, lai iespÄ“jotu kontu atjaunoÅ¡anu. +disable_forgot_password_mail=Konta atkope ir atspÄ“jota, jo nav iestatÄ«ta e-pasta izsÅ«tīšana. LÅ«gums sazinÄties ar vietnes pÄrvaldÄ«tÄju. +disable_forgot_password_mail_admin=Kontu atkope ir pieejama tikai tad, kad ir veikta e-pasta servera iestatīšana. LÅ«gums iestatÄ«t e-pasta serveri, lai varÄ“tu iespÄ“jot kontu atkopi. email_domain_blacklisted=Nav atļauts reÄ£istrÄ“ties ar Å¡Ädu e-pasta adresi. -authorize_application=AutorizÄ“t lietotni -authorize_redirect_notice=JÅ«s tiksiet nosÅ«tÄ«ts uz %s, ja autorizÄ“siet Å¡o lietotni. +authorize_application=Pilnvarot lietotni +authorize_redirect_notice=Notiks pÄrvirzīšana uz %s, ja pilnvaroÅ¡i Å¡o lietotni. authorize_application_created_by=Å o lietotni izveidoja %s. -authorize_application_description=Ja piešķirsiet tiesÄ«bas, tÄ varÄ“s piekļūt un mainÄ«t JÅ«su konta informÄciju, ieskaitot privÄtos repozitorijus un organizÄcijas. -authorize_title=AutorizÄ“t "%s" piekļuvi jÅ«su kontam? -authorization_failed=AutorizÄcija neizdevÄs -authorization_failed_desc=AutentifikÄcija neizdevÄs, jo tika veikts kļūdains pieprasÄ«jums. Sazinieties ar lietojumprogrammas, ar kuru mēģinÄjÄt autentificÄ“ties, uzturÄ“tÄju. +authorize_application_description=Ja nodroÅ¡inÄsi piekļuvi, tÄ varÄ“s piekļūt visai konta informÄcijai un mainÄ«t to, tajÄ skaitÄ privÄtÄs glabÄtavas un apvienÄ«bas. +authorize_title=Pilnvarot "%s" piekļuvi Tavam kontam? +authorization_failed=PilnvaroÅ¡ana neizdevÄs +authorization_failed_desc=PilnvaroÅ¡ana neizdevÄs, jo tika noteikts nederÄ«gs pieprasÄ«jums. LÅ«gums sazinÄties ar lietotnes, no kuras tika veikts pilnvaroÅ¡anas pieprasÄ«jums, uzturÄ“tÄju. sspi_auth_failed=SSPI autentifikÄcija neizdevÄs -password_pwned=IzvÄ“lÄ“tÄ parole ir nozagto paroļu sarakstÄ, kas iepriekÅ¡ ir atklÄts publiskÄs datu noplÅ«dÄ“s. LÅ«gums mēģinÄt vÄ“lreiz ar citu paroli un apsvÄ“rt to nomainÄ«t arÄ« citur. +password_pwned=IzvÄ“lÄ“tÄ parole ir nozagto paroļu sarakstÄ, kas iepriekÅ¡ ir atklÄts pieejamÄs datu noplÅ«dÄ“s. LÅ«gums mēģinÄt vÄ“lreiz ar citu paroli un apsvÄ“rt to nomainÄ«t arÄ« citur. password_pwned_err=NeizdevÄs pabeigt pieprasÄ«jumu uz HaveIBeenPwned +back_to_sign_in = Atpakaļ uz pieteikÅ¡anos +unauthorized_credentials = PieteikÅ¡anÄs dati ir nepareizi vai ir izbeiguÅ¡ies. JÄizpilda komanda atkÄrtoti vai jÄizmanto %s, lai iegÅ«tu vairÄk informÄcijas +hint_login = Jau ir konts? Pieteikties. +last_admin = Nevar noņemt pÄ“dÄ“jo pÄrvaldÄ«tÄju. Ir jÄbÅ«t vismaz vienam pÄrvaldÄ«tÄjam. +change_unconfirmed_email_error = Nebija iespÄ“jams nomainÄ«t e-pasta adresi: %v +hint_register = NepiecieÅ¡ams konts? ReÄ£istrÄ“ties. +sign_up_button = ReÄ£istrÄ“ties. +use_onetime_code = Izmantot vienreiz izmantojamu kodu +change_unconfirmed_email_summary = NomainÄ«t e-pasta adresi, uz kuru sÅ«tÄ«t aktivēšanas e-pasta ziņojumu. +change_unconfirmed_email = Ja reÄ£istrēšanÄs laikÄ tika iesniegta nepareiza e-pasta addrese, to zemÄk var nomainÄ«t, un apstiprinÄjums tiks nosÅ«tÄ«ts uz jauno adresi. +sign_in_openid = TurpinÄt ar OpenID [mail] -view_it_on=AplÅ«kot %s -reply=vai atbildiet uz e-pastu -link_not_working_do_paste=Ja saite nestrÄdÄ, mēģiniet to nokopÄ“t un atvÄ“rt pÄrlÅ«kÄ. -hi_user_x=Sveiki %s, +view_it_on=ApskatÄ«t to %s +reply=vai jÄatbild uz Å¡o e-pasta ziņojumu +link_not_working_do_paste=Saite nedarbojas? JÄmēģina tÄ ievietot starpliktuvÄ“ un ielÄ«mÄ“t pÄrlÅ«ka adreÅ¡u joslÄ. +hi_user_x=Sveiciens, %s! -activate_account=LÅ«dzu, aktivizÄ“jiet savu kontu +activate_account=LÅ«gums aktivÄ“t savu kontu activate_account.title=%s, aktivizÄ“jiet savu kontu -activate_account.text_1=Sveiki %[1]s, esat reÄ£istrÄ“jies %[2]s! -activate_account.text_2=Nospiediet uz saites, lai aktivizÄ“tu savu kontu lapÄ %s: +activate_account.text_1=Sveiciens, %[1]s! Paldies par reÄ£istrēšanos %[2]s! +activate_account.text_2=JÄklikšķina uz šīs saites, lai aktivÄ“tu savu %s kontu: -activate_email=Apstipriniet savu e-pasta adresi +activate_email=Apliecini savu e-pasta adresi activate_email.title=%s, apstipriniet savu e-pasta adresi -activate_email.text=Nospiediet uz saites, lai apstiprinÄtu savu e-pasta adresi lapÄ %s: +activate_email.text=LÅ«gums klikšķinÄt uz šīs saites, lai apliecinÄtu savu e-pasta adresi %s: register_notify=Laipni lÅ«dzam %s register_notify.title=%[1]s, esat reÄ£istrÄ“jies %[2]s -register_notify.text_1=Å¡is ir reÄ£istrÄcijas apstiprinÄjuma e-pasts lapai %s! -register_notify.text_2=Tagad varat autorizÄ“ties ar lietotÄja vÄrdu: %s. -register_notify.text_3=Ja Å¡is konts Jums tika izveidots, tad obligÄti nomainiet citu paroli. +register_notify.text_1=Å is ir apstiprinÄjuma e-pasta ziņojums reÄ£istrÄcijai %s. +register_notify.text_2=Tagad var pieteikties ar savu lietotÄjvÄrdu: %s +register_notify.text_3=Ja Å¡o kontu izveidoja kÄds cits, vispirms ir nepiecieÅ¡ams iestatÄ«t savu paroli. reset_password=AtgÅ«t kontu reset_password.title=%s, esat pieprasÄ«jis atjaunot savu kontu -reset_password.text=Nospiediet uz saites, lai atjaunotu savu kontu lapÄ %s: +reset_password.text=LÅ«gums klikšķinÄt uz šīs saites, lai atjaunotu savu %s kontu: -register_success=VeiksmÄ«ga reÄ£istrÄcija +register_success=ReÄ£istrÄcija bija sekmÄ«ga -issue_assigned.pull=@%[1]s piešķīra jums izmaiņu pieprasÄ«jumu %[2]s repozitorijÄ %[3]s. -issue_assigned.issue=@%[1]s piešķīra jums problÄ“mu %[2]s repozitorijÄ %[3]s. +issue_assigned.pull=@%[1]s piešķīra izmaiņu pieprasÄ«jumu %[2]s glabÄtavÄ %[3]s. +issue_assigned.issue=@%[1]s piešķīra pieteikumu %[2]s glabÄtavÄ %[3]s. -issue.x_mentioned_you=@%s pieminÄ“ja JÅ«s: -issue.action.force_push=%[1]s veica piespiedu izmaiņu iesÅ«tīšanu atzarÄ %[2]s no revÄ«zijas %[3]s uz %[4]s. -issue.action.push_1=@%[1]s iesÅ«tÄ«ja %[3]d revÄ«ziju atzarÄ %[2]s -issue.action.push_n=@%[1]s iesÅ«tÄ«ja %[3]d revÄ«zijas atzarÄ %[2]s +issue.x_mentioned_you=@%s pieminÄ“ja Tevi: +issue.action.force_push=%[1]s uzspiesti aizgÄdÄja izmaiņas %[2]s no %[3]s uz %[4]s. +issue.action.push_1=@%[1]s aizgÄdÄja %[3]d iesÅ«tÄ«jumu uz %[2]s +issue.action.push_n=@%[1]s aizgÄdÄja %[3]d iesÅ«tÄ«jumus uz %[2]s issue.action.close=@%[1]s aizvÄ“ra #%[2]d. issue.action.reopen=@%[1]s atkÄrtoti atvÄ“ra #%[2]d. -issue.action.merge=@%[1]s sapludinÄja #%[2]d atzarÄ %[3]s. +issue.action.merge=@%[1]s iekļÄva #%[2]d zarÄ %[3]s. issue.action.approve=@%[1]s apstiprinÄja izmaiņu pieprasÄ«jumu. issue.action.reject=@%[1]s pieprasÄ«ja izmaiņas Å¡ajÄ izmaiņu pieprasÄ«jumÄ. -issue.action.review=@%[1]s komentÄ“ja Å¡o izmaiņu pieprasÄ«jumu. -issue.action.review_dismissed=@%[1]s atmeta pÄ“dÄ“jo %[2]s recenziju Å¡im izmaiņu pieprasÄ«jumam. -issue.action.ready_for_review=@%[1]s atzÄ«mÄ“ja Å¡o izmaiņu pieprasÄ«jumu, ka tas ir gatavs recenzēšanai. +issue.action.review=@%[1]s pievienoja piebildi Å¡im izmaiņu pieprasÄ«jumam. +issue.action.review_dismissed=@%[1]s atmeta pÄ“dÄ“jo šī izmaiņu pieprasÄ«juma izskatīšanu no %[2]s. +issue.action.ready_for_review=@%[1]s atzÄ«mÄ“ja Å¡o izmaiņu pieprasÄ«jumu kÄ gatavu izskatīšanai. issue.action.new=@%[1]s izveidoja #%[2]d. issue.in_tree_path=CeÄ¼Ä %s: -release.new.subject=Jauns laidiens %s repozitorijÄ %s -release.new.text=@%[1]s izveidoja jaunu laidienu %[2]s repozitorijÄ %[3]s +release.new.subject=Jauns laidiens %s glabÄtavÄ %s +release.new.text=@%[1]s izveidoja jaunu laidienu %[2]s glabÄtavÄ %[3]s release.title=Nosaukums: %s release.note=PiezÄ«mes: release.downloads=LejupielÄdes: -release.download.zip=Izejas kods (ZIP) -release.download.targz=Izejas kods (TAR.GZ) +release.download.zip=Pirmkods (ZIP) +release.download.targz=Pirmkods (TAR.GZ) -repo.transfer.subject_to=%s vÄ“las pÄrsÅ«tÄ«t repozitoriju "%s" organizÄcijai %s -repo.transfer.subject_to_you=`%s vÄ“las Jums pÄrsÅ«tÄ«t repozitoriju "%s"` -repo.transfer.to_you=Jums -repo.transfer.body=Ja vÄ“laties to noraidÄ«t vai apstiprinÄt, tad apmeklÄ“jiet saiti %s. +repo.transfer.subject_to=%s vÄ“las nodot glabÄtavu "%s" %s +repo.transfer.subject_to_you=%s vÄ“las nodot glabÄtavu "%s" +repo.transfer.to_you=Tev +repo.transfer.body=Lai to pieņemtu vai noraidÄ«tu, jÄapmeklÄ“ %s vai arÄ« vienkÄrÅ¡i var neņemt to vÄ“rÄ. -repo.collaborator.added.subject=%s pievienoja JÅ«s repozitorijam %s -repo.collaborator.added.text=JÅ«s tikÄt pievienots kÄ lÄ«dzstrÄdnieks repozitorijam: +repo.collaborator.added.subject=%s pievienoja Tevi glabÄtavai %s kÄ lÄ«dzdalÄ«bnieku +repo.collaborator.added.text=Tevi pievienoja kÄ lÄ«dzdalÄ«bnieku glabÄtavÄ: -team_invite.subject=%[1]s uzaicinÄja JÅ«s pievienoties organizÄcijai %[2]s -team_invite.text_1=%[1]s uzaicinÄja JÅ«s pievienoties komandai %[2]s organizÄcijÄ %[3]s. -team_invite.text_2=Uzspiediet uz šīs saites, lai pievienoties komandai: -team_invite.text_3=PiezÄ«me: Å is uzaicinÄjums ir paredzÄ“ts %[1]s. Ja uzskatÄt, ka tas nav domÄts Jums, varat ignorÄ“t Å¡o e-pastu. +team_invite.subject=%[1]s uzaicinÄja pievienoties apvienÄ«bai %[2]s +team_invite.text_1=%[1]s uzaicinÄja pievienoties apvienÄ«bas %[3] komandai %[2]s. +team_invite.text_2=LÅ«gums klikšķinÄt uz sekojoÅ¡Äs saites, lai pievienotos komandai: +team_invite.text_3=PiezÄ«me: Å¡is uzaicinÄjums ir paredzÄ“ts %[1]s. Ja Å¡is ielÅ«gums netika gaidÄ«ts, Å¡o e-pasta ziņojumu var neņemt vÄ“rÄ. +totp_enrolled.subject = Ir aktivÄ“ts TOTP kÄ divpakÄpju pieteikÅ¡anÄs veids +account_security_caution.text_1 = Ja tas biji Tu, tad Å¡o e-pasta ziņojumu var droÅ¡i neņemt vÄ“rÄ. +account_security_caution.text_2 = Ja tas nebiji Tu, TavÄ kontÄ var bÅ«t veiktas ļaunprÄtÄ«gas darbÄ«bas. LÅ«gums sazinÄties ar šīs vietnes pÄrvaldÄ«tÄjiem. +totp_enrolled.text_1.no_webauthn = Kontam tikko tika iespÄ“jota TOTP. Tas nozÄ«mÄ“, ka visÄs turpmÄkajÄs pieteikÅ¡anÄs kontÄ reizÄ“s bÅ«s jÄizmanto TOTP kÄ divpakÄpju pieteikÅ¡anÄs veids. +totp_enrolled.text_1.has_webauthn = Kontam tikko tika iespÄ“jota TOTP. Tas nozÄ«mÄ“, ka visÄs turpmÄkajÄs pieteikÅ¡anÄs kontÄ reizÄ“s varÄ“s izmantot TOTP kÄ divpakÄpju pieteikÅ¡anÄs veidu vai izmantot jebkuru no savÄm drošības atslÄ“gÄm. +admin.new_user.user_info = InformÄcija par lietotÄju +admin.new_user.text = LÅ«gums klikšķinÄt Å¡eit, lai pÄrvaldÄ«tu Å¡o lietotÄju pÄrvaldīšanas panelÄ«. +password_change.subject = Tika nomainÄ«ta parole +primary_mail_change.text_1 = Konta galvenÄ e-pasta adrese tikko tika nomainÄ«ta uz %[1]s. Tas nozÄ«mÄ“, ka Å¡ajÄ e-pasta adresÄ“ vairs netiks saņemti e-pasta paziņojumi par kontu. +primary_mail_change.subject = Tika nomainÄ«ta galvenÄ e-pasta adrese +totp_disabled.subject = TOTP tika atspÄ“jota +admin.new_user.subject = Tikko reÄ£istrÄ“jÄs jauns lietotÄjs %s +password_change.text_1 = Tikko tika nomainÄ«t konta parole. +totp_disabled.text_1 = KontÄ tikko tika iespÄ“jota laikÄ balstÄ«ta vienreiz izmantojama parole (TOTP). +totp_disabled.no_2fa = Vairs nav citu konfigurÄ“tu 2FA veidu, kas nozÄ«mÄ“, ka vairs nav nepiecieÅ¡ams pieteikties savÄ kontÄ ar 2FA. +removed_security_key.subject = Tika noņemta drošības atslÄ“ga +removed_security_key.text_1 = No konta tikko kÄ tika noņemta drošības atslÄ“ga "%[1]s". +removed_security_key.no_2fa = Vairs nav neviena cita konfigurÄ“ta 2FA veida, kas nozÄ«mÄ“, ka vairs nav nepiecieÅ¡ams pieteikties savÄ kontÄ ar 2FA. [modal] yes=JÄ @@ -499,112 +581,127 @@ modify=AtjauninÄt [form] UserName=LietotÄjvÄrds -RepoName=Repozitorija nosaukums +RepoName=GlabÄtavas nosaukums Email=E-pasta adrese Password=Parole -Retype=Apstipriniet paroli +Retype=ApstiprinÄt paroli SSHTitle=SSH atslÄ“gas nosaukums HttpsUrl=HTTPS URL PayloadUrl=VÄ“rtuma URL TeamName=Komandas nosaukums -AuthName=AutorizÄcijas nosaukums -AdminEmail=Admin e-pasta adrese +AuthName=PilnvaroÅ¡anas nosaukums +AdminEmail=PÄrvaldÄ«tÄja e-pasta adrese -NewBranchName=Jauna atzara nosaukums -CommitSummary=RevÄ«zijas kopsavilkums -CommitMessage=RevÄ«zijas ziņojums -CommitChoice=RevÄ«zijas izvÄ“le -TreeName=Faila ceļš +NewBranchName=Jaunais zara nosaukums +CommitSummary=IesÅ«tÄ«juma kopsavilkums +CommitMessage=IesÅ«tÄ«juma ziņojums +CommitChoice=IesÅ«tÄ«juma izvÄ“le +TreeName=Datnes ceļš Content=Saturs SSPISeparatorReplacement=AtdalÄ«tÄjs SSPIDefaultLanguage=NoklusÄ“juma valoda require_error=` nedrÄ«kst bÅ«t tukÅ¡s.` -alpha_dash_error=` drÄ«kst saturÄ“t tikai latīņu alfabÄ“ta burtus, ciparus vai domuzÄ«mes (-_).` -alpha_dash_dot_error=` drÄ«kst saturÄ“t tikai latīņu alfabÄ“ta burtus, ciparus, domuzÄ«mes (-_) vai punktu.` -git_ref_name_error=` jÄbÅ«t korektam git references nosaukumam.` -size_error=` jÄbÅ«t %s simbolus garam.` -min_size_error=` jabÅ«t vismaz %s simbolu garumÄ.` -max_size_error=` jabÅ«t ne mazÄk kÄ %s simbolu garumÄ.` +alpha_dash_error=` drÄ«kst sastÄvÄ“t tikai no burtiem un cipariem, domuzÄ«mÄ“m ("-") un apakÅ¡svÄ«trÄm ("_").` +alpha_dash_dot_error=` drÄ«kst sastÄvÄ“t tikai no burtiem un cipariem, domuzÄ«mÄ“m ('-'), apakÅ¡svÄ«trÄm ('_') un punktiem ('.').` +git_ref_name_error=` jÄbÅ«t pareizam Git atsauces nosaukumam.` +size_error=` jÄbÅ«t %s rakstzÄ«mes garam.` +min_size_error=` jÄsatur vismaz %s rakstzÄ«mes.` +max_size_error=` jÄsatur ne vairÄk kÄ %s rakstzÄ«mes.` email_error=` nav derÄ«ga e-pasta adrese.` -url_error=`"%s" nav korekts URL.` +url_error=`"%s" nav derÄ«gs URL.` include_error=` ir jÄsatur tekstu "%s".` -glob_pattern_error=` glob Å¡ablons nav korekts: %s.` -regex_pattern_error=` regulÄrÄ izteiksme nav korekta: %s.` -username_error=` drÄ«kst saturÄ“t tikai burtus un ciparus ('0-9','a-z','A-Z'), domuzÄ«me ('-'), apakÅ¡svÄ«tra ('_') un punkts ('.'). Nevar sÄkties vai beigties ar simbolu, kas nav burts vai skaitlis, kÄ arÄ« nevar bÅ«t vairÄki simboli pÄ“c kÄrtas, kas nav burti vai skaitļi.` -invalid_group_team_map_error=` sasaiste nav korekta: %s` +glob_pattern_error=` glob paraugs nav derÄ«gs: %s.` +regex_pattern_error=` regulÄrÄ izteiksme nav derÄ«ga: %s.` +username_error=` drÄ«kst sastÄvÄ“t tikai no burtiem un cipariem ("0-9", "a-z", "A-Z"), domuzÄ«mÄ“m ("-"), apakÅ¡svÄ«trÄm ("_") un punktiem ("."). Tas nevar sÄkties vai beigties ar rakstzÄ«mi, kas nav burts vai cipars, kÄ arÄ« nav atļautas vairÄkas secÄ«gas rakstzÄ«mes, kas nav burti vai cipari.` +invalid_group_team_map_error=` sasaiste nav derÄ«ga: %s` unknown_error=NezinÄma kļūda: captcha_incorrect=IevadÄ«ts nepareizs drošības kods. password_not_match=IzvÄ“lÄ“tÄ parole nesakrÄ«t ar atkÄrtoti ievadÄ«to. -lang_select_error=IzvÄ“lieties valodu no saraksta. +lang_select_error=AtlasÄ«t valodu no saraksta. username_been_taken=LietotÄjvÄrds jau ir aizņemts. -username_change_not_local_user=Ne-lokÄlie lietotÄji nevar mainÄ«t savus lietotÄjvÄrdus. +username_change_not_local_user=Ä€rÄ“jie lietotÄji nevar mainÄ«t savu lietotÄjvÄrdu. username_has_not_been_changed=LietotÄjvÄrds netika mainÄ«ts -repo_name_been_taken=Jau eksistÄ“ repozitorijs ar Å¡Ädu nosaukumu. -repository_force_private=Ir ieslÄ“gts piespiedu privÄtais režīms: repozitorijus nav iespÄ“jams padarÄ«t publiskus. -repository_files_already_exist=Å Ä« repozitorija faili jau eksistÄ“, sazinieties ar sistÄ“mas administratoru. -repository_files_already_exist.adopt=Å Ä« repozitorija faili jau eksistÄ“ un var tikt tikai pÄrņemti. -repository_files_already_exist.delete=Å Ä« repozitorija faili jau eksistÄ“, nepiecieÅ¡ams tos dzÄ“st. -repository_files_already_exist.adopt_or_delete=Å Ä« repozitorija faili jau eksistÄ“, tie ir jÄpÄrņem vai jÄdzēš. +repo_name_been_taken=GlabÄtavas nosaukums jau tiek izmantots. +repository_force_private=IespÄ“jots "Uzspiest privÄtÄs": privÄtÄs glabÄtavas nevar padarÄ«t pieejamas visiem. +repository_files_already_exist=Å ajÄ glabÄtavÄ jau atrodas datnes. JÄsazinÄs ar sistÄ“mas pÄrvaldÄ«tÄju. +repository_files_already_exist.adopt=Å ajÄ glabÄtavÄ jau atrodas datnes, un tÄs var tikai tikt pieņemtas. +repository_files_already_exist.delete=Å ajÄ glabÄtavÄ jau atrodas datnes. TÄs ir jÄizdzēš. +repository_files_already_exist.adopt_or_delete=Å ajÄ glabÄtavÄ jau atrodas datnes. Vai nu tÄs ir jÄpieņem vai jÄizdzēš. visit_rate_limit=AttÄlinÄtÄ piekļuve ir ierobežota ar Ätruma ierobežotÄju. -2fa_auth_required=AttÄlinÄtai piekļuvei ir nepiecieÅ¡ama divu faktoru autentifikÄcija. -org_name_been_taken=OrganizÄcijas nosaukums jau ir aizņemts. +2fa_auth_required=AttÄlinÄtai piekļuvei ir nepiecieÅ¡ama divpakÄpju pieteikÅ¡anÄs. +org_name_been_taken=ApvienÄ«bas nosaukums jau ir aizņemts. team_name_been_taken=Komandas nosaukums jau ir aizņemts. team_no_units_error=Komandai ir jÄbÅ«t iespÄ“jotai vismaz vienai sadaļai. -email_been_used=E-pasta adrese jau ir izmantota. -email_invalid=Epasta adrese nav korekta. +email_been_used=E-pasta adrese jau tiek izmantota. +email_invalid=E-pasta adrese nav derÄ«ga. openid_been_used=OpenID adrese "%s" jau ir izmantota. username_password_incorrect=Nepareizs lietotÄjvÄrds vai parole. password_complexity=Parole neatbilst drošības prasÄ«bÄm: password_lowercase_one=Vismaz viens mazais burts password_uppercase_one=Vismaz viens lielais burts password_digit_one=Vismaz viens cipars -password_special_one=Vismaz viens speciÄlais simbols (punkts, iekavas, pÄ“diņas utt.) -enterred_invalid_repo_name=PÄrliecinieties, vai ievadÄ«tÄ repozitorija nosaukums ir pareizs. -enterred_invalid_org_name=IevadÄ«tais organizÄcijas nosaukums ir nepareizs. -enterred_invalid_owner_name=PÄrliecinieties, vai ievadÄ«tÄ Ä«paÅ¡nieka vÄrds ir pareizs. -enterred_invalid_password=PÄrliecinieties, vai ievadÄ«tÄ parole ir pareiza. -user_not_exist=LietotÄjs neeksistÄ“. -team_not_exist=Komanda neeksistÄ“. -last_org_owner=Nevar noņemt pÄ“dejo lietotÄju no Ä«paÅ¡nieku komandas. OrganizÄcijai ir jÄbÅ«t vismaz vienam Ä«paÅ¡niekam. -cannot_add_org_to_team=OrganizÄciju nevar pievienot kÄ komandas biedru. -duplicate_invite_to_team=LietotÄjs jau ir uzaicinÄts kÄ komandas biedrs. -organization_leave_success=JÅ«s esat pametis organizÄciju %s. +password_special_one=Vismaz viena Ä«paÅ¡a rakstzÄ«me (punkts, iekavas, pÄ“diņas utt.) +enterred_invalid_repo_name=IevadÄ«tais glabÄtavas nosaukums ir nepareizs. +enterred_invalid_org_name=IevadÄ«tais apvienÄ«bas nosaukums ir nepareizs. +enterred_invalid_owner_name=JaunÄ Ä«paÅ¡nieka vÄrds nav derÄ«gs. +enterred_invalid_password=IevadÄ«tÄ parole ir nepareiza. +user_not_exist=LietotÄjs nepastÄv. +team_not_exist=Komanda nepastÄv. +last_org_owner=Nevar noņemt Ä«paÅ¡nieku komandas pÄ“dÄ“jo lietotÄju. ApvienÄ«bai ir jÄbÅ«t vismaz vienam Ä«paÅ¡niekam. +cannot_add_org_to_team=ApvienÄ«bu nevar pievienot kÄ komandas dalÄ«bnieku. +duplicate_invite_to_team=LietotÄjs jau tika uzaicinÄts kÄ komandas dalÄ«bnieks. +organization_leave_success=Ir veiksmÄ«gi atstÄta apvienÄ«ba %s. invalid_ssh_key=Nav iespÄ“jams pÄrbaudÄ«t SSH atslÄ“gu: %s invalid_gpg_key=Nav iespÄ“jams pÄrbaudÄ«t GPG atslÄ“gu: %s invalid_ssh_principal=Kļūdaina identitÄte: %s -must_use_public_key=AtslÄ“ga, ko norÄdÄ«jÄt ir privÄtÄ atslÄ“ga. Nekad nenodotiet savu privÄtu atslÄ“gu nevienam. Izmantojiet publisko atslÄ“gu. -unable_verify_ssh_key=SSH atslÄ“gu nav iespÄ“jams pÄrbaudÄ«t, pÄrliecinieties, ka tajÄ nav kļūdu. -auth_failed=AutentifikÄcija neizdevÄs: %v +must_use_public_key=NorÄdÄ«tÄ atslÄ“ga ir privÄtÄ atslÄ“ga. LÅ«gums nekur neaugÅ¡upielÄdÄ“t savu privÄto atslÄ“gu. JÄizmanto sava publiskÄ atslÄ“ga. +unable_verify_ssh_key=SSH atslÄ“gu nav iespÄ“jams apliecinÄt. KÄrtÄ«gi jÄpÄrbauda, vai nav pieļautas kļūdas. +auth_failed=AutentificēšanÄs neizdevÄs: %v -still_own_repo=Å is konts ir vismaz viena repozitorija Ä«paÅ¡nieks, tos sÄkumÄ ir nepiecieÅ¡ams izdzÄ“st vai mainÄ«t to Ä«paÅ¡nieku. -still_has_org=JÅ«su konts ir piesaistÄ«ts vismaz vienai organizÄcijai, sÄkumÄ nepiecieÅ¡ams to pamest. -still_own_packages=JÅ«su kontam pieder viena vai vairÄkas pakotnes, tÄs nepiecieÅ¡ams izdzÄ“st. -org_still_own_repo=OrganizÄcijai pieder repozitoriji, tos sÄkumÄ ir nepiecieÅ¡ams izdzÄ“st vai mainÄ«t to Ä«paÅ¡nieku. -org_still_own_packages=Å ai organizÄcijai pieder viena vai vÄrÄkas pakotnes, tÄs nepiecieÅ¡ams izdzÄ“st. +still_own_repo=Kontam pieder vismaz viena vai vairÄkas glabÄtavas, tÄs vispirms ir jÄizdzēš vai jÄnodod kÄdam. +still_has_org=Konts ir vienas vai vairÄku apvienÄ«bu dalÄ«bnieks, vispirms tÄs ir jÄpamet. +still_own_packages=Kontam pieder viena vai vairÄkas pakotnes, tÄs vispirms ir jÄizdzēš. +org_still_own_repo=ApvienÄ«bai joprojÄm pieder viena vai vairÄkas glabÄtavas, tÄs vispirms ir jÄizdzēš vai jÄnodod kÄdam. +org_still_own_packages=Å ai apvienÄ«bai joprojÄm pieder viena vai vairÄkas pakotnes, tÄs vispirms ir jÄizdzēš. -target_branch_not_exist=MÄ“rÄ·a atzars neeksistÄ“ +target_branch_not_exist=MÄ“rÄ·a zars nepastÄv. +username_error_no_dots = ` var saturÄ“t tikai ciparus un burtus ("0-9", "a-z", "A-Z"), domuzÄ«mi ("-") un apakÅ¡svÄ«tru ("_"). Tas nevar sÄkties vai beigties ar rakstzÄ«mi, kas nav cipars vai burts, un ir aizliegti arÄ« vairÄkas secÄ«gas rakstzÄ«mes, kas nav cipari vai burti.` +required_prefix = IevadÄ«tajai vÄ“rtÄ«bai jÄsÄkas ar "%s" +admin_cannot_delete_self = Nevar izdzÄ“st savu kontu bÅ«dams pÄrvaldÄ«tÄjs. LÅ«gums vispirms noņemt savas pÄrvaldÄ«tÄja tiesÄ«bas. +unset_password = Pieteicies lietotÄjs nav iestatÄ«jis paroli. +unsupported_login_type = PieteikÅ¡anÄs veids nenodroÅ¡ina konta izdzēšanu. +Description = Apraksts +Pronouns = VientiekvÄrdi +FullName = Pilns vÄrds +Location = AtraÅ¡anÄs vieta +Biography = DzÄ«ves un darbÄ«bas apraksts +Website = TÄ«mekļvietne +AccessToken = Piekļuves pilnvara +To = Zara nosaukums +username_claiming_cooldown = Å o lietotÄjvÄrdu vÄ“l nevar izmantot, jo tÄ noilgums vÄ“l nav beidzies. To varÄ“s izmantot %[1]s. +email_domain_is_not_allowed = LietotÄja e-pasta adreses %s domÄ“na vÄrds ir pretrunÄt ar EMAIL_DOMAIN_ALLOWLIST vai EMAIL_DOMAIN_BLOCKLIST. JÄpÄrliecinÄs, ka e-pasta adrese ir norÄdÄ«ta pareizi. [user] change_avatar=MainÄ«t profila attÄ“lu… joined_on=PievienojÄs %s -repositories=Repozitoriji -activity=PubliskÄ aktivitÄte +repositories=GlabÄtavas +activity=AtklÄti notikumi followers_few=%d sekotÄji -starred=AtzÄ«mÄ“ti repozitoriji -watched=VÄ“rotie repozitoriji +starred=Izlasei pievienotÄs glabÄtavas +watched=VÄ“rotÄs glabÄtavas code=Kods projects=Projekti overview=PÄrskats following_few=%d seko follow=Sekot -unfollow=Nesekot -user_bio=BiogrÄfija -disabled_public_activity=Å is lietotÄjs ir atslÄ“dzies iespÄ“ju aplÅ«kot tÄ aktivitÄti. +unfollow=PÄrtraukt sekot +user_bio=Apraksts par sevi +disabled_public_activity=Å is lietotÄjs ir atspÄ“jojis darbÄ«bu redzamÄ«bu visiem. email_visibility.limited=E-pasta adrese ir redzama visiem autentificÄ“tajiem lietotÄjiem email_visibility.private=E-pasta adrese ir redzama tikai administratoriem show_on_map=RÄdÄ«t Å¡o vietu kartÄ“ @@ -612,7 +709,26 @@ settings=LietotÄja iestatÄ«jumi form.name_reserved=LietotÄjvÄrdu "%s" nedrÄ«kst izmantot. form.name_pattern_not_allowed=LietotÄjvÄrds "%s" nav atļauts. -form.name_chars_not_allowed=LietotÄja vÄrds "%s" satur neatļautus simbolus. +form.name_chars_not_allowed=LietotÄja vÄrds "%s" satur nederÄ«gas rakstzÄ«mes. +followers.title.one = SekotÄjs +public_activity.visibility_hint.admin_private = Å Ä« darbÄ«ba ir redzam tikai Tev, jo Tu esi pÄrvaldÄ«tÄjs, bet lietotÄjs vÄ“las palikt privÄts. +public_activity.visibility_hint.self_private = Tava darbÄ«ba ir redzama tikai Tev un servera pÄrvaldÄ«tÄjiem. KonfigurÄ“t. +block_user.detail = JÄņem vÄ“rÄ, ka lietotÄja liegÅ¡anai ir arÄ« citas blakusparÄdÄ«bas, piemÄ“ram: +block_user.detail_1 = JÅ«s pÄrstÄsiet sekot viens otram un nevarÄ“siet viens otram sekot. +block_user.detail_2 = Å is lietotÄjs nevarÄ“s mijiedarboties ar Tev piederoÅ¡ajÄm glabÄtavÄm vai Tevis izveidotajiem pieteikumiem un piebildÄ“m. +public_activity.visibility_hint.self_public = Tavas darbÄ«bas ir redzamas ikvienam, izņemot mijiedarbÄ«bas privÄtÄs vietÄs. KonfigurÄ“t. +follow_blocked_user = Nevar sekot Å¡im lietotÄjam, jo Tu noliedzi Å¡o lietotÄju vai Å¡is lietotÄjs ir noliedzis Tevi. +block_user.detail_3 = NebÅ«s iespÄ“jams pievienot citam citu kÄ glabÄtavas lÄ«dzdalÄ«bniekus. +block = Noliegt +unblock = Atļaut +public_activity.visibility_hint.admin_public = Å Ä« darbÄ«ba ir redzama ikvienam, bet kÄ pÄrvaldÄ«tÄjs vari redzÄ“t mijiedarbÄ«bas arÄ« privÄtÄs vietÄs. +followers_one = %d sekotÄjs +block_user = Liegt lietotÄju +following_one = seko %d +following.title.few = Seko +public_activity.visibility_hint.self_private_profile = Tavas darbÄ«bas ir redzamas tikai Tev un servera pÄrvaldÄ«tÄjiem, jo Tavs profils ir pirvÄts. KonfigurÄ“t. +followers.title.few = SekotÄji +following.title.one = Seko [settings] profile=Profils @@ -624,154 +740,154 @@ avatar=Profila attÄ“ls ssh_gpg_keys=SSH / GPG atslÄ“gas social=SociÄlie konti applications=Lietotnes -orgs=PÄrvaldÄ«t organizÄcijas -repos=Repozitoriji -delete=DzÄ“st kontu -twofa=Divfaktoru autentifikÄcija +orgs=ApvienÄ«bas +repos=GlabÄtavas +delete=IzdzÄ“st kontu +twofa=DivpakÄpju pieteikÅ¡anÄs (TOTP) account_link=SaistÄ«tie konti -organization=OrganizÄcijas +organization=ApvienÄ«bas uid=UID -webauthn=Drošības atslÄ“gas +webauthn=DivpakÄpju pieteikÅ¡anÄs (drošības atslÄ“gas) -public_profile=Publiskais profils -biography_placeholder=PastÄsti mums mazliet par sevi! (Var izmantot Markdown) +public_profile=Visiem pieejamais profils +biography_placeholder=PastÄsti citiem mazliet par sevi! (Tiek atbalstÄ«ts Markdown) location_placeholder=KopÄ«got savu aptuveno atraÅ¡anÄs vietu ar citiem -profile_desc=NorÄdÄ«t, kÄ profils tiek attÄ“lots citiem lietotÄjiem. PrimÄrÄ e-pasta adrese tiks izmantota paziņojumiem, paroles atjaunoÅ¡anai un Git tÄ«mekļa darbÄ«bÄm. -password_username_disabled=Ne-lokÄliem lietotÄjiem nav atļauts mainÄ«t savu lietotÄja vÄrdu. Sazinieties ar sistÄ“mas administratoru, lai uzzinÄtu sÄ«kÄk. +profile_desc=Par Tevi +password_username_disabled=Ä€rÄ“jiem lietotÄjiem nav atļauts mainÄ«t savu lietotÄjvÄrdu. LÅ«gums sazinÄties ar vietnes pÄrvaldÄ«tÄju, lai uzzinÄtu vairÄk. full_name=Pilns vÄrds -website=MÄjas lapa +website=TÄ«mekļvietne location=AtraÅ¡anÄs vieta -update_theme=MainÄ«t motÄ«vu -update_profile=MainÄ«t profilu +update_theme=MainÄ«t izskatu +update_profile=AtjauninÄt profilu update_language=MainÄ«t valodu update_language_not_found=Valoda "%s" nav pieejama. update_language_success=Valoda tika nomainÄ«ta. -update_profile_success=JÅ«su profila informÄcija tika saglabÄta. +update_profile_success=Profils tika atjauninÄts. change_username=LietotÄjvÄrds mainÄ«ts. change_username_prompt=PiezÄ«me: lietotÄjvÄrda mainīšana maina arÄ« konta URL. -change_username_redirect_prompt=Iepriekšējais lietotÄjvÄrds tiks pÄrvirzÄ«ts, kamÄ“r neviens cits to neizmanto. +change_username_redirect_prompt=Iepriekšējais lietotÄjvÄrds tiks pÄrvirzÄ«ts, lÄ«dz kÄds to izmantos. continue=TurpinÄt cancel=Atcelt language=Valoda ui=MotÄ«vs -hidden_comment_types=AttÄ“lojot paslÄ“pt Å¡auds komentÄrus: -hidden_comment_types_description=KomentÄru veidi, kas atzÄ«mÄ“ti, netiks rÄdÄ«ti problÄ“mas lapÄ. PiemÄ“ram, atzÄ«mÄ“jot "EtiÄ·etes" netiks rÄdÄ«ti komentÄri " pievienoja/noņēma ". -hidden_comment_types.ref_tooltip=KomentÄri, kad problÄ“mai tiek pievienota atsauce uz citu probÄ“mu, komentÄru, … -hidden_comment_types.issue_ref_tooltip=KomentÄri par lietotÄja izmaiņÄm ar problÄ“mas saistÄ«to atzaru/tagu +hidden_comment_types=SlÄ“pjamo piebilžu veidi +hidden_comment_types_description=Å eit atzÄ«mÄ“tie piebilžu veidi netiks attÄ“loti pieteikumu lapÄs. "IezÄ«me" atzÄ«mēšana, piemÄ“ram, noņems visas " pievienoja/noņēma " piebildes. +hidden_comment_types.ref_tooltip=Piebildes, kurÄs ir atsauces uz Å¡o pieteikumu no cita pieteikuma/iesÅ«tÄ«juma/… +hidden_comment_types.issue_ref_tooltip=Piebildes, kurÄs lietotÄjs maina ar pieteikumu saistÄ«tu zaru/birku comment_type_group_reference=Atsauces -comment_type_group_label=EtiÄ·etes +comment_type_group_label=IezÄ«me comment_type_group_milestone=Atskaites punktus comment_type_group_assignee=AtbildÄ«gos comment_type_group_title=Nosaukuma izmaiņas -comment_type_group_branch=Atzara izmaiņas -comment_type_group_time_tracking=Laika uzskaiti +comment_type_group_branch=Zars +comment_type_group_time_tracking=Laika uzskaitīšana comment_type_group_deadline=Termiņus comment_type_group_dependency=AtkarÄ«bas -comment_type_group_lock=SlÄ“gÅ¡anas maiņu -comment_type_group_review_request=Izmaiņu pieprasÄ«jumus -comment_type_group_pull_request_push=PievienotÄs revÄ«zijas -comment_type_group_project=Projektus -comment_type_group_issue_ref=ProblÄ“mu atsauces -saved_successfully=IestatÄ«jumi tika veiksmÄ«gi saglabati. +comment_type_group_lock=AizslÄ“gÅ¡anas stÄvoklis +comment_type_group_review_request=Izskatīšanas pieprasÄ«jums +comment_type_group_pull_request_push=Pievienotie iesÅ«tÄ«jumi +comment_type_group_project=Projekts +comment_type_group_issue_ref=Pieteikumu atsauces +saved_successfully=IestatÄ«jumi tika sekmÄ«gi saglabÄti. privacy=PrivÄtums keep_activity_private=Profila lapÄ paslÄ“pt notikumus keep_activity_private_popup=Savu aktivitÄti redzÄ“siet tikai JÅ«s un administratori -lookup_avatar_by_mail=MeklÄ“t profila bildes pÄ“c e-pasta +lookup_avatar_by_mail=UzmeklÄ“t profila attÄ“lus pÄ“c e-pasta adreses federated_avatar_lookup=Apvienotais profila bilžu meklÄ“tÄjs -enable_custom_avatar=IespÄ“jot mainÄmu profila attÄ“lu +enable_custom_avatar=Izmantot pielÄgotu profila attÄ“lu choose_new_avatar=IzvÄ“lÄ“ties jaunu profila attÄ“lu -update_avatar=SaglabÄt profila bildi -delete_current_avatar=DzÄ“st paÅ¡reizÄ“jo profila bildi -uploaded_avatar_not_a_image=AugÅ¡upielÄdÄ“tais fails nav attÄ“ls. -uploaded_avatar_is_too_big=AugÅ¡upielÄdÄ“tÄ faila izmÄ“rs (%d KiB) pÄrsniedz pieļaujamo izmÄ“ru (%d KiB). +update_avatar=AtjauninÄt attÄ“lu +delete_current_avatar=IzdzÄ“st paÅ¡reizÄ“jo attÄ“lu +uploaded_avatar_not_a_image=AugÅ¡upielÄdÄ“tÄ datne nav attÄ“ls. +uploaded_avatar_is_too_big=AugÅ¡upielÄdÄ“tÄs datnes izmÄ“rs (%d KiB) pÄrsniedz pieļaujamo lielumu (%d KiB). update_avatar_success=Profila attÄ“ls tika saglabÄts. -update_user_avatar_success=LietotÄja profila attÄ“ls tika atjaunots. +update_user_avatar_success=LietotÄja profila attÄ“ls tika atjauninÄts. -update_password=MainÄ«t paroli +update_password=AtjauninÄt paroli old_password=PaÅ¡reizÄ“jÄ parole -new_password=Jauna parole +new_password=JaunÄ parole retype_new_password=ApstiprinÄt jauno paroli password_incorrect=IevadÄ«ta nepareiza paÅ¡reizÄ“jÄ parole. -change_password_success=Parole tika veiksmÄ«gi nomainÄ«ta. Tagad varat pieteikties ar jauno paroli. -password_change_disabled=Ä€rÄ“jie konti nevar mainÄ«t paroli, izmantojot, Forgejo saskarni. +change_password_success=Parole tika atjauninÄta. TurpmÄk jÄizmanto sava jaunÄ parole, lai pieteiktos. +password_change_disabled=Ä€rÄ“jie lietotÄji nevar mainÄ«t savu paroli Forgejo tÄ«mekļa saskarnÄ“. emails=E-pasta adreses manage_emails=PÄrvaldÄ«t e-pasta adreses -manage_themes=IzvÄ“lieties noklusÄ“juma motÄ«vu -manage_openid=PÄrvaldÄ«t OpenID adreses -email_desc=PrimÄrÄ e-pasta adrese tiks izmantota paziņojumiem, paroļu atjaunoÅ¡anai un, ja tÄ nav paslÄ“pta, Git tÄ«mekļa darbÄ«bÄm. -theme_desc=Å is bÅ«s noklusÄ“juma motÄ«vs visiem lietotÄjiem. -primary=PrimÄrÄ -activated=AktivizÄ“ts -requires_activation=NepiecieÅ¡ams aktivizÄ“t -primary_email=UzstÄdÄ«t kÄ primÄro -activate_email=NosÅ«tÄ«t aktivizÄcijas e-pastu -activations_pending=Gaida aktivizÄciju -can_not_add_email_activations_pending=Ir nepabeigta aktivizÄcija. PÄ“c dažÄm minÅ«tÄ“m mēģiniet vÄ“lreiz, ja ir vÄ“lme pievienot jaunu e-pasta adresi. +manage_themes=NoklusÄ“juma izskats +manage_openid=OpenID adreses +email_desc=GalvenÄ e-pasta adrese tiks izmantota paziņojumiem, paroļu atkopei un, ja tÄ nav paslÄ“pta, Git tÄ«mekļa darbÄ«bÄm. +theme_desc=Å is izskats tiks izmantots tÄ«mekļa saskarnei pÄ“c pieteikÅ¡anÄs. +primary=GalvenÄ +activated=AktivÄ“ts +requires_activation=NepiecieÅ¡ama aktivēšana +primary_email=PadarÄ«t par galveno +activate_email=NosÅ«tÄ«t aktivēšanas e-pasta ziņojumu +activations_pending=Gaida aktivēšanu +can_not_add_email_activations_pending=Ir nepabeigta aktivēšana. PÄ“c dažÄm minÅ«tÄ“m jÄmēģina vÄ“lreiz, ja ir vÄ“lme pievienot jaunu e-pasta adresi. delete_email=Noņemt -email_deletion=DzÄ“st e-pasta adresi -email_deletion_desc=E-pasta adrese un ar to saistÄ«tÄ informÄcija tiks dzÄ“sta no šī konta. Git revÄ«zijas ar Å¡o e-pasta adresi netiks mainÄ«tas. Vai turpinÄt? -email_deletion_success=E-pasta adrese ir veiksmÄ«gi izdzÄ“sta. -theme_update_success=JÅ«su motÄ«vs tika nomainÄ«ts. -theme_update_error=IzvÄ“lÄ“tais motÄ«vs neeksistÄ“. +email_deletion=Noņemt e-pasta adresi +email_deletion_desc=E-pasta adrese un saistÄ«tÄ informÄcija tiks noņemta no šī konta. Git iesÅ«tÄ«jumi ar Å¡o e-pasta adresi paliks nemainÄ«ti. TurpinÄt? +email_deletion_success=E-pasta adrese tika sekmÄ«gi izdzÄ“sta. +theme_update_success=Izskats tika atjauninÄts. +theme_update_error=AtlasÄ«tais izskats nepastÄv. openid_deletion=DzÄ“st OpenID adresi -openid_deletion_desc=Dzēšot Å¡o OpenID adresi no JÅ«su konta, ar to vairs nebÅ«s iespÄ“jams pieteikties. Vai turpinÄt? +openid_deletion_desc=Å Ä«s OpenID adreses noņemÅ¡ana no konta liegs iespÄ“ju pieteikties ar to. TurpinÄt? openid_deletion_success=OpenID adrese tika noņemta. -add_new_email=Pievienot jaunu e-pasta adresi -add_new_openid=Pievienot jaunu OpenID vietrÄdi +add_new_email=Pievienot e-pasta adresi +add_new_openid=Pievienot jaunu OpenID URI add_email=Pievienot e-pasta adresi add_openid=Pievienot OpenID vietrÄdi -add_email_confirmation_sent=Jauns apstiprinÄÅ¡anas e-pasts tika nosÅ«tÄ«ts uz "%s". PÄrbaudiet savu e-pasta kontu tuvÄko %s laikÄ, lai apstiprinÄtu savu e-pasta adresi. -add_email_success=JÅ«su jaunÄ e-pasta adrese tika veiksmÄ«gi pievienota. -email_preference_set_success=E-pasta izvÄ“le tika veiksmÄ«gi saglabÄta. -add_openid_success=JÅ«su jaunÄ OpenID adrese tika veiksmÄ«gi pievienota. -keep_email_private=PaslÄ“pt e-pasta adresi -keep_email_private_popup=Å is profilÄ paslÄ“ps e-pasta adresi, kÄ arÄ« tad, kad tiks veikts izmaiņu pieprasÄ«jums vai tÄ«mekļa saskarnÄ“ labota datne. AizgÄdÄtie iesÅ«tÄ«jumi netiks pÄrveidoti. RevÄ«zijÄs jÄizmanto %s, lai sasaistÄ«tu tos ar kontu. -openid_desc=JÅ«su OpenID adreses ļauj autorizÄ“ties, izmantojot, JÅ«su izvÄ“lÄ“to pakalpojumu sniedzÄ“ju. +add_email_confirmation_sent=ApstiprinÄÅ¡anas e-pasta ziņojums tika nosÅ«tÄ«ts uz "%s". Lai apstiprinÄtu savu e-pasta adresi, lÅ«gums pÄrbaudÄ«t savu iesÅ«ti un atvÄ“rt nosÅ«tÄ«to saiti nÄkamÄjÄs %s. +add_email_success=JaunÄ e-pasta adrese tika pievienota. +email_preference_set_success=E-pasta izvÄ“le tika sekmÄ«gi iestatÄ«ta. +add_openid_success=JaunÄ OpenID adrese tika pievienota. +keep_email_private=SlÄ“pt e-pasta adresi +keep_email_private_popup=E-pasta adrese netiks rÄdÄ«ta profilÄ un netiks izmantota kÄ noklusÄ“jums iesÅ«tÄ«jumiem, kuri veikti tÄ«mekļa saskarnÄ“, piemÄ“ram, datņu augÅ¡upielÄdes, laboÅ¡anas un apvienoÅ¡anas iesÅ«tÄ«jumi. TÄ vietÄ Ä«paÅ¡a adrese %s var tikt izmantota, lai sasaistÄ«tu iesÅ«tÄ«jumus ar kontu. Å Ä« iespÄ“ja neietekmÄ“s esoÅ¡os iesÅ«tÄ«jumus. +openid_desc=OpenID ļauj uzticÄ“t autentificēšanu ÄrÄ“jam nodroÅ¡inÄtÄjam. manage_ssh_keys=PÄrvaldÄ«t SSH atslÄ“gas manage_ssh_principals=PÄrvaldÄ«t SSH sertifikÄtu identitÄtes manage_gpg_keys=PÄrvaldÄ«t GPG atslÄ“gas add_key=Pievienot atslÄ“gu -ssh_desc=Å Ä«s SSH atslÄ“gas ir piesaistÄ«tas JÅ«su kontam. Ir svarÄ«gi pÄrliecinÄties, ka visas atpazÄ«stat, jo tÄs ļauj piekļūt JÅ«su repozitorijiem. -principal_desc=Å Ädas SSH sertifikÄtu identitiÄtes ir piesaistÄ«tas kontam un ar tÄm iespÄ“jams piekļūt visiem jÅ«su repozitorijiem. -gpg_desc=Å Ä«s publiskÄs GPG atslÄ“gas ir saistÄ«tas ar JÅ«su kontu. Paturiet privÄtÄs atslÄ“gas drošībÄ, jo tÄs ļauj parakstÄ«t revÄ«zijas. -ssh_helper=VajadzÄ«ga palÄ«dzÄ«ba? IepazÄ«stieties ar GitHub pamÄcÄ«bu kÄ izveidot jaunu SSH atslÄ“gu vai atrisinÄtu biežÄk sastopamÄs problÄ“mas ar kurÄm varat saskarties, izmantojot SSH. -gpg_helper=VajadzÄ«ga palÄ«dzÄ«ba? IepazÄ«stieties ar GitHub pamÄcÄ«bu par GPG. +ssh_desc=Å Ä«s publiskÄs SSH atslÄ“gas ir pievienotas kontam. AtbilstoÅ¡as privÄtÄs atslÄ“gas nodroÅ¡ina pilnu piekļuvi glabÄtavÄm. ApliecinÄtas SSH atslÄ“gas var tikt izmantotas SSH parakstÄ«tu Git iesÅ«tÄ«jumu apliecinÄÅ¡anai. +principal_desc=Å Ä«s SSH sertifikÄtu identitÄtes ir pievienotas kontam un ļauj pilnu piekļuvi TavÄm glabÄtavÄm. +gpg_desc=Å Ä«s publiskÄs GPG atslÄ“gas ir saistÄ«tas ar kontu un tiek izmantotas, lai apliecinÄtu iesÅ«tÄ«jumus. Savas privÄtÄs atslÄ“gas ir jÄtur drošībÄ, jo tÄs ļauj parakstÄ«t iesÅ«tÄ«jumus TavÄ vÄrdÄ. +ssh_helper=VajadzÄ«ga palÄ«dzÄ«ba? Ir vÄ“rts ieskatÄ«ties GitHub pamÄcÄ«bÄ par jaunas SSH atslÄ“gas izveidoÅ¡anu vai biežÄk sastopamo sarežģījumu, ar kuriem var saskarties SSH izmantoÅ¡anas laikÄ, novÄ“rÅ¡anu. +gpg_helper=NepiecieÅ¡ama palÄ«dzÄ«ba? Ir vÄ“rts ieskatÄ«ties GitHub vadlÄ«nijÄs par GPG. add_new_key=Pievienot SSH atslÄ“gu add_new_gpg_key=Pievienot GPG atslÄ“gu -key_content_ssh_placeholder=SÄkas ar 'ssh-ed25519', 'ssh-rsa', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'sk-ecdsa-sha2-nistp256@openssh.com' vai 'sk-ssh-ed25519@openssh.com' -key_content_gpg_placeholder=SÄkas ar '-----BEGIN PGP PUBLIC KEY BLOCK-----' +key_content_ssh_placeholder=SÄkas ar "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com" vai "sk-ssh-ed25519@openssh.com" +key_content_gpg_placeholder=SÄkas ar "-----BEGIN PGP PUBLIC KEY BLOCK-----" add_new_principal=Pievienot identitÄti ssh_key_been_used=Å Ä« SSH atslÄ“ga jau ir pievienota Å¡ajÄ serverÄ«. -ssh_key_name_used=SSH atslÄ“ga ar Å¡Ädu nosaukumu Å¡im kontam jau eksistÄ“. +ssh_key_name_used=SSH atslÄ“ga ar tÄdu paÅ¡u nosaukumu jau ir kontÄ. ssh_principal_been_used=Å Äda identitÄte jau ir pievienota Å¡ÄjÄ serverÄ«. -gpg_key_id_used=PubliskÄ GPG atslÄ“ga ar Å¡Ädu ID jau eksistÄ“. -gpg_no_key_email_found=GPG atslÄ“ga neatbilst nevienai JÅ«su konta aktivizÄ“tajai e-pasta adresei. Å o atslÄ“gu ir iespÄ“jams pievienot, veicot, pilnvaras parakstīšanu. +gpg_key_id_used=Jau pastÄv publiska GPG atslÄ“ga ar tÄdu paÅ¡u identifikatoru. +gpg_no_key_email_found=Å Ä« GPG atslÄ“ga neatbilst nevienai ar kontu saistÄ«tajai e-pasta adresei. To joprojÄm var pievienot, ja tiek parakstÄ«ta norÄdÄ«tÄ pilnvara. gpg_key_matched_identities=AtbilstoÅ¡Äs identitÄtes: -gpg_key_matched_identities_long=IegultÄs identitÄtes Å¡ÄjÄ atslÄ“gÄ atbilst sekojoÅ¡Äm aktivizÄ“tÄm e-pasta adresÄ“m Å¡im lietotajam. RevÄ«zijas ar atbilstoÅ¡Äm e-pasta adresÄ“m var tik pÄrbaudÄ«tas ar Å¡o atslÄ“gu. -gpg_key_verified=PÄrbaudÄ«tÄ atslÄ“ga -gpg_key_verified_long=AtslÄ“ga tika apliecinÄta ar pilnvaru un var tikt izmantota, lai pÄrbaudÄ«tu revÄ«zijas, kas atbilst jebkurai apstiprinÄtai e-pasta adresei Å¡im lietotÄjam papildus šīs atslÄ“gas atbilstoÅ¡ajÄm identitÄtÄ“m. +gpg_key_matched_identities_long=Å ajÄ atslÄ“gÄ iegultÄs identitÄtes atbilst zemÄk uzskaitÄ«tÄjÄm aktivÄ“tajÄm šī lietotÄja e-pasta adresÄ“m. IesÅ«tÄ«jumus, kas atbilst šīm e-pasta adresÄ“m, var apliecinÄt ar Å¡o atslÄ“gu. +gpg_key_verified=ApliecinÄta atslÄ“ga +gpg_key_verified_long=AtslÄ“ga tika apliecinÄta ar pilnvaru un var tikt izmantota, lai apliecinÄtu iesÅ«tÄ«jumus, kas atbilst jebkurai apstiprinÄtai šī lietotÄja e-pasta adresei papildus jebkurai Å¡ai atslÄ“gai atbilstoÅ¡ai identitÄtei. gpg_key_verify=PÄrbaudÄ«t gpg_invalid_token_signature=NorÄdÄ«tÄ GPG atslÄ“ga, paraksts un pilnvara neatbilst vai tai ir beidzies derÄ«guma termiņš. gpg_token_required=JÄnorÄda paraksts zemÄk esoÅ¡ajai pilnvarai gpg_token=Pilnvara -gpg_token_help=Parakstu ir iespÄ“jams uzÄ£enerÄ“t izmantojot komandu: +gpg_token_help=Parakstu var izveidot: gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=TekstuÄls GPG paraksts -key_signature_gpg_placeholder=SÄkas ar '-----BEGIN PGP SIGNATURE-----' -verify_gpg_key_success=GPG atslÄ“ga "%s" veiksmÄ«gi pÄrbaudÄ«ta. -ssh_key_verified=PÄrbaudÄ«ta atslÄ“ga -ssh_key_verified_long=AtslÄ“ga tika apliecinÄta ar parakstÄ«tu pilnvaru un var tikt izmantota, lai pÄrbaudÄ«tu revÄ«zijas, kas atbilst jebkurai apstiprinÄtai lietotÄja e-pasta adresei. +key_signature_gpg_placeholder=SÄkas ar "-----BEGIN PGP SIGNATURE-----" +verify_gpg_key_success=GPG atslÄ“ga "%s" tika apliecinÄta. +ssh_key_verified=ApliecinÄta atslÄ“ga +ssh_key_verified_long=AtslÄ“ga tika apliecinÄta ar pilnvaru un var tikt izmantota, lai apliecinÄtu iesÅ«tÄ«jumus, kas atbilst jebkurai apstiprinÄtai šī lietotÄja e-pasta adresei. ssh_key_verify=PÄrbaudÄ«t ssh_invalid_token_signature=NorÄdÄ«tÄ SSH atslÄ“ga, paraksts un pilnvara neatbilst vai tai ir beidzies derÄ«guma termiņš. ssh_token_required=JÄnorÄda paraksts zemÄk esoÅ¡ajai pilnvarai ssh_token=Pilnvara -ssh_token_help=Parakstu ir iespÄ“jams uzÄ£enerÄ“t izmantojot komandu: +ssh_token_help=Parakstu var izveidot: ssh_token_signature=TekstuÄls SSH paraksts -key_signature_ssh_placeholder=SÄkas ar '-----BEGIN SSH SIGNATURE-----' -verify_ssh_key_success=SSH atslÄ“ga "%s" veiksmÄ«gi pÄrbaudÄ«ta. +key_signature_ssh_placeholder=SÄkas ar "-----BEGIN SSH SIGNATURE-----" +verify_ssh_key_success=SSH atslÄ“ga "%s" tika apliecinÄta. subkeys=ApakÅ¡atslÄ“gas key_id=AtslÄ“gas ID key_name=AtslÄ“gas nosaukums @@ -784,9 +900,9 @@ delete_key=Noņemt ssh_key_deletion=Noņemt SSH atslÄ“gu gpg_key_deletion=Noņemt GPG atslÄ“gu ssh_principal_deletion=Noņemt SSH sertifikÄta identitÄti -ssh_key_deletion_desc=Dzēšot Å¡o SSH atslÄ“gu, ar to vairs nebÅ«s iespÄ“jams autorizÄ“ties JÅ«su kontÄ. Vai turpinÄt? -gpg_key_deletion_desc=Noņemot GPG atslÄ“gu, ar to parakstÄ«tÄs revÄ«zijas vairs netiks attÄ“lotas kÄ verificÄ“tas. Vai turpinÄt? -ssh_principal_deletion_desc=Noņemot SSH sertifikÄta identitÄti, ar to vairs nebÅ«s iespÄ“jams piekļūt Å¡im kontam. Vai turpinÄt? +ssh_key_deletion_desc=SSH atslÄ“gas noņemÅ¡ana atsauks tÄs piekļuvi kontam. TurpinÄt? +gpg_key_deletion_desc=GPG atslÄ“gas noņemÅ¡ana atceļ ar to parakstÄ«to iesÅ«tÄ«jumu apliecinÄjumu. TurpinÄt? +ssh_principal_deletion_desc=SSH sertifikÄta identitÄtes noņemÅ¡ana atsauks tÄs piekļuvi kontam. TurpinÄt? ssh_key_deletion_success=SSH atslÄ“ga tika izdzÄ“sta. gpg_key_deletion_success=GPG atslÄ“ga tika izdzÄ“sta. ssh_principal_deletion_success=IdentitÄte tika noņemta. @@ -794,43 +910,43 @@ added_on=Pievienots %s valid_until_date=DerÄ«gs lÄ«dz %s valid_forever=DerÄ«gs mūžīgi last_used=PÄ“dÄ“jo reizi izmantota -no_activity=Nav nesenas aktivitÄtes +no_activity=Nav nesenu darbÄ«bu can_read_info=LasÄ«t can_write_info=RakstÄ«t key_state_desc=Å Ä« atslÄ“ga ir izmantota pÄ“dÄ“jo 7 dienu laikÄ token_state_desc=Å Ä« pilnvara ir izmantota pÄ“dÄ“jo 7 dienu laikÄ -principal_state_desc=Å Ä« identitÄte ir lietota pÄ“dÄ“jÄs 7 dienÄs +principal_state_desc=Å Ä« identitÄte ir izmantota pÄ“dÄ“jo 7 dienu laikÄ show_openid=RÄdÄ«t profilÄ hide_openid=PaslÄ“pt no profila ssh_disabled=SSH atspÄ“jots -ssh_signonly=SSH ir atspÄ“jots, lÄ«dz ar to šīs atslÄ“gas tiks izmantotas tikai revÄ«ziju parakstu pÄrbaudei. +ssh_signonly=SSH paÅ¡laik ir atspÄ“jots, tÄdēļ šīs atslÄ“gas tiek izmantotas tikai iesÅ«tÄ«jumu parakstu apliecinÄÅ¡anai. ssh_externally_managed=Å im lietotÄjam SSH atslÄ“ga tiek pÄvaldÄ«ta attÄlinÄti manage_social=PÄrvaldÄ«t piesaistÄ«tos sociÄlos kontus social_desc=Å ie sociÄlo tÄ«klu konti var tikt izmantoti, lai pieteiktos. PÄrliecinieties, ka visi ir atpazÄ«stami. unbind=AtsaistÄ«t unbind_success=SociÄlÄ tÄ«kla konts tika veiksmÄ«gi noņemts. -manage_access_token=PÄrvaldÄ«t piekļuves pilnvaras +manage_access_token=Piekļuves pilnvaras generate_new_token=Izveidot jaunu pilnvaru -tokens_desc=Ar Å¡iem taloniem ir iespÄ“jams piekļūt JÅ«su kontam, izmantojot, Forgejo API. +tokens_desc=Å Ä«s pilnvaras nodroÅ¡ina piekļuvi kontam ar Forgejo API. token_name=Pilnvaras nosaukums -generate_token=Ä¢enerÄ“t pilnvaru -generate_token_success=Piekļuves pilvara tika veiksmÄ«gi uzÄ£enerÄ“ta! NokopÄ“jiet to tagad, jo vÄ“lÄk to vairs nebÅ«s iespÄ“jams aplÅ«kot. -generate_token_name_duplicate=Jau eksistÄ“ lietotne ar nosaukumu %s. Izmantojiet citu nosaukumu. -delete_token=DzÄ“st -access_token_deletion=DzÄ“st piekļuves pilnvaru +generate_token=Izveidot pilnvaru +generate_token_success=JaunÄ pilnvara tika izveidota. TÄ ir jÄievieto starpliktuvÄ“, jo tÄ vairs netiks rÄdÄ«ta. +generate_token_name_duplicate=Lietotnes nosaukums %s jau tiek izmantots. LÅ«gums izmantot citu. +delete_token=IzdzÄ“st +access_token_deletion=IzdzÄ“st piekļuves pilnvaru access_token_deletion_cancel_action=Atcelt access_token_deletion_confirm_action=DzÄ“st -access_token_deletion_desc=Izdzēšot pilnvaru, lietojumprogrammÄm, kas to izmanto, tiks liegta piekļuve Å¡im kontam. Å Ä« darbÄ«ba ir neatgriezeniska. Vai turpinÄt? -delete_token_success=Pilnvara tika izdzÄ“sta. LietojumprogrammÄm, kas izmantoja Å¡o pilnvaru, vairs nav piekļuves kontam. -repo_and_org_access=Repozitorija un organizÄcijas piekļuve -permissions_public_only=Tikai publiskie -permissions_access_all=Visi (publiskie, privÄtie un ierobežotie) -select_permissions=NorÄdiet tiesÄ«bas +access_token_deletion_desc=Pilnvaras izdzēšana atsauks lietotņu, kas to izmanto, piekļuvi kontam. Å o darbÄ«bu nevar atsaukt. TurpinÄt? +delete_token_success=Pilnvara tika izdzÄ“sta. LietotnÄ“m, kas to izmanto, vairs nav piekļuves kontam. +repo_and_org_access=GlabÄtavas un apvienÄ«bas piekļuve +permissions_public_only=Tikai atklÄtÄs +permissions_access_all=Visas (atklÄtÄs, privÄtÄs un ierobežotÄs) +select_permissions=AtlasÄ«t atļaujas permission_no_access=Nav piekļuves -permission_read=SkatīšanÄs -permission_write=SkatīšanÄs un raksīšanas -access_token_desc=AtzÄ«mÄ“tie pilnvaras apgabali ierobežo autentifikÄciju tikai atbilstoÅ¡iem API izsaukumiem. SÄ«kÄka informÄcija pieejama dokumentÄcijÄ. +permission_read=LasÄ«t +permission_write=LasÄ«t un rakstÄ«t +access_token_desc=AtlasÄ«tÄs pilnvaru atļaujas ierobežo pilnvaroÅ¡anu tikai atbilstoÅ¡iem API marÅ¡rutiem. VairÄk ir lasÄmsdokumentÄcijÄ. at_least_one_permission=NepiecieÅ¡ams norÄdÄ«t vismaz vienu tiesÄ«bu, lai izveidotu pilnvaru permissions_list=TiesÄ«bas: @@ -838,444 +954,495 @@ manage_oauth2_applications=PÄrvaldÄ«t OAuth2 lietotnes edit_oauth2_application=Labot OAuth2 lietotni oauth2_applications_desc=OAuth2 lietotnes ļauj treÅ¡o puÅ¡u lietotnÄ“m droÅ¡a veidÄ autentificÄ“t lietotajus Å¡ajÄ Forgejo instancÄ“. remove_oauth2_application=Noņemt OAuth2 lietotni -remove_oauth2_application_desc=Noņemot OAuth2 lietotni, tiks noņemta piekļuve visÄm parakstÄ«tajÄm piekļuves pilnvarÄm. Vai turpinÄt? -remove_oauth2_application_success=Lietotne tika dzÄ“sta. +remove_oauth2_application_desc=OAuth2 lietotnes noņemÅ¡ana atsauks piekļuvi visÄm parakstÄ«tajÄm piekļuves pilnvarÄm. TurpinÄt? +remove_oauth2_application_success=Lietotne tika izdzÄ“sta. create_oauth2_application=Izveidot jaunu OAuth2 lietotni create_oauth2_application_button=Izveidot lietotni -create_oauth2_application_success=Ir veiksmÄ«gi izveidota jauna OAuth2 lietotne. -update_oauth2_application_success=Ir veiksmÄ«gi atjaunota OAuth2 lietotne. +create_oauth2_application_success=Ir sekmÄ«gi izveidota jauna OAuth2 lietotne. +update_oauth2_application_success=OAuth2 lietotne ir sekmÄ«gi atjauninÄta. oauth2_application_name=Lietotnes nosaukums -oauth2_confidential_client=KonfidenciÄls klients. NorÄdiet lietotÄ“m, kas glabÄ noslÄ“pumu slepenÄ«bÄ, piemÄ“ram, tÄ«mekļa lietotnÄ“m. NenorÄdiet instalÄ“jamÄm lietotnÄ“m, tai skaitÄ darbavirsmas vai mobilajÄm lietotnÄ“m. -oauth2_redirect_uris=PÄrsÅ«tīšanas URI. NorÄdiet katru URI savÄ rindÄ. +oauth2_confidential_client=Slepens klients. JÄatlasa lietotnÄ“m, kas glabÄ noslÄ“pumu slepenÄ«bÄ, piemÄ“ram, tÄ«mekļa lietotnÄ“m. Nav jÄatlasa ierastajÄm lietotnÄ“m, tajÄ skaitÄ darbvirsmas un viedierÄ«Äu lietotnÄ“m. +oauth2_redirect_uris=PÄrvirzīšanas URI. LÅ«gums norÄdÄ«t katru URI savÄ rindÄ. save_application=SaglabÄt oauth2_client_id=Klienta ID oauth2_client_secret=Klienta noslÄ“pums -oauth2_regenerate_secret=PÄrÄ£enerÄ“t noslÄ“pumus +oauth2_regenerate_secret=AtkÄrtoti izveidot noslÄ“pumu oauth2_regenerate_secret_hint=PazaudÄ“ts noslÄ“pums? oauth2_client_secret_hint=PÄ“c šīs lapas pameÅ¡anas vai atsvaidzinÄÅ¡anas noslÄ“pums vairs netiks parÄdÄ«ts. LÅ«gums pÄrliecinÄties, ka tas ir saglabÄts. oauth2_application_edit=Labot oauth2_application_create_description=OAuth2 lietotnes ļauj treÅ¡as puses lietotnÄ“m piekļūt lietotÄja kontiem Å¡ajÄ instancÄ“. -oauth2_application_remove_description=OAuth2 lietotnes noņemÅ¡ana liegs tai piekļūt pilnvarotiem lietotÄju kontiem Å¡ajÄ instancÄ“. Vai turpinÄt? -oauth2_application_locked=Gitea sÄknēšanas brÄ«dÄ« reÄ£istrÄ“ dažas OAuth2 lietotnes, ja tas ir iespÄ“jots konfigurÄcijÄ. Lai novÄ“rstu negaidÄ«tu uzvedÄ«bu, tÄs nevar ne labot, ne noņemt. LÅ«gums vÄ“rsties OAuth2 dokumentÄcijÄ pÄ“c vairÄk informÄcijas. +oauth2_application_remove_description=OAuth2 lietotnes noņemÅ¡ana liegs tai piekļūt pilnvarotiem lietotÄju kontiem Å¡ajÄ serverÄ«. TurpinÄt? +oauth2_application_locked=Forgejo sÄknēšanas brÄ«dÄ« reÄ£istrÄ“ dažas OAuth2 lietotnes, ja tas ir iespÄ“jots konfigurÄcijÄ. Lai novÄ“rstu negaidÄ«tu uzvedÄ«bu, tÄs nevar ne labot, ne noņemt. LÅ«gums vÄ“rsties OAuth2 dokumentÄcijÄ pÄ“c vairÄk informÄcijas. -authorized_oauth2_applications=AutorizÄ“tÄs OAuth2 lietotnes -authorized_oauth2_applications_description=Ir ļauta piekļuve savam Gitea kontam šīm treÅ¡o puÅ¡u lietotnÄ“m. LÅ«gums atsaukt piekļuvi lietotnÄ“m, kas vairs nav nepiecieÅ¡amas. +authorized_oauth2_applications=PilnvarotÄs OAuth2 lietotnes +authorized_oauth2_applications_description=Ir ļauta piekļuve savam Forgejo kontam šīm treÅ¡o puÅ¡u lietotnÄ“m. LÅ«gums atsaukt piekļuvi lietotnÄ“m, kas vairs nav nepiecieÅ¡amas. revoke_key=Atsaukt revoke_oauth2_grant=Atsaukt piekļuvi -revoke_oauth2_grant_description=Atsaucot piekļuvi Å¡ai treÅ¡as puses lietotnei tiks liegta piekļuve JÅ«su datiem. Vai turpinÄt? -revoke_oauth2_grant_success=Piekļuve veiksmÄ«gi atsaukta. +revoke_oauth2_grant_description=Å Ä«s treÅ¡Äs puses lietotnes piekļuves atsaukÅ¡ana liegs tai piekļūt Taviem datiem. TurpinÄt? +revoke_oauth2_grant_success=Piekļuve sekmÄ«gi atsaukta. -twofa_desc=Divfaktoru autentifikÄcija uzlabo konta drošību. -twofa_recovery_tip=Ja ierÄ«ce tiek pazaudÄ“ta, iespÄ“jams izmantot vienreiz izmantojamo atkopÅ¡anas atslÄ“gu, lai atgÅ«tu piekļuvi savam kontam. -twofa_is_enrolled=Kontam ir ieslÄ“gta divfaktoru autentifikÄcija. -twofa_not_enrolled=Kontam Å¡obrÄ«d nav ieslÄ“gta divfaktoru autentifikÄcija. -twofa_disable=AtslÄ“gt divfaktoru autentifikÄciju -twofa_scratch_token_regenerate=Ä¢enerÄ“t jaunu vienreizÄ“jo kodu +twofa_desc=Lai aizsargÄtu savu kontu no paroļu zÄdzÄ«bas, var izmantot viedtÄlruni vai citu ierÄ«ci, lai saņemtu laikÄ balstÄ«tas vienreiz izmantojamas paroles ("TOTP"). +twofa_recovery_tip=Ja ierÄ«ce tiks pazaudÄ“ta, bÅ«s iespÄ“jams izmantot vienreizÄ“jas izmantoÅ¡anas atkopes atslÄ“gu, lai atgÅ«tu piekļuvi savam kontam. +twofa_is_enrolled=Kontam Å¡obrÄ«d ir ieslÄ“gta divpakÄpju pieteikÅ¡anÄs. +twofa_not_enrolled=Kontam Å¡obrÄ«d nav ieslÄ“gta divpakÄpju pieteikÅ¡anÄs. +twofa_disable=AtspÄ“jot divpakÄpju pieteikÅ¡anos +twofa_scratch_token_regenerate=AtkÄrtoti izveidot vienreizÄ“jas izmantoÅ¡anas atkopes atslÄ“gu twofa_scratch_token_regenerated=VienreizÄ“jÄ pilnvara tagad ir %s. TÄ ir jÄglabÄ droÅ¡Ä vietÄ, tÄ vairs nekad netiks rÄdÄ«ta. -twofa_enroll=IeslÄ“gt divfaktoru autentifikÄciju -twofa_disable_note=NepiecieÅ¡amÄ«bas gadÄ«jumÄ divfaktoru autentifikÄciju ir iespÄ“jams atslÄ“gt. -twofa_disable_desc=AtslÄ“dzot divfaktoru autentifikÄciju, konts vairs nebÅ«s tik droÅ¡s. Vai turpinÄt? -regenerate_scratch_token_desc=Ja esat aizmirsis vienreizÄ“jo kodu vai esat to jau izmantojis, lai pieteiktos, atjaunojiet to Å¡eit. -twofa_disabled=Divfaktoru autentifikÄcija tika atslÄ“gta. -scan_this_image=NoskenÄ“jiet Å¡o attÄ“lu ar autentifikÄcijas lietojumprogrammu: -or_enter_secret=Vai ievadiet Å¡o noslÄ“pumu: %s -then_enter_passcode=Ievadiet piekļuves kodu no lietojumprogrammas: -passcode_invalid=NederÄ«gs piekļuves kods. Mēģiniet ievadÄ«t atkÄrtoti. -twofa_enrolled=Kontam tika ieslÄ“gta divfaktoru autentifikÄcija. SaglabÄjiet vienreizÄ“jo kodu (%s) droÅ¡Ä vietÄ, jo to vairÄk nebÅ«s iespÄ“jams aplÅ«kot! +twofa_enroll=IeslÄ“gt divpakÄpju pieteikÅ¡anos +twofa_disable_note=Ja nepiecieÅ¡ams, divpakÄpju pieteikÅ¡anos var atslÄ“gt. +twofa_disable_desc=DivpakÄpju pieteikÅ¡anÄs atspÄ“joÅ¡ana padarÄ«s kontu mazÄk droÅ¡u. TurpinÄt? +regenerate_scratch_token_desc=Ja atkopes atslÄ“ga ir pazaudÄ“ta vai tÄ jau ir izmantota, lai pieteiktos, to var atiestatÄ«t Å¡eit. +twofa_disabled=DivpakÄpju pieteikÅ¡anÄs tika atspÄ“jota. +scan_this_image=Å is attÄ“ls ir jÄnolasa ar autentificēšanÄs lietotni: +or_enter_secret=Vai jÄievada noslÄ“pums: %s +then_enter_passcode=PÄ“c tam jÄievada lietotnÄ“ attÄ“lotais piekļuves kods: +passcode_invalid=Piekļuves kods ir nepareizs. JÄmēģina vÄ“lreiz. +twofa_enrolled=Kontam tika ieslÄ“gta divpakÄpju pieteikÅ¡anÄs. Vienreiz izmantojamÄ atkopes atslÄ“ga (%s) ir jÄglabÄ droÅ¡Ä vietÄ, jo tÄ vairs netiks rÄdÄ«ta. twofa_failed_get_secret=NeizdevÄs ielÄdÄ“t noslÄ“pumu. -webauthn_desc=Drošības atslÄ“gas ir fiziskas ierÄ«ces, kas satur kriptogrÄfiskas atslÄ“gas. TÄs var tikt izmantotas divu faktoru autentifikÄcijai. Drošības atslÄ“gÄm ir jÄatbalsta WebAuthn autentifikÄcijas standarts. +webauthn_desc=Drošības atslÄ“gas ir ierÄ«ces, kas satur kriptogrÄfiskas atslÄ“gas. TÄs var tikt izmantotas divpakÄpju apliecinÄÅ¡anai. Drošības atslÄ“gÄm ir jÄatbilst WebAuthn autentificÄ“tÄja standartam. webauthn_register_key=Pievienot drošības atslÄ“gu webauthn_nickname=SegvÄrds webauthn_delete_key=Noņemt drošības atslÄ“gu webauthn_delete_key_desc=Noņemot drošības atslÄ“gu ar to vairs nebÅ«s iespÄ“jams pieteikties. Vai turpinÄt? webauthn_key_loss_warning=Ja tiek pazaudÄ“tas drošības atslÄ“gas, tiks zaudÄ“ta piekļuve kontam. -webauthn_alternative_tip=Ir vÄ“lams uzstÄdÄ«t papildu autentifikÄcijas veidu. +webauthn_alternative_tip=Ir vÄ“lams uzstÄdÄ«t papildu autentificēšanÄs veidu. -manage_account_links=PÄrvaldÄ«t saistÄ«tos kontus -manage_account_links_desc=Å Ädi ÄrÄ“jie konti ir piesaistÄ«ti JÅ«su Forgejo kontam. +manage_account_links=SasaistÄ«tie konti +manage_account_links_desc=Å ie ÄrÄ“jie konti ir sasaistÄ«ti ar Tavu Forgejo kontu. account_links_not_available=PaÅ¡laik nav neviena ÄrÄ“jÄ konta piesaistÄ«ta Å¡im kontam. link_account=SasaistÄ«t kontu -remove_account_link=Noņemt saistÄ«to kontu -remove_account_link_desc=Noņemot saistÄ«to kontu, tam tiks liegta piekļuve JÅ«su Forgejo kontam. Vai turpinÄt? -remove_account_link_success=SaistÄ«tais konts tika noņemts. +remove_account_link=Noņemt sasaistÄ«to kontu +remove_account_link_desc=SasaistÄ«tÄ konta noņemÅ¡ana atsauks tÄ piekļuvi Tavam Forgejo kontam. TurpinÄt? +remove_account_link_success=SasaistÄ«tais konts tika noņemts. -hooks.desc=Pievienot tÄ«mekļa ÄÄ·us, kas izpildÄ«sies visos repozitorijos, kas jums pieder. +hooks.desc=Pievienot tÄ«mekļa aizÄ·eres, kas izpildÄ«sies visÄs piederoÅ¡ajÄs glabÄtavÄs. -orgs_none=JÅ«s neesat nevienas organizÄcijas biedrs. -repos_none=Jums nepieder neviens repozitorijs. +orgs_none=Nav dalÄ«bas nevienÄ apvienÄ«bÄ. +repos_none=Tev nav nevienas glabÄtavas. -delete_account=DzÄ“st savu kontu -delete_prompt=Å Ä« darbÄ«ba pilnÄ«bÄ izdzÄ“sÄ«s JÅ«su kontu, kÄ arÄ« tÄ ir NEATGRIEZENISKA. -delete_with_all_comments=JÅ«su konts ir jaunÄks par %s. Lai izveirotos no spoka komentÄriem, visu problÄ“mu un izmaiņu pieprasÄ«jumu komentÄri tiks dzÄ“sti lÄ«dz ar kontu. -confirm_delete_account=ApstiprinÄt dzēšanu -delete_account_title=DzÄ“st lietotÄja kontu -delete_account_desc=Vai tieÅ¡Äm vÄ“laties dzÄ“st Å¡o kontu? +delete_account=IzdzÄ“st savu kontu +delete_prompt=Å Ä« darbÄ«ba neatgriezeniski izdzÄ“sÄ«s lietotÄja kontu. To NEVAR atsaukt. +delete_with_all_comments=Konts ir jaunÄks kÄ %s. Lai izvairÄ«tos no spoku piebildÄ“m, visas pieteikumu/izmaiņu pieprasÄ«jumu piebildes tiks izdzÄ“stas kopÄ ar to. +confirm_delete_account=ApstiprinÄt izdzēšanu +delete_account_title=IzdzÄ“st lietotÄja kontu +delete_account_desc=Vai tieÅ¡Äm neatgriezeniski izdzÄ“st Å¡o lietotÄja kontu? email_notifications.enable=IespÄ“jot e-pasta paziņojumus -email_notifications.onmention=Tikai, ja esmu pieminÄ“ts -email_notifications.disable=NesÅ«tÄ«t paziņojumus -email_notifications.submit=SaglabÄt sÅ«tīšanas iestatÄ«jumus -email_notifications.andyourown=Iekļaut savus paziņojumus +email_notifications.onmention=Tikai, ja mani piemin +email_notifications.disable=AtspÄ“jot e-pasta paziņojumus +email_notifications.submit=IestatÄ«t e-pasta iestatÄ«jumus +email_notifications.andyourown=Un manus paziņojumus visibility=LietotÄja redzamÄ«ba -visibility.public=Publisks +visibility.public=AtklÄta visibility.public_tooltip=Redzams ikvienam visibility.limited=Ierobežota -visibility.limited_tooltip=Redzams tikai autentificÄ“tiem lietotÄjiem -visibility.private=PrivÄts -visibility.private_tooltip=Redzams tikai organizÄciju, kurÄm esi pievienojies, dalÄ«bniekiem +visibility.limited_tooltip=Redzams tikai lietotÄjiem, kuri ir pieteikuÅ¡ies +visibility.private=PrivÄta +visibility.private_tooltip=Redzams tikai apvienÄ«bu, kurÄs pievienojies, dalÄ«bniekiem +change_password = MainÄ«t paroli +keep_activity_private.description = Tavas atklÄtÄs darbÄ«bas bÅ«s redzamas tikai Tev un servera pÄrvaldÄ«tÄjiem. +update_hints = AtjauninÄt norÄdes +update_hints_success = NorÄdes tika atjauninÄtas. +user_block_success = LietotÄjs tika sekmÄ«gi liegts. +user_unblock_success = LietotÄja liegums tika sekmÄ«gi atcelts. +blocked_since = Liegts kopÅ¡ %s +blocked_users_none = Nav liegto lietotÄju. +pronouns = VietniekvÄrdi +pronouns_custom = PielÄgoti +blocked_users = Liegtie lietotÄji +pronouns_unspecified = Nav norÄdÄ«ts +language.title = NoklusÄ“juma valoda +language.localization_project = PalÄ«dzi mums tulkot Forgejo savÄ valodÄ! UzzinÄt vairÄk. +hints = NorÄdes +additional_repo_units_hint = Ieteikt iespÄ“jot papildu glabÄtavas vienÄ«bas +additional_repo_units_hint_description = AttÄ“lot norÄdi "IespÄ“jot vÄ“l" glabÄtavÄs, kurÄs nav iespÄ“jotas visas pieejamÄs vienÄ«bas. +language.description = Å Ä« valoda tiks saglabÄta kontÄ un pÄ“c pieteikÅ¡anÄs tiks izmantota kÄ noklusÄ“juma. +user_block_yourself = Nevar liegt sevi. +pronouns_custom_label = PielÄgoti vietniekvÄrdi +change_username_redirect_prompt.with_cooldown.one = Vecais lietotÄjvÄrds bÅ«s pieejams visiem pÄ“c noilguma, kas ir %[1]d diena. Å ajÄ laikÄ ir iespÄ“jams to atkal sÄkt izmantot. +change_username_redirect_prompt.with_cooldown.few = Vecais lietotÄjvÄrds bÅ«s pieejams visiem pÄ“c noilguma, kas ir %[1]d dienas. Å ajÄ laikÄ ir iespÄ“jams to atkal sÄkt izmantot. +keep_pronouns_private = VietniekvÄrdus rÄdÄ«t tikai lietotÄjiem, kuri ir pieteikuÅ¡ies +keep_pronouns_private.description = Å is paslÄ“ps vietniekvÄrdus no apmeklÄ“tÄjiem, kuri nav pieteikuÅ¡ies. +quota.sizes.assets.all = LÄ«dzekļi +quota.sizes.git.lfs = Git LFS +quota.applies_to_user = Uz kontu attiecas zemÄk esoÅ¡Äs ierobežojuma kÄrtulas +quota.rule.exceeded.helper = KopÄ“jais šīs kÄrtulas objektu izmÄ“rs pÄrsniedz ierobežojumu. +quota.sizes.git.all = Git saturs +quota.rule.exceeded = PÄrsniegts +quota.sizes.assets.attachments.all = Pielikumi +quota.sizes.assets.attachments.issues = Pieteikumu pielikumi +quota.sizes.assets.attachments.releases = Laidienu pielikumi +quota.sizes.assets.artifacts = Artefakti +quota.sizes.assets.packages.all = Pakotnes +quota.sizes.wiki = Vikivietne +storage_overview = KrÄtuves pÄrskats +quota = Ierobežojums +quota.applies_to_org = Uz apvienÄ«bu attiecas zemÄk esoÅ¡Äs ierobežojuma kÄrtulas +quota.rule.no_limit = Neierobežots +quota.sizes.all = Viss +quota.sizes.repos.all = GlabÄtavas +quota.sizes.repos.public = AtklÄtÄs glabÄtavas +quota.sizes.repos.private = PrivÄtÄs glabÄtavas +regenerate_token = Izveidot no jauna +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? [repo] -new_repo_helper=Repozitorijs satur visus projekta failus, tajÄ skaitÄ izmaiņu vÄ“sturi. Jau tiek glabÄts kaut kur citur? PÄrnest repozitoriju. +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 -owner_helper=Å…emot vÄ“rÄ maksimÄlÄ repozitoriju skaita ierobežojumu, ne visas organizÄcijas var tikt parÄdÄ«tas sarakstÄ. -repo_name=Repozitorija nosaukums -repo_name_helper=Labi repozitorija nosaukumi ir Ä«si, unikÄli un tÄdi, ko viegli atcerÄ“ties. -repo_size=Repozitorija izmÄ“rs +owner_helper=Dažas apvienÄ«bas var netikt parÄdÄ«tas izvÄ“lnÄ“ lielÄkÄ iespÄ“jamÄ glabÄtavu skaita ierobežojuma dēļ. +repo_name=GlabÄtavas nosaukums +repo_name_helper=Labos glabÄtavu nosaukumos izmanto Ä«sus, viegli iegaumÄ“jamus un vienreizÄ“jus atslÄ“gvÄrdus. +repo_size=GlabÄtavas izmÄ“rs template=Sagatave -template_select=IzvÄ“lieties sagatavi. -template_helper=PadarÄ«t repozitoriju par sagatavi -template_description=Sagatavju repozitoriji tiek izmantoti, lai balstoties uz tiem veidotu jaunus repozitorijus saglabÄjot direktoriju un failu struktÅ«ru. +template_select=AtlasÄ«t sagatavi +template_helper=PadarÄ«t glabÄtavu par sagatavi +template_description=Sagatavju glabÄtavas ļauj lietotÄjiem izveidot jaunas glabÄtavas ar tÄdu paÅ¡u mapju uzbÅ«vi, datnÄ“m un izvÄ“les iestatÄ«jumiem. visibility=RedzamÄ«ba -visibility_description=Tikai organizÄcijas Ä«paÅ¡nieks vai tÄs biedri, kam ir tiesÄ«bas, varÄ“s piekļūt Å¡im repozitorijam. -visibility_helper=PadarÄ«t repozitoriju privÄtu -visibility_helper_forced=JÅ«su sistÄ“mas administrators ir noteicis, ka visiem no jauna izveidotajiem repozitorijiem ir jÄbÅ«t privÄtiem. -visibility_fork_helper=(Å Ä«s vÄ“rtÄ«bas maiņa ietekmÄ“s arÄ« visus atdalÄ«tos repozitorijus.) +visibility_description=Tikai apvienÄ«bas Ä«paÅ¡nieks vai tÄs dalÄ«bnieki, ja viņiem ir tiesÄ«bas, varÄ“s to redzÄ“t. +visibility_helper=PadarÄ«t glabÄtavu privÄtu +visibility_helper_forced=Vietnes pÄrvaldÄ«tÄjs ir noteicis, ka jaunÄm glabÄtavÄm ir jÄbÅ«t privÄtÄm. +visibility_fork_helper=(Å Ä«s vÄ“rtÄ«bas mainīšana ietekmÄ“s visus atzarojumus.) clone_helper=NepiecieÅ¡ama palÄ«dzÄ«ba klonēšanÄ? ApmeklÄ“ palÄ«dzÄ«bas sadaļu. -fork_repo=AtdalÄ«t repozitoriju -fork_from=AtdalÄ«t no -already_forked=Repozitorijs %s jau ir atdalÄ«ts -fork_to_different_account=AtdalÄ«t uz citu kontu -fork_visibility_helper=AtdalÄ«tam repozitorijam nav iespÄ“jams mainÄ«t tÄ redzamÄ«bu. -fork_branch=Atzars, ko klonÄ“t atdalÄ«tajÄ repozitorijÄ -all_branches=Visi atzari -fork_no_valid_owners=Å im repozitorijam nevar izveidot atdalÄ«tu repozitoriju, jo tam nav spÄ“kÄ esoÅ¡u Ä«paÅ¡nieku. +fork_repo=Izveidot glabÄtavas atzarojumu +fork_from=Izveidot atzarojumu no +already_forked=Jau ir atzarojums no %s +fork_to_different_account=Izveidot atzarojumu citÄ kontÄ +fork_visibility_helper=Atzarotas glabÄtavas redzamÄ«bu nevar mainÄ«t. +fork_branch=Zars, kas ir klonÄ“jams atzarojumÄ +all_branches=Visi zari +fork_no_valid_owners=Å ai glabÄtavai nevar izveidot atzarojumus, jo tai nav derÄ«gu Ä«paÅ¡nieku. use_template=Izmantot Å¡o sagatavi clone_in_vsc=AtvÄ“rt VS Code download_zip=LejupielÄdÄ“t ZIP download_tar=LejupielÄdÄ“t TAR.GZ download_bundle=LejupielÄdÄ“t BUNDLE -generate_repo=Ä¢enerÄ“t repozitoriju -generate_from=Ä¢enerÄ“t no +generate_repo=Izveidot glabÄtavu +generate_from=Izveidot no repo_desc=Apraksts -repo_desc_helper=Ievadiet Ä«su aprakstu (neobligÄts) +repo_desc_helper=Īss apraksts (pÄ“c izvÄ“les) repo_lang=Valoda -repo_gitignore_helper=IzvÄ“lieties .gitignore sagatavi. -repo_gitignore_helper_desc=IzvÄ“lieties kÄdi faili netiks glabÄti repozitorijÄ no sagatavÄ“m biežÄk lietotÄjÄm valodÄm. PÄ“c noklusÄ“juma .gitignore iekļauj valodu kompilÄcijas rÄ«ku artifaktus. -issue_labels=ProblÄ“mu etiÄ·etes -issue_labels_helper=IzvÄ“lieties problÄ“mu etiÄ·eÅ¡u kopu. +repo_gitignore_helper=AtlasÄ«t .gitignore sagataves +repo_gitignore_helper_desc=No izplatÄ«tu valodu sagatavju saraksta jÄizvÄ“las, kuras datnes neiekļaut. PÄ“c noklusÄ“juma katras valodas bÅ«vēšanas rÄ«ku izveidotie ierastie artefakti ir iekļauti .gitignore. +issue_labels=IezÄ«mes +issue_labels_helper=AtlasÄ«t iezÄ«mju kopu license=Licence -license_helper=IzvÄ“lieties licences failu. -license_helper_desc=Licence nosaka, ko citi var un ko nevar darÄ«t ar Å¡o kodu. Neesat pÄrliecintÄts, kÄdu izvÄ“lÄ“ties Å¡im projektam? AplÅ«kojiet licences izvÄ“le. +license_helper=AtlasÄ«t licences datni +license_helper_desc=Licence nosaka, ko citi var un ko nevar darÄ«t ar kodu. Nav skaidrs, kura ir vispiemÄ“rotÄkÄ projektam? SkatÄ«t Licences izvÄ“le. readme=LASIMANI -readme_helper=IzvÄ“lieties LASIMANI faila sagatavi. -readme_helper_desc=Å ajÄ vietÄ ir iespÄ“jams detalizÄ“ti aprakstÄ«t Å¡o projektu. -auto_init=InicializÄ“t repozitoriju (Pievieno .gitignore, licenci un README) +readme_helper=AtlasÄ«t README datnes sagatavi +readme_helper_desc=Å Ä« ir vieta, kurÄ var ievietot izvÄ“rstu aprakstu par projektu. +auto_init=SÄknÄ“t glabÄtavu trust_model_helper=IzvÄ“lieties parakstu pÄrbaudes uzticamÄ«bas modeli. IespÄ“jamie varianti ir: trust_model_helper_collaborator=LÄ«dzstrÄdnieka: UzticÄ“ties lÄ«dzstrÄdnieku parakstiem trust_model_helper_committer=RevÄ«zijas iesÅ«tÄ«tÄja: UzticÄ“ties parakstiem, kas atbilst revÄ«zijas iesÅ«tÄ«tÄjam trust_model_helper_collaborator_committer=LÄ«dzstrÄdnieka un revÄ«zijas iesÅ«tÄ«tÄja: UzticÄ“ties lÄ«dzstrÄdnieku parakstiem, kas atbilst revÄ«zijas iesÅ«tÄ«tÄjam trust_model_helper_default=NoklusÄ“tais: Izmantojiet šī servera noklusÄ“to uzticamÄ«bas modeli -create_repo=Izveidot repozitoriju -default_branch=NoklusÄ“tais atzars +create_repo=Izveidot glabÄtavu +default_branch=NoklusÄ“juma zars default_branch_label=noklusÄ“juma -default_branch_helper=NoklusÄ“tais atzars nosaka pamata atzaru uz kuru tiks veidoti izmaiņu pieprasÄ«jumi un koda revÄ«ziju iesÅ«tīšana. +default_branch_helper=NoklusÄ“juma zars ir pamata zars izmaiņu pieprasÄ«jumiem un koda iesÅ«tÄ«jumiem. mirror_prune=Izmest -mirror_prune_desc=IzdzÄ“st visas ÄrÄ“jÄs atsauces, kas ÄrÄ“jÄ repozitorijÄ vairs neeksistÄ“ -mirror_interval=SpoguļoÅ¡anas intervÄls (derÄ«gas laika vienÄ«bas ir 'h', 'm', 's'). NorÄdiet 0, lai atslÄ“gtu periodisku spoguļoÅ¡anu. (MinimÄlais intervÄls: %s) -mirror_interval_invalid=Nekorekts spoguļoÅ¡anas intervÄls. -mirror_sync_on_commit=SinhronizÄ“t, kad revÄ«zijas tiek iesÅ«tÄ«tas -mirror_address=Spoguļa adrese -mirror_address_desc=PieslÄ“gÅ¡anÄs rekvizÄ«tus norÄdiet autorizÄcijas sadaļÄ. +mirror_prune_desc=Noņemt novecojuÅ¡as attÄlÄs izsekoÅ¡anas atsauces +mirror_interval=Starplaiks starp spoguļoÅ¡anu (derÄ«gas laika vienÄ«bas ir 'h', 'm', 's'). 0, lai atslÄ“gtu atkÄrtojoÅ¡os sinhronizēšanu. (MazÄkais pieļaujamais laika posms: %s) +mirror_interval_invalid=Starplaiks starp spoguļoÅ¡anu nav derÄ«gs. +mirror_sync_on_commit=SinhronizÄ“t, kad tiek aizgÄdÄti iesÅ«tÄ«jumi +mirror_address=KlonÄ“t no URL +mirror_address_desc=NepiecieÅ¡amie pieslÄ“gÅ¡anÄs dati jÄnorÄda pilnvaroÅ¡anas sadaļÄ. mirror_address_url_invalid=NorÄdÄ«tais URL ir nederÄ«gs. Visas URL daļas ir jÄnorÄda pareizi. mirror_address_protocol_invalid=NorÄdÄ«tais URL ir nederÄ«gs. Var spoguļot tikai no http(s):// vai git:// adresÄ“m. -mirror_lfs=Lielu failu glabÄtuve (LFS) -mirror_lfs_desc=AktivizÄ“t LFS datu spoguļoÅ¡anu. +mirror_lfs=Lielu datņu krÄtuve (LFS) +mirror_lfs_desc=AktivÄ“t LFS datu spoguļoÅ¡anu. mirror_lfs_endpoint=LFS galapunkts -mirror_lfs_endpoint_desc=SinhronizÄcija mēģinÄs izmantot klonÄ“sanas URL, lai noteiktu LFS serveri. Var norÄdÄ«t arÄ« citu galapunktu, ja repozitorija LFS dati ir izvietoti citÄ vietÄ. -mirror_last_synced=PÄ“dÄ“jo reizi sinhronizÄ“ts +mirror_lfs_endpoint_desc=Sinhronizēšana mēģinÄs izmantot klonÄ“sanas URL, lai noteiktu LFS serveri. Var norÄdÄ«t arÄ« citu galapunktu, ja glabÄtavas LFS dati tiek glabÄti kaut kur citur. +mirror_last_synced=PÄ“dÄ“jo reizi sinhronizÄ“ta mirror_password_placeholder=(bez izmaiņÄm) mirror_password_blank_placeholder=(nav uzstÄdÄ«ts) -mirror_password_help=Nomainiet lietotÄju, lai izdzÄ“stu saglabÄto paroli. -watchers=NovÄ“rotÄji -stargazers=ZvaigžņdevÄ“ji -stars_remove_warning=Å is repozitorijs tiks noņemts no visÄm izlasÄ“m. -forks=AtdalÄ«tie repozitoriji +mirror_password_help=JÄnomaina lietotÄjvÄrds, lai izdzÄ“stu saglabÄto paroli. +watchers=VÄ“rotÄji +stargazers=Zvaigžņu vÄ“rotÄji +stars_remove_warning=Å Ä« glabÄtava tiks izņemta no visÄm izlasÄ“m. +forks=Atzarojumi reactions_more=un vÄ“l %d -unit_disabled=Administrators ir atspÄ“jojies Å¡o repozitorija sadaļu. +unit_disabled=Vietnes pÄrvaldÄ«tÄjs ir atspÄ“jojis Å¡o glabÄtavas sadaļu. language_other=Citas -adopt_search=Ievadiet lietotÄja vÄrdu, lai meklÄ“tu nepÄrņemtos repozitorijus... (atstÄjiet tukÅ¡u, lai meklÄ“tu visus) -adopt_preexisting_label=PÄrņemt failus -adopt_preexisting=PÄrņemt jau eksistÄ“joÅ¡os failus -adopt_preexisting_content=Izveidot repozitoriju no direktorijas %s -adopt_preexisting_success=PÄrņemti faili un izveidots repozitorijs no %s -delete_preexisting_label=DzÄ“st -delete_preexisting=DzÄ“st jau eksistÄ“joÅ¡os failus -delete_preexisting_content=DzÄ“st failus direktorijÄ %s -delete_preexisting_success=DzÄ“st nepÄrņemtos failus direktorijÄ %s -blame_prior=AplÅ«kot vainÄ«go par izmaiņÄm pirms šīs revÄ«zijas -blame.ignore_revs=Neņem vÄ“rÄ izmaiņas no .git-blame-ignore-revs. Nospiediet Å¡eit, lai to apietu un redzÄ“tu visu izmaiņu skatu. +adopt_search=JÄievada lietotÄjvÄrds, lai meklÄ“tu nepieņemtÄs glabÄtavas… (atstÄt tukÅ¡u, lai atrastu visas) +adopt_preexisting_label=PÄrņemt datnes +adopt_preexisting=Pieņemt jau esoÅ¡as datnes +adopt_preexisting_content=Izveidot glabÄtavu no %s +adopt_preexisting_success=Pieņemtas datnes un izveidota glabÄtava no %s +delete_preexisting_label=IzdzÄ“st +delete_preexisting=IzdzÄ“st jau esoÅ¡as datnes +delete_preexisting_content=IzdzÄ“st datnes no %s +delete_preexisting_success=IzdzÄ“st nepieņemtÄs datnes no %s +blame_prior=ApskatÄ«t izmaiņu veicÄ“jus pirms šīm izmaiņÄm +blame.ignore_revs=Neņem vÄ“rÄ izmaiņas no .git-blame-ignore-revs. KlikšķinÄt Å¡eit, lai to apietu un redzÄ“tu ierasto uzrÄdīšanas skatu. blame.ignore_revs.failed=NeizdevÄs neņemt vÄ“rÄ izmaiņas no .git-blam-ignore-revs. author_search_tooltip=Tiks attÄ“loti ne vairÄk kÄ 30 lietotÄji -tree_path_not_found_commit=RevÄ«zijÄ %[2]s neeksistÄ“ ceļš %[1]s -tree_path_not_found_branch=AtzarÄ %[2]s nepastÄv ceļš %[1]s -tree_path_not_found_tag=TagÄ %[2]s nepastÄv ceļš %[1]s +tree_path_not_found_commit=IesÅ«tÄ«jumÄ %[2]s nepastÄv ceļš %[1]s +tree_path_not_found_branch=ZarÄ %[2]s nepastÄv ceļš %[1]s +tree_path_not_found_tag=BirkÄ %[2]s nepastÄv ceļš %[1]s -transfer.accept=ApstiprinÄt Ä«paÅ¡nieka maiņu +transfer.accept=Pieņemt nodoÅ¡anu transfer.accept_desc=`MainÄ«t Ä«paÅ¡nieku uz "%s"` -transfer.reject=NoraidÄ«t Ä«paÅ¡nieka maiņu +transfer.reject=NoraidÄ«t nodoÅ¡anu transfer.reject_desc=`Atcelt Ä«paÅ¡nieka maiņu uz "%s"` -transfer.no_permission_to_accept=Nav atļaujas pieņemt Å¡o pÄrsÅ«tīšanu. -transfer.no_permission_to_reject=Nav atļaujas noraidÄ«t Å¡o pÄrsÅ«tīšanu. +transfer.no_permission_to_accept=Nav atļaujas pieņemt Å¡o nodoÅ¡anu. +transfer.no_permission_to_reject=Nav atļaujas noraidÄ«t Å¡o nodoÅ¡anu. desc.private=PrivÄts -desc.public=Publisks +desc.public=AtklÄts desc.template=Sagatave desc.internal=Iekšējs desc.archived=ArhivÄ“ts desc.sha256=SHA256 -template.items=Sagataves ieraksti -template.git_content=Git saturs (noklusÄ“tais atzars) -template.git_hooks=Git ÄÄ·i -template.git_hooks_tooltip=PÄ“c repozitorija izveidoÅ¡anas, Jums nav tiesÄ«bu mainÄ«t Git ÄÄ·us. AtzÄ«mÄ“jiet Å¡o tikai, ja uzticaties sagataves repozitorija saturam. -template.webhooks=TÄ«mekļa ÄÄ·i +template.items=Sagataves vienumi +template.git_content=Git saturs (noklusÄ“juma zars) +template.git_hooks=Git aizÄ·eres +template.git_hooks_tooltip=Å obrÄ«d nav iespÄ“jams pÄ“c pievienoÅ¡anas mainÄ«t vai noņemt Git aizÄ·eres. AtlasÄ«t Å¡o tikai tad, ja ir uzticÄ«ba sagataves glabÄtavai. +template.webhooks=TÄ«mekļa aizÄ·eres template.topics=TÄ“mas template.avatar=Profila attÄ“ls -template.issue_labels=ProblÄ“mu etiÄ·etes -template.one_item=NorÄdiet vismaz vienu sagataves vienÄ«bu -template.invalid=NorÄdiet sagataves repozitoriju +template.issue_labels=Pieteikumu iezÄ«mes +template.one_item=JÄatlasa vismaz viens sagataves vienums +template.invalid=JÄatlasa sagataves glabÄtava -archive.title=Å is repozitorijs ir arhivÄ“ts. Ir iespÄ“jams aplÅ«kot tÄ failus un to konÄ“t, bet nav iespÄ“jams iesÅ«tÄ«t izmaiņas, kÄ arÄ« izveidot jaunas problÄ“mas vai izmaiņu pieprasÄ«jumus. -archive.title_date=Å is repozitorijs tika arhivÄ“ts %s. Ir iespÄ“jams aplÅ«kot tÄ failus un to konÄ“t, bet nav iespÄ“jams iesÅ«tÄ«t izmaiņas, kÄ arÄ« izveidot jaunas problÄ“mas vai izmaiņu pieprasÄ«jumus. -archive.issue.nocomment=Repozitorijs ir arhivÄ“ts. ProblÄ“mÄm nevar pievienot jaunus komentÄrus. -archive.pull.nocomment=Repozitorijs ir arhivÄ“ts. Izmaiņu pieprasÄ«jumiem nevar pievienot jaunus komentÄrus. +archive.title=Å Ä« glabÄtava ir arhivÄ“ta. TajÄ var apskatÄ«t datnes, un to var klonÄ“t, bet tajÄ nevar veikt jebkÄdas izmaiņas, piemÄ“ram, aizgÄdÄt izmaiņas un izveidot jaunus pieteikumus, izmaiņu pieprasÄ«jumus vai piebildes. +archive.title_date=Å Ä« glabÄtava tika arhivÄ“ta %s. TajÄ var apskatÄ«t datnes, un to var klonÄ“t, bet tajÄ nevar veikt jebkÄdas izmaiņas, piemÄ“ram, aizgÄdÄt izmaiņas un izveidot pieteikumus, izmaiņu pieprasÄ«jumus vai piebildes. +archive.issue.nocomment=Å Ä« glabÄtava ir arhivÄ“ta. Pieteikumiem nevar pievienot piebildes. +archive.pull.nocomment=Å Ä« glabÄtava ir arhivÄ“ta. Izmaiņu pieprasÄ«jumiem nevar pievienot piebildes. -form.reach_limit_of_creation_1=Sasniegts Jums noteiktais %d repozitorija ierobežojums. -form.reach_limit_of_creation_n=Sasniegts Jums noteiktais %d repozitoriju ierobežojums. -form.name_reserved=Repozitorija nosaukums "%s" ir jau rezervÄ“ts. -form.name_pattern_not_allowed=Repozitorija nosaukums "%s" nav atļauts. +form.reach_limit_of_creation_1=ĪpaÅ¡nieks jau ir sasniedzis %d glabÄtavas ierobežojumu. +form.reach_limit_of_creation_n=ĪpaÅ¡nieks jau ir sasniedzis %d glabÄtavu ierobežojumu. +form.name_reserved=GlabÄtavas nosaukums "%s" ir aizņemts. +form.name_pattern_not_allowed="%s" nav ļauts izmantot glabÄtavas nosaukumÄ. -need_auth=AutorizÄcija -migrate_options=MigrÄcijas opcijas +need_auth=PilnvaroÅ¡ana +migrate_options=PÄrcelÅ¡anas iespÄ“jas migrate_service=MigrÄcijas serviss -migrate_options_mirror_helper=Å is repozitorijs bÅ«s spogulis -migrate_options_lfs=MigrÄ“t LFS failus +migrate_options_mirror_helper=Å Ä« glabÄtava bÅ«s spoguļglabÄtava +migrate_options_lfs=PÄrcelt LFS datnes migrate_options_lfs_endpoint.label=LFS galapunkts -migrate_options_lfs_endpoint.description=MigrÄcija mēģinÄs izmantot attÄlinÄto URL, lai noteiktu LFS serveri. Var norÄdÄ«t arÄ« citu galapunktu, ja repozitorija LFS dati ir izvietoti citÄ vietÄ. +migrate_options_lfs_endpoint.description=PÄrcelÅ¡ana mēģinÄs izmantot attÄlo Git, lai noteiktu LFS serveri. Var arÄ« norÄdÄ«t pielÄgotu galapunktu, ja glabÄtavas LFS dati tiek glabÄti kaut kur citur. migrate_options_lfs_endpoint.description.local=IespÄ“jams norÄdÄ«t arÄ« servera ceļu. migrate_options_lfs_endpoint.placeholder=Ja nav norÄdÄ«ts, galamÄ“rÄ·is tiks atvasinÄts no klonēšanas URL -migrate_items=VienÄ«bas, ko pÄrņemt +migrate_items=PÄrcelÅ¡anas vienumi migrate_items_wiki=Vikivietni migrate_items_milestones=Atskaites punktus -migrate_items_labels=EtiÄ·etes -migrate_items_issues=ProblÄ“mas +migrate_items_labels=IezÄ«mes +migrate_items_issues=Pieteikumi migrate_items_pullrequests=Izmaiņu pieprasÄ«jumus -migrate_items_merge_requests=SapludinÄÅ¡anas pieprasÄ«jumi +migrate_items_merge_requests=IekļauÅ¡anas pieprasÄ«jumi migrate_items_releases=Laidienus -migrate_repo=MigrÄ“t repozitoriju -migrate.clone_address=Klonēšanas adrese -migrate.clone_address_desc=TÄ var bÅ«t HTTP(S) adrese vai Git 'clone' URL eksistÄ“joÅ¡am repozitorijam -migrate.github_token_desc=Ir iespÄ“jams izmantot vienu vai ar komantiem atdalÄ«tus vairÄkas pilnvaras, lai veiktu ÄtrÄku migrÄciju, ja tÄ tiek ierobežota ar GitHub API ierobežojumiem. BRĪDINÄ€JUMS: Å Ä«s iespÄ“jas ļaunprÄtÄ«ga izmantoÅ¡ana, var tikt uzskatÄ«ta par lietoÅ¡anas noteikumu pÄrkÄpumu ar no tÄ izrietoÅ¡Äm sekÄm. +migrate_repo=PÄrcelt glabÄtavu +migrate.clone_address=PÄrcelt/klonÄ“t no URL +migrate.clone_address_desc=EsoÅ¡as glabÄtavas HTTP(S) vai Git "clone" URL +migrate.github_token_desc=Å eit var pievienot vienu vai vairÄkas ar komatiem atdalÄ«tas pilnvaras, lai pÄrcelÅ¡ana bÅ«tu ÄtrÄka, ja tÄ tiek ierobežota no GitHub API puses. UzmanÄ«bu: šīs iespÄ“jas ļaunprÄtÄ«ga izmantoÅ¡ana var pÄrkÄpt pakalpojumu sniedzÄ“ja noteikumus un novest pie piekļuves liegÅ¡anas kontam. migrate.clone_local_path=vai servera lokÄlais ceļš -migrate.permission_denied=Jums nav tiesÄ«bu importÄ“t lokÄlu repozitoriju. -migrate.permission_denied_blocked=Nav iespÄ“jams importÄ“t no neatļautÄm adresÄ“m, prasiet administratoram pÄrskatÄ«t ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS iestatÄ«jumus. -migrate.invalid_local_path=NederÄ«gs lokÄlais ceļš. Tas neeksistÄ“ vai nav direktorija. -migrate.invalid_lfs_endpoint=LFS galapunkts nav korekts. -migrate.failed=MigrÄcija neizdevÄs: %v -migrate.migrate_items_options=Piekļuves pilnvara ir nepiecieÅ¡ams, lai migrÄ“tu papildus datus -migrated_from=MigrÄ“ts no %[2]s -migrated_from_fake=MigrÄ“ts no %[1]s -migrate.migrate=MigrÄ“t no %s -migrate.migrating=MigrÄcija no %s ... -migrate.migrating_failed=MigrÄcija no %s neizdevÄs. -migrate.migrating_failed.error=MigrÄcija neizdevÄs: %s -migrate.migrating_failed_no_addr=MigrÄcija neizdevÄs. -migrate.github.description=MigrÄ“t datus no github.com vai citÄm GitHub instancÄ“m. -migrate.git.description=MigrÄ“t repozitorija datus no jebkura Git servisa. -migrate.gitlab.description=MigrÄ“t datus no gitlab.com vai citÄm GitLab instancÄ“m. -migrate.gitea.description=MigrÄ“t datus no gitea.com vai citÄm Gitea/Forgejo instancÄ“m. -migrate.gogs.description=MigrÄ“t datus no notabug.org vai citÄm Gogs instancÄ“m. -migrate.onedev.description=MigrÄ“t datus no code.onedev.io vai citÄm OneDev instancÄ“m. -migrate.codebase.description=MigrÄ“t datus no codebasehq.com. -migrate.gitbucket.description=MigrÄ“t datus no GitBucket instancÄ“m. -migrate.migrating_git=MigrÄ“ git datus -migrate.migrating_topics=MigrÄ“ tÄ“mas -migrate.migrating_milestones=MigrÄ“ atskaites punktus -migrate.migrating_labels=MigrÄ“ etiÄ·etes -migrate.migrating_releases=MigrÄ“ laidienus -migrate.migrating_issues=MigrÄcijas problÄ“mas -migrate.migrating_pulls=MigrÄ“ izmaiņu pieprasÄ«jumus -migrate.cancel_migrating_title=Atcelt migrÄciju -migrate.cancel_migrating_confirm=Vai patieÅ¡am vÄ“laties atcelt Å¡o migrÄciju? +migrate.permission_denied=Nav ļauts ievietot vietÄ“jas glabÄtavas. +migrate.permission_denied_blocked=Nav iespÄ“jams ievietot no neatļautiem saimniekdatoriem, lÅ«gums vaicÄt pÄrvaldÄ«tÄjam pÄrbaudÄ«t ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS iestatÄ«jumus. +migrate.invalid_local_path=NederÄ«gs vietÄ“jais ceļš. Tas nepastÄv vai nenorÄda uz mapi. +migrate.invalid_lfs_endpoint=LFS galapunkts nav derÄ«gs. +migrate.failed=PÄrcelÅ¡ana neizdevÄs: %v +migrate.migrate_items_options=Ir nepiecieÅ¡ama piekļuves pilnvara, lai pÄrceltu papildu vienumus +migrated_from=PÄrcelta no %[2]s +migrated_from_fake=PÄrcelta no %[1]s +migrate.migrate=PÄrcelt no %s +migrate.migrating=PÄrceļ no %s … +migrate.migrating_failed=PÄrcelÅ¡ana no %s neizdevÄs. +migrate.migrating_failed.error=NeizdevÄs pÄrcelt: %s +migrate.migrating_failed_no_addr=PÄrcelÅ¡ana neizdevÄs. +migrate.github.description=PÄrcelt datus no github.com vai GitHub Enterprise servera. +migrate.git.description=PÄrcelt tikai glabÄtavu no jebkura Git pakalpojuma. +migrate.gitlab.description=PÄrcelt datus no gitlab.com vai citiem GitLab serveriem. +migrate.gitea.description=PÄrcelt datus no gitea.com vai citiem Gitea serveriem. +migrate.gogs.description=PÄrcelt datus no notabug.org vai citiem Gogs serveriem. +migrate.onedev.description=PÄrcelt datus no code.onedev.io vai citiem OneDev serveriem. +migrate.codebase.description=PÄrcelt datus no codebasehq.com. +migrate.gitbucket.description=PÄrcelt datus no GitBucket serveriem. +migrate.migrating_git=PÄrceļ Git datus +migrate.migrating_topics=PÄrceļ tÄ“mas +migrate.migrating_milestones=PÄrceļ atskaites punktus +migrate.migrating_labels=PÄrceļ iezÄ«mes +migrate.migrating_releases=PÄrceļ laidienus +migrate.migrating_issues=PÄrnes pieteikumus +migrate.migrating_pulls=PÄrceļ izmaiņu pieprasÄ«jumus +migrate.cancel_migrating_title=Atcelt pÄrcelÅ¡anu +migrate.cancel_migrating_confirm=Vai atcelt Å¡o pÄrcelÅ¡anu? -mirror_from=spogulis no -forked_from=atdalÄ«ts no -generated_from=Ä£enerÄ“ts no -fork_from_self=Nav iespÄ“jams atdalÄ«t repozitoriju, kuram esat Ä«paÅ¡nieks. -fork_guest_user=Piesakieties, lai atdalÄ«tu repozitoriju. -watch_guest_user=Piesakieties, lai sekotu Å¡im repozitorijam. -star_guest_user=Piesakieties, lai pievienotu Å¡o repozitoriju izlasei. +mirror_from=spoguļota no +forked_from=atzarota no +generated_from=izveidots no +fork_from_self=Nevar izveidot sev piederoÅ¡as glabÄtavas atzarojumu. +fork_guest_user=JÄpiesakÄs, lai izveidotu šīs glabÄtavas atzarojumu. +watch_guest_user=JÄpiesakÄs, lai vÄ“rotu Å¡o glabÄtavu. +star_guest_user=JÄpiesakÄs, lai pievienotu Å¡o glabÄtavu izlasei. unwatch=NevÄ“rot watch=VÄ“rot -unstar=Noņemt zvaigznÄ«ti +unstar=Noņemt no izlases star=Pievienot izlasei -fork=AtdalÄ«ts -download_archive=LejupielÄdÄ“t repozitoriju +fork=Atzarojums +download_archive=LejupielÄdÄ“t glabÄtavu more_operations=VairÄk darbÄ«bu no_desc=Nav apraksta quick_guide=Īsa pamÄcÄ«ba -clone_this_repo=KlonÄ“t Å¡o repozitoriju -cite_this_repo=CitÄ“t Å¡o repozitoriju -create_new_repo_command=Izveidot jaunu repozitoriju komandrindÄ -push_exist_repo=NosÅ«tÄ«t izmaiņas no komandrindas eksistÄ“joÅ¡am repozitorijam -empty_message=Repozitorijs ir tukÅ¡s. -broken_message=Git repozitoriju nav iespÄ“jams nolasÄ«t. Sazinieties ar šī servera administratoru vai izdzÄ“siet Å¡o repozitoriju. +clone_this_repo=KlonÄ“t Å¡o glabÄtavu +cite_this_repo=Atsaukties uz Å¡o glabÄtavu +create_new_repo_command=Jaunas glabÄtavas izveidoÅ¡ana komandrindÄ +push_exist_repo=EsoÅ¡as glabÄtavas izmaiņu aizgÄdÄÅ¡ana no komandrindas +empty_message=Å ajÄ glabÄtavÄ nav nekÄda satura. +broken_message=Å Ä«s glabÄtavas Git datus nevar nolasÄ«t. JÄsazinÄs ar šī servera pÄrvaldÄ«tÄju vai jÄizdzēš šī glabÄtava. code=Kods -code.desc=Piekļūt pirmkodam, failiem, revÄ«zijÄm un atzariem. -branch=Atzars +code.desc=Piekļuve pirmkodam, datnÄ“m, iesÅ«tÄ«jumiem un zariem. +branch=Zars tree=Koks clear_ref=`NotÄ«rÄ«t paÅ¡reizÄ“jo atsauci` -filter_branch_and_tag=FiltrÄ“t atzarus vai tagus -find_tag=Atrast tagu -branches=Atzari -tags=Tagi -issues=ProblÄ“mas +filter_branch_and_tag=AtlasÄ«t zaru vai birku +find_tag=Atrast birku +branches=Zari +tags=Birkas +issues=Pieteikumi pulls=Izmaiņu pieprasÄ«jumi project_board=Projekti packages=Pakotnes actions=DarbÄ«bas -labels=EtiÄ·etes -org_labels_desc=OrganizÄcijas lÄ«meņa etiÄ·etes var tikt izmantotas visiem repozitorijiem Å¡ajÄ organizÄcijÄ +labels=IezÄ«mes +org_labels_desc=ApvienÄ«bas lÄ«meņa iezÄ«mes var tikt izmantotas šīs apvienÄ«bas visÄs glabÄtavÄs org_labels_desc_manage=pÄrvaldÄ«t milestones=Atskaites punkti -commits=RevÄ«zijas -commit=RevÄ«zija +commits=IesÅ«tÄ«jumi +commit=IesÅ«tÄ«jums release=Laidiens releases=Laidieni -tag=Tags +tag=Birka released_this=izveidoja Å¡o laidienu tagged_this=izveidoja tagu revÄ«zijai -file.title=%s atzarÄ %s -file_raw=NeapstrÄdÄts +file.title=%s zarÄ %s +file_raw=NeapstrÄdÄta file_history=VÄ“sture file_view_source=SkatÄ«t avotu -file_view_rendered=SkatÄ«t rezultÄtu -file_view_raw=RÄdÄ«t neapstrÄdÄtu +file_view_rendered=SkatÄ«t atveidojumu +file_view_raw=ApskatÄ«t neapstrÄdÄtu file_permalink=PatstÄvÄ«gÄ saite -file_too_large=Å is fails ir par lielu, lai to parÄdÄ«tu. -invisible_runes_header=`Å Ä«s fails satur neredzamus unikoda simbolus` -invisible_runes_description=`Å is fails satur neredzamus unikoda simbolus, kas ir neatšķirami cilvÄ“kiem, bet dators tÄs var atstrÄdÄt atšķirÄ«gi. Ja šķiet, ka tas ir ar nolÅ«ku, Å¡o brÄ«dinÄjumu var droÅ¡i neņemt vÄ“rÄ. JÄizmanto atsoļa taustiņš (Esc), lai atklÄtu tÄs.` -ambiguous_runes_header=`Å is fails satur neviennozÄ«mÄ«gus unikoda simbolus` -ambiguous_runes_description=`Å is fails satur unikoda simbolus, kas var tikt sajauktas ar citÄm rakstzÄ«mÄ“m. Ja šķiet, ka tas ir ar nolÅ«ku, Å¡o brÄ«dinÄjumu var droÅ¡i neņemt vÄ“rÄ. JÄizmanto atsoļa taustiņš (Esc), lai atklÄtu tÄs.` -invisible_runes_line=`Å Ä« lÄ«nija satur neredzamus unikoda simbolus` -ambiguous_runes_line=`Å Ä« lÄ«nija satur neviennozÄ«mÄ«gus unikoda simbolus` +file_too_large=Datne ir pÄrÄk liela, lai to parÄdÄ«tu. +invisible_runes_header=Å Ä« datne satur neredzamas unikoda rakstzÄ«mes +invisible_runes_description=`Å Ä« datne satur neredzamas unikoda rakstzÄ«mes, kas ir neatšķiramas cilvÄ“kiem, bet dators tÄs var apstrÄdÄt atšķirÄ«gi. Ja šķiet, ka tas ir ar nolÅ«ku, Å¡o brÄ«dinÄjumu var droÅ¡i neņemt vÄ“rÄ. JÄizmanto atsoļa taustiņš (Esc), lai atklÄtu tÄs.` +ambiguous_runes_header=`Å Ä« datne satur neviennozÄ«mÄ«gas unikoda rakstzÄ«mes` +ambiguous_runes_description=`Å Ä« datne satur unikoda rakstzÄ«mes, kas var tikt sajauktas ar citÄm rakstzÄ«mÄ“m. Ja šķiet, ka tas ir ar nolÅ«ku, Å¡o brÄ«dinÄjumu var droÅ¡i neņemt vÄ“rÄ. JÄizmanto atsoļa taustiņš (Esc), lai tÄs atklÄtu.` +invisible_runes_line=`Å ajÄ rindÄ ir neredzamas unikoda rakstzÄ«mes` +ambiguous_runes_line=`Å ajÄ rindÄ ir neviennozÄ«mÄ«gas unikoda rakstzÄ«mes` ambiguous_character=`%[1]c [U+%04[1]X] var tikt sajaukts ar %[2]c [U+%04[2]X]` escape_control_characters=KodÄ“t unescape_control_characters=AtkodÄ“t -file_copy_permalink=KopÄ“t saiti -view_git_blame=AplÅ«kot Git vainÄ«gos -video_not_supported_in_browser=JÅ«su pÄrlÅ«ks neatbalsta HTML5 video. -audio_not_supported_in_browser=JÅ«su pÄrlÅ«ks neatbalsta HTML5 audio. +file_copy_permalink=Ievietot pastÄvÄ«go saiti starpliktuvÄ“ +view_git_blame=ApskatÄ«t Git izmaiņu veicÄ“jus +video_not_supported_in_browser=PÄrlÅ«ks neatbalsta HTML5 tagu "video". +audio_not_supported_in_browser=PÄrlÅ«ks neatbalsta HTML5 tagu "audio". stored_lfs=SaglabÄts Git LFS +stored_annex=SaglabÄts Git Annex symbolic_link=Simboliska saite -executable_file=IzpildÄmais fails -commit_graph=RevÄ«ziju grafs -commit_graph.select=IzvÄ“lieties atzarus +executable_file=IzpildÄma datne +commit_graph=IesÅ«tÄ«jumu karte +commit_graph.select=AtlasÄ«t zarus commit_graph.hide_pr_refs=PaslÄ“pt izmaiņu pieprasÄ«jumus commit_graph.monochrome=Melnbalts commit_graph.color=KrÄsa -commit.contained_in=Å Ä« revÄ«zija ir iekļauta: -commit.contained_in_default_branch=Å Ä« revÄ«zija ir daļa no noklusÄ“tÄ atzara -commit.load_referencing_branches_and_tags=IelÄdÄ“t atzarus un tagus, kas atsaucas uz Å¡o revÄ«ziju -blame=Vainot -download_file=LejupielÄdÄ“t failu +commit.contained_in=Å is iesÅ«tÄ«jums ir iekļauts: +commit.contained_in_default_branch=Å is iesÅ«tÄ«jums ir daļa no noklusÄ“juma zara +commit.load_referencing_branches_and_tags=IelÄdÄ“t zarus un birkas, kas atsaucas uz Å¡o iesÅ«tÄ«jumu +blame=UzrÄdÄ«t +download_file=LejupielÄdÄ“t datni normal_view=Parastais skats line=rinda lines=rindas -from_comment=(komentÄrs) +from_comment=(piebilde) -editor.add_file=Pievienot +editor.add_file=Pievienot datni editor.new_file=Jauna datne -editor.upload_file=AugÅ¡upielÄdÄ“t failu -editor.edit_file=Labot failu +editor.upload_file=AugÅ¡upielÄdÄ“t datni +editor.edit_file=Labot datni editor.preview_changes=PriekÅ¡skatÄ«t izmaiņas -editor.cannot_edit_lfs_files=LFS failus nevar labot no tÄ«mekļa saskarnes. -editor.cannot_edit_non_text_files=Nav iespÄ“jams labot binÄros failus no pÄrlÅ«ka saskarnes. -editor.edit_this_file=Labot failu -editor.this_file_locked=Fails ir bloÄ·Ä“ts -editor.must_be_on_a_branch=Ir jÄbÅ«t izvÄ“lÄ“tam atzaram, lai varÄ“tu veikt vai piedÄvÄt izmaiņas Å¡im failam. -editor.fork_before_edit=Lai varÄ“tu labot failu, ir nepiecieÅ¡ams atdalÄ«t repozitoriju. -editor.delete_this_file=DzÄ“st failu -editor.must_have_write_access=Jums ir jÄbÅ«t rakstīšanas tiesÄ«bÄm, lai varÄ“tu veikt vai piedÄvÄt izmaiņas Å¡im failam. -editor.file_delete_success=Fails "%s" tika izdzÄ“sts. -editor.name_your_file=Ievadiet faila nosaukumu… -editor.filename_help=Lai pievienotu direktoriju, ierakstiet tÄs nosaukumu un slÄ«psvÄ«tru ('/'). Lai noņemtu direktoriju, ielieciet kursoru pirms faila nosaukuma un nospiediet atpakaļatkÄpes taustiņu. +editor.cannot_edit_lfs_files=LFS datnes nevar labot tÄ«mekļa saskarnÄ“. +editor.cannot_edit_annex_files=Annex datnes tÄ«mekļa saskarnÄ“ nevar labot. +editor.cannot_edit_non_text_files=BinÄrÄs datnes nevar labot tÄ«mekļa saskarnÄ“. +editor.edit_this_file=Labot datni +editor.this_file_locked=Datne ir slÄ“gta +editor.must_be_on_a_branch=Ir jÄbÅ«t zarÄ, lai Å¡ajÄ datnÄ“ veiktu vai ierosinÄtu izmaiņas. +editor.fork_before_edit=JÄizveido šīs glabÄtavas atzarojums, lai Å¡ajÄ datnÄ“ veiktu vai ierosinÄtu izmaiņas. +editor.delete_this_file=IzdzÄ“st datni +editor.must_have_write_access=Ir jÄbÅ«t rakstīšanas piekļuvei, lai Å¡ajÄ datnÄ“ veiktu vai ierosinÄtu izmaiņas. +editor.file_delete_success=Datne "%s" tika izdzÄ“sta. +editor.name_your_file=Piešķirt datnei nosaukumu… +editor.filename_help=Mapi var pievienot, ja ieraksta tÄs nosaukumu, aiz kura ir slÄ«psvÄ«tra ("/"). Mapi var noņemt ar atpakaļatkÄpes taustiņa nospieÅ¡anu ievades lauka sÄkumÄ. editor.or=vai editor.cancel_lower=Atcelt -editor.commit_signed_changes=ApstiprinÄt parakstÄ«tu revÄ«ziju -editor.commit_changes=Pabeigt revÄ«ziju -editor.add_tmpl=Pievienot '' +editor.commit_signed_changes=IesÅ«tÄ«t parakstÄ«tas izmaiņas +editor.commit_changes=IesÅ«tÄ«t izmaiņas +editor.add_tmpl=Pievienot "<%s>" +editor.add_tmpl.filename = datnes nosaukums editor.add=Pievienot %s -editor.update=Atjaunot %s -editor.delete=DzÄ“st %s +editor.update=AtjauninÄt %s +editor.delete=IzdzÄ“st %s editor.patch=Pielietot ielÄpu editor.patching=Pielieto ielÄpu: editor.fail_to_apply_patch=`NeizdevÄs pielietot ielÄpu "%s"` editor.new_patch=Jauns ielÄps -editor.commit_message_desc=Pievienot neobligÄtu paplaÅ¡inÄtu aprakstu… -editor.signoff_desc=Pievienot revÄ«zijas žurnÄla ziņojuma beigÄs Signed-off-by ar revÄ«zijas autoru. -editor.commit_directly_to_this_branch=ApstiprinÄt revÄ«zijas izmaiņas atzarÄ %s. -editor.create_new_branch=Izveidot jaunu atzaru un izmaiņu pieprasÄ«jumu Å¡ai revÄ«zijai. -editor.create_new_branch_np=Izveidot jaunu atzaru Å¡ai revÄ«zijai. -editor.propose_file_change=Ieteikt faila izmaiņas -editor.new_branch_name=JaunÄ atzara nosaukums Å¡ai revÄ«zijai -editor.new_branch_name_desc=JaunÄ atzara nosaukums… +editor.commit_message_desc=PÄ“c izvÄ“les var pievienot paplaÅ¡inÄtu aprakstu… +editor.signoff_desc=IesÅ«tÄ«juma žurnÄla ziņojumam pievienot noslÄ“gumu Signed-off-by ar iesÅ«tÄ«tÄju. +editor.commit_directly_to_this_branch=IesÅ«tÄ«t uzreiz zarÄ %[1]s. +editor.create_new_branch=Izveidot Å¡im iesÅ«tÄ«jumam jaunu zaru un uzsÄkt izmaiņu pieprasÄ«jumu. +editor.create_new_branch_np=Izveidot jaunu zaru Å¡im iesÅ«tÄ«jumam. +editor.propose_file_change=IerosinÄt datnes izmaiņas +editor.new_branch_name=Piešķirt nosaukumu šī iesÅ«tÄ«juma jaunajam zaram +editor.new_branch_name_desc=JaunÄ zara nosaukums… editor.cancel=Atcelt -editor.filename_cannot_be_empty=Faila nosaukums nevar bÅ«t tukÅ¡s. -editor.filename_is_invalid=Faila nosaukums "%s" nav korekts. -editor.branch_does_not_exist=Å ajÄ repozitorijÄ neeksistÄ“ atzars "%s". -editor.branch_already_exists=Atzars "%s" Å¡ajÄ repozitorijÄ jau eksistÄ“. -editor.directory_is_a_file=Direktorijas nosaukums "%s" vecÄka ceÄ¼Ä ir fails nevis direktorija Å¡ajÄ repozitorijÄ. -editor.file_is_a_symlink=Fails "%s" ir norÄde, kuru nav iespÄ“jams labot no tÄ«mekļa redaktora -editor.filename_is_a_directory=Faila nosaukums "%s" sakrÄ«t ar direktorijas nosaukumu Å¡ajÄ repozitorijÄ. -editor.file_editing_no_longer_exists=Fails "%s", ko labojat, vairs neeksistÄ“ Å¡ajÄ repozitorijÄ. -editor.file_deleting_no_longer_exists=Fails "%s", ko dzēšat, vairs neeksistÄ“ Å¡ajÄ repozitorijÄ. -editor.file_changed_while_editing=Faila saturs ir mainÄ«jies kopÅ¡ sÄkÄt to labot. Noklikšķiniet Å¡eit, lai apskatÄ«tu, vai NosÅ«tiet izmaiņas atkÄrtoti, lai pÄrrakstÄ«tu. -editor.file_already_exists=Fails ar nosaukumu "%s" Å¡ajÄ repozitorijÄ jau eksistÄ“. -editor.commit_empty_file_header=IesÅ«tÄ«t tukÅ¡u failu -editor.commit_empty_file_text=Fails, ko vÄ“laties iesÅ«tÄ«t, ir tukÅ¡s. Vai turpinÄt? +editor.filename_cannot_be_empty=Datnes nosaukums nevar bÅ«t tukÅ¡s. +editor.filename_is_invalid=Datnes nosaukums "%s" nav derÄ«gs. +editor.branch_does_not_exist=Å ajÄ glabÄtavÄ nav zara "%s". +editor.branch_already_exists=Å ajÄ glabÄtavÄ jau ir zars "%s". +editor.directory_is_a_file=Mapes nosaukums "%s" Å¡ajÄ glabÄtavÄ jau tiek izmantots kÄ datnes nosaukums. +editor.file_is_a_symlink=`"%s" ir simboliska saite. SimboliskÄs saites tÄ«mekļa redaktorÄ nevar labot` +editor.filename_is_a_directory=Datnes nosaukums "%s" Å¡ajÄ glabÄtavÄ jau tiek izmantos kÄ mapes nosaukums. +editor.file_editing_no_longer_exists=Datne, kas tiek labota ("%s"), Å¡ajÄ glabÄtavÄ vairs nepastÄv. +editor.file_deleting_no_longer_exists=Datne, kas tiek izdzÄ“sta ("%s"), Å¡ajÄ glabÄtavÄ vairs nepastÄv. +editor.file_changed_while_editing=Datnes saturs ir mainÄ«jies kopÅ¡ tÄs atvÄ“rÅ¡anas. KlikšķinÄt Å¡eit, lai apskatÄ«tu vai atkÄrtoti iesÅ«tÄ«tu izmaiņas, lai tÄs pÄrrakstÄ«tu. +editor.file_already_exists=Datne ar nosaukumu "%s" jau pastÄv Å¡ajÄ glabÄtavÄ. +editor.commit_empty_file_header=IesÅ«tÄ«t tukÅ¡u datni +editor.commit_empty_file_text=IesÅ«tÄmÄ datne ir tukÅ¡a. TurpinÄt? editor.no_changes_to_show=Nav izmaiņu, ko rÄdÄ«t. -editor.fail_to_update_file=NeizdevÄs atjaunot/izveidot failu "%s". +editor.fail_to_update_file=NeizdevÄs atjauninÄt/izveidot datni "%s". editor.fail_to_update_file_summary=Kļūdas ziņojums: -editor.push_rejected_no_message=Izmaiņu iesÅ«tīšana tika noraidÄ«ta, bet serveris neatgrieza paziņojumu. PÄrbaudiet git ÄÄ·us Å¡im repozitorijam. -editor.push_rejected=Serveris noraidÄ«ja Å¡o izmaiņu. PÄrbaudiet git ÄÄ·us. +editor.push_rejected_no_message=Serveris bez paziņojuma noraidÄ«ja izmaiņas. LÅ«gums pÄrbaudÄ«t Git aizÄ·eres. +editor.push_rejected=Serveris noraidÄ«ja izmaiņas. LÅ«gums pÄrbaudÄ«t Git aizÄ·eres. editor.push_rejected_summary=Pilns noraidīšanas ziņojums: -editor.add_subdir=Pievienot direktoriju… -editor.unable_to_upload_files=NeizdevÄs augÅ¡upielÄdÄ“t failus uz direktoriju "%s", kļūda: %v -editor.upload_file_is_locked=Failu "%s" ir nobloÄ·Ä“jis %s. -editor.upload_files_to_dir=`AugÅ¡upielÄdÄ“t failus uz direktoriju "%s"` -editor.cannot_commit_to_protected_branch=Nav atļauts veikt izmaiņas aizsargÄtam atzaram "%s". -editor.no_commit_to_branch=Nevar apstiprinÄt revÄ«zijas atzarÄ: -editor.user_no_push_to_branch=LietotÄjs nevar iesÅ«tÄ«t izmaiņas Å¡ajÄ atzarÄ -editor.require_signed_commit=AtzarÄ var iesÅ«tÄ«t tikai parakstÄ«tas revÄ«zijas +editor.add_subdir=Pievienot mapi… +editor.unable_to_upload_files=NeizdevÄs augÅ¡upielÄdÄ“t datnes "%s" šīs kļūdas dēļ: %v +editor.upload_file_is_locked=Datni "%s" aizslÄ“dza %s. +editor.upload_files_to_dir=AugÅ¡upielÄdÄ“t datnes "%s" +editor.cannot_commit_to_protected_branch=Nevar iesÅ«tÄ«t aizsargÄtajÄ zarÄ "%s". +editor.no_commit_to_branch=Nevar iesÅ«tÄ«t uzreiz zarÄ, jo: +editor.user_no_push_to_branch=LietotÄjs nevar aizgÄdÄt zarÄ +editor.require_signed_commit=ZarÄ ir nepiecieÅ¡ami parakstÄ«ti iesÅ«tÄ«jumi editor.cherry_pick=IzlasÄ«t %s uz: editor.revert=Atgriezt %s uz: commits.desc=PÄrlÅ«kot pirmkoda izmaiņu vÄ“sturi. -commits.commits=RevÄ«zijas -commits.no_commits=Nav kopÄ«gu revÄ«ziju. Atzariem "%s" un "%s" ir pilnÄ«bÄ atšķirÄ«ga izmaiņu vÄ“sture. -commits.nothing_to_compare=Atzari ir vienÄdi. +commits.commits=IesÅ«tÄ«jumi +commits.no_commits=Nav kopÄ«gu iesÅ«tÄ«jumu. "%s" un "%s" ir pilnÄ«gi atšķirÄ«ga vÄ“sture. +commits.nothing_to_compare=Å ie zari ir vienÄdi. commits.search=MeklÄ“t revÄ«zijas… -commits.search.tooltip=JÅ«s varat izmantot atslÄ“gas vÄrdus "author:", "committer:", "after:" vai "before:", piemÄ“ram, "revert author:Alice before:2019-01-13". +commits.search.tooltip=AtslÄ“gvÄrdu sÄkumÄ var pievienot "author:", "committer:", "after:" vai "before:", piemÄ“ram, "revert author:Anna before:2019-01-13". commits.find=MeklÄ“t -commits.search_all=Visi atzari +commits.search_all=Visi zari commits.author=Autors commits.message=Ziņojums commits.date=Datums @@ -1283,138 +1450,138 @@ commits.older=VecÄki commits.newer=JaunÄki commits.signed_by=ParakstÄ«jis commits.signed_by_untrusted_user=ParakstÄ«jis neuzticams lietotÄjs -commits.signed_by_untrusted_user_unmatched=ParakstÄ«jis neuzticams lietotÄjs, kas neatbilst izmaiņu autoram -commits.gpg_key_id=GPG atslÄ“gas ID -commits.ssh_key_fingerprint=SSH atslÄ“gas identificÄ“joÅ¡Ä zÄ«mju virkne -commits.view_path=SkatÄ«t Å¡ajÄ vÄ“stures punktÄ +commits.signed_by_untrusted_user_unmatched=ParakstÄ«jis neuzticams lietotÄjs, kurÅ¡ neatbilst iesÅ«tÄ«tÄjam +commits.gpg_key_id=GPG atslÄ“gas identifikators +commits.ssh_key_fingerprint=SSH atslÄ“gas nospiedums +commits.view_path=ApskatÄ«t Å¡ajÄ vÄ“stures punktÄ commit.operations=DarbÄ«bas commit.revert=Atgriezt commit.revert-header=Atgriezt: %s -commit.revert-content=NorÄdiet atzaru uz kuru atgriezt: +commit.revert-content=AtlasÄ«t zaru, no kura atjaunot: commit.cherry-pick=IzlasÄ«t commit.cherry-pick-header=IzlasÄ«t: %s -commit.cherry-pick-content=NorÄdiet atzaru uz kuru izlasÄ«t: +commit.cherry-pick-content=AtlasÄ«t zaru, uz kuru izlasÄ«t: commitstatus.error=Kļūda -commitstatus.failure=Kļūme +commitstatus.failure=Atteice commitstatus.pending=Nav iesÅ«tÄ«ts commitstatus.success=Pabeigts -ext_issues=Piekļuve ÄrÄ“jÄm problÄ“mÄm +ext_issues=Ä€rÄ“ji pieteikumi ext_issues.desc=Saite uz ÄrÄ“jo problÄ“mu sekotÄju. projects=Projekti -projects.desc=PÄrvaldÄ«t problÄ“mu un izmaiņu pieprasÄ«jumu projektu dēļus. -projects.description=Apraksts (neobligÄts) +projects.desc=PÄrvaldÄ«t pieteikumus un izmaiņu pieprasÄ«jumus projektos. +projects.description=Apraksts (pÄ“c izvÄ“les) projects.description_placeholder=Apraksts projects.create=Izveidot projektu projects.title=Nosaukums projects.new=Jauns projekts -projects.new_subheader=KoordinÄ“, seko un atjauno savu darbu centralizÄ“ti, lai projekts bÅ«tu izsekojams un vienmÄ“r laikÄ. +projects.new_subheader=Saskaņo, pÄrraugi un atjaunini savu darbu vienÄ vietÄ, lai projekti bÅ«tu caurskatÄmi un vienmÄ“r laikÄ. projects.create_success=Projekts "%s" tika izveidots. -projects.deletion=DzÄ“st projektu -projects.deletion_desc=Dzēšot projektu no tÄ tiks atsaistÄ«tÄs visas tam piesaistÄ«tÄs problÄ“mas. Vai turpinÄt? +projects.deletion=IzdzÄ“st projektu +projects.deletion_desc=Projekta izdzēšana noņem to no visiem saistÄ«tajiem pieteikumiem. TurpinÄt? projects.deletion_success=Å is projekts tika izdzÄ“sts. projects.edit=Labot projektu -projects.edit_subheader=Projekti organizÄ“ problÄ“mas un ļauj izsekot to progresam. -projects.modify=MainÄ«t projektu +projects.edit_subheader=Projektos var sakÄrtot pieteikumus un sekot attÄ«stÄ«bai. +projects.modify=Labot projektu projects.edit_success=Projekta "%s" izmaiņas tika saglabÄtas. projects.type.none=Nav -projects.type.basic_kanban=`VienkÄrÅ¡ots "Kanban"` +projects.type.basic_kanban=Pamata "Kanban" projects.type.bug_triage=Kļūdu šķiroÅ¡ana -projects.template.desc=Projekta sagatave -projects.template.desc_helper=IzvÄ“lieties projekta sagatavi, lai sÄktu darbu +projects.template.desc=Sagatave +projects.template.desc_helper=JÄatlasa projekta sagatave, lai uzsÄktu projects.type.uncategorized=Bez kategorijas -projects.column.edit=Rediģēt kolonnas +projects.column.edit=Labot aili projects.column.edit_title=Nosaukums projects.column.new_title=Nosaukums -projects.column.new_submit=Izveidot kolonnu -projects.column.new=Jauna kolonna -projects.column.set_default=IzvÄ“lÄ“ties kÄ noklusÄ“to -projects.column.set_default_desc=IzvÄ“lÄ“ties Å¡o kolonnu kÄ noklusÄ“to nekategorizÄ“tÄm problÄ“mÄm un izmaiņu pieteikumiem +projects.column.new_submit=Izveidot aili +projects.column.new=Jauna aile +projects.column.set_default=IestatÄ«t kÄ noklusÄ“juma +projects.column.set_default_desc=IestatÄ«t Å¡o aili kÄ noklusÄ“jumu neapkopotiem pieteikumiem un izmaiņu pieprasÄ«jumiem projects.column.unset_default=AtiestatÄ«t noklusÄ“to projects.column.unset_default_desc=Noņemt Å¡o kolonnu kÄ noklusÄ“to -projects.column.delete=DzÄ“st kolonnu -projects.column.deletion_desc=Dzēšot projekta kolonnu visas tam piesaistÄ«tÄs problÄ“mas tiks pÄrliktas kÄ nekategorizÄ“tas. Vai turpinÄt? +projects.column.delete=IzdzÄ“st aili +projects.column.deletion_desc=Projekta ailes izdzēšana pÄrvietos visus saistÄ«tos pieteikumus uz noklusÄ“juma aili. TurpinÄt? projects.column.color=KrÄsa -projects.open=AktÄ«vie +projects.open=AtvÄ“rtie projects.close=Pabeigtie projects.column.assigned_to=Piešķirts -projects.card_type.desc=KartÄ«tes priekÅ¡skatÄ«jums +projects.card_type.desc=Kartīšu priekÅ¡skatÄ«jumi projects.card_type.images_and_text=AttÄ“li un teksts projects.card_type.text_only=Tikai teksts -issues.desc=OrganizÄ“t kļūdu ziņojumus, uzdevumus un atskaites punktus. -issues.filter_assignees=FiltrÄ“t pÄ“c atbildÄ«gajiem -issues.filter_milestones=FiltrÄ“t pÄ“c atskaites punkta -issues.filter_projects=FiltrÄ“t pÄ“c projekta -issues.filter_labels=FiltrÄ“t pÄ“c etiÄ·etÄ“m -issues.filter_reviewers=FiltrÄ“t pÄ“c recenzentiem -issues.new=Jauna problÄ“ma +issues.desc=Kļūdu ziņojumus, uzdevumu un atskaites punktu apkopoÅ¡ana. +issues.filter_assignees=AtlasÄ«t pÄ“c atbildÄ«gajiem +issues.filter_milestones=AtlasÄ«t pÄ“c atskaites punkta +issues.filter_projects=AtlasÄ«t pÄ“c projekta +issues.filter_labels=AtlasÄ«t pÄ“c iezÄ«mes +issues.filter_reviewers=AtlasÄ«t izskatÄ«tÄjus +issues.new=Jauns pieteikums issues.new.title_empty=Nosaukums nevar bÅ«t tukÅ¡s -issues.new.labels=EtiÄ·etes -issues.new.no_label=Nav etiÄ·eÅ¡u -issues.new.clear_labels=Noņemt etiÄ·etes +issues.new.labels=IezÄ«mes +issues.new.no_label=Nav iezÄ«mju +issues.new.clear_labels=NotÄ«rÄ«t iezÄ«mes issues.new.projects=Projekti issues.new.clear_projects=NotÄ«rÄ«t projektus issues.new.no_projects=Nav projektu -issues.new.open_projects=AktÄ«vie projekti -issues.new.closed_projects=Pabeigtie projekti +issues.new.open_projects=AtvÄ“rtie projekti +issues.new.closed_projects=AizvÄ“rtie projekti issues.new.no_items=Nav neviena ieraksta issues.new.milestone=Atskaites punkts -issues.new.no_milestone=Nav atskaites punktu +issues.new.no_milestone=Nav atskaites punkta issues.new.clear_milestone=NotÄ«rÄ«t atskaites punktus -issues.new.open_milestone=AtvÄ“rtie atskaites punktus +issues.new.open_milestone=AtvÄ“rtie atskaites punkti issues.new.closed_milestone=AizvÄ“rtie atskaites punkti issues.new.assignees=AtbildÄ«gie issues.new.clear_assignees=Noņemt atbildÄ«go issues.new.no_assignees=Nav atbildÄ«go -issues.new.no_reviewers=Nav recenzentu -issues.choose.get_started=SÄkt darbu +issues.new.no_reviewers=Nav izskatÄ«tÄju +issues.choose.get_started=UzsÄkt darbu issues.choose.open_external_link=AtvÄ“rt issues.choose.blank=NoklusÄ“juma -issues.choose.blank_about=Izveidot problÄ“mu ar noklusÄ“juma sagatavi. +issues.choose.blank_about=Izveidot pieteikumu no noklusÄ“juma sagataves. issues.choose.ignore_invalid_templates=KļūdainÄs sagataves tika izlaistas -issues.choose.invalid_templates=%v ķļūdaina sagatave(s) atrastas -issues.choose.invalid_config=ProblÄ“mu konfigurÄcija satur kļūdas: -issues.no_ref=Nav norÄdÄ«ts atzars/tags -issues.create=Pieteikt problÄ“mu -issues.new_label=Jauna etiÄ·ete -issues.new_label_placeholder=EtiÄ·etes nosaukums +issues.choose.invalid_templates=atrasta(s) %v nederÄ«gas(s) sagatave(s) +issues.choose.invalid_config=Pieteikumu konfigurÄcija satur kļūdas: +issues.no_ref=Nav norÄdÄ«ts zars/birka +issues.create=Izveidot pieteikumu +issues.new_label=Jauna iezÄ«me +issues.new_label_placeholder=IezÄ«mes nosaukums issues.new_label_desc_placeholder=Apraksts -issues.create_label=Izveidot etiÄ·eti -issues.label_templates.title=IelÄdÄ“t sÄkotnÄ“ji noteiktu etiÄ·eÅ¡u kopu -issues.label_templates.info=Nav izveidota neviena etiÄ·ete. JÅ«s varat noklikšķinÄt uz "Jauna etiÄ·ete" augstÄk, lai to izveidotu vai izmantot zemÄk piedÄvÄtÄs etiÄ·etes: -issues.label_templates.helper=IzvÄ“lieties etiÄ·eÅ¡u kopu -issues.label_templates.use=Izmantot etiÄ·eÅ¡u kopu -issues.label_templates.fail_to_load_file=NeizdevÄs ielÄdÄ“t etiÄ·etes sagataves failu "%s": %v -issues.add_label=pievienoja %s etiÄ·eti %s -issues.add_labels=pievienoja %s etiÄ·etes %s -issues.remove_label=noņēma %s etiÄ·eti %s -issues.remove_labels=noņēma %s etiÄ·etes %s -issues.add_remove_labels=pievienoja %s un noņēma %s etiÄ·etes %s +issues.create_label=Izveidot iezÄ«mi +issues.label_templates.title=IelÄdÄ“t sÄkotnÄ“ji noteiktu iezÄ«mju kopu +issues.label_templates.info=VÄ“l nav nevienas iezÄ«mes. JÄizveido iezÄ«me ar "Jauna iezÄ«me" vai jÄizmanto priekÅ¡iestatÄ«ta iezÄ«mju kopa: +issues.label_templates.helper=AtlasÄ«t priekÅ¡iestatÄ«tu iezÄ«mju kopu +issues.label_templates.use=Izmantot iezÄ«mju kopu +issues.label_templates.fail_to_load_file=NeizdevÄs ielÄdÄ“t iezÄ«mju sagataves datni "%s": %v +issues.add_label=pievienoja %s iezÄ«mi %s +issues.add_labels=pievienoja iezÄ«mes %s %s +issues.remove_label=noņēma %s iezÄ«mi %s +issues.remove_labels=noņēma iezÄ«mes %s %s +issues.add_remove_labels=pievienoja iezÄ«mes %s un noņēma %s %s issues.add_milestone_at=`pievienoja atskaites punktu %s %s` -issues.add_project_at=`pievienoja Å¡o problÄ“mu %s projektam %s` +issues.add_project_at=`pievienoja Å¡o projektam %s %s` issues.change_milestone_at=`nomainÄ«ja atskaites punktu no %s uz %s %s` -issues.change_project_at=`pÄrvietoja Å¡o problÄ“mu no %s projekta uz %s %s` +issues.change_project_at=`nomainÄ«ja projektu no %s uz %s %s` issues.remove_milestone_at=`noņēma atskaites punktu %s %s` -issues.remove_project_at=`noņēma Å¡o problÄ“mu no %s projekta %s` -issues.deleted_milestone=`(dzÄ“sts)` -issues.deleted_project=`(dzÄ“sts)` +issues.remove_project_at=`noņēma Å¡o no projekta %s %s` +issues.deleted_milestone=`(izdzÄ“sts)` +issues.deleted_project=`(izdzÄ“sts)` issues.self_assign_at=`piešķīra sev %s` -issues.add_assignee_at=`tika piešķirta problÄ“ma no %s %s` -issues.remove_assignee_at=`tika noņemta problÄ“ma no %s %s` -issues.remove_self_assignment=`noņēma sev problÄ“mu %s` -issues.change_title_at=`nomainÄ«ts nosaukums no %s uz %s %s` +issues.add_assignee_at=`%s piešķīra %s` +issues.remove_assignee_at=`%s noņēma %s` +issues.remove_self_assignment=`noņēma sev %s` +issues.change_title_at=`nomainÄ«ja nosaukumu no %s uz %s %s` issues.change_ref_at=`nomainÄ«ta atsauce no %s uz %s %s` 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 atzaru %s %s` -issues.filter_label=EtiÄ·ete -issues.filter_label_exclude=`Izmantojiet alt + peles klikšķis vai enter, lai neiekļautu etiÄ·eti` -issues.filter_label_no_select=Visas etiÄ·etes -issues.filter_label_select_no_label=Nav etiÄ·etes +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_no_select=Visas iezÄ«mes +issues.filter_label_select_no_label=Bez iezÄ«mes issues.filter_milestone=Atskaites punkts issues.filter_milestone_all=Visi atskaites punkti issues.filter_milestone_none=Nav atskaites punkta @@ -1429,481 +1596,481 @@ issues.filter_assginee_no_assignee=Nav atbildÄ«gÄ issues.filter_poster=Autors issues.filter_poster_no_select=Visi autori issues.filter_type=Veids -issues.filter_type.all_issues=Visas problÄ“mas -issues.filter_type.assigned_to_you=PiešķirtÄs Jums -issues.filter_type.created_by_you=JÅ«su izveidotÄs -issues.filter_type.mentioning_you=Esat pieminÄ“ts -issues.filter_type.review_requested=PieprasÄ«ta recenzija -issues.filter_type.reviewed_by_you=Tavi recenzÄ“tie +issues.filter_type.all_issues=Visi pieteikumi +issues.filter_type.assigned_to_you=Man piešķirtie +issues.filter_type.created_by_you=Manis izveidotie +issues.filter_type.mentioning_you=Esmu pieminÄ“ts +issues.filter_type.review_requested=PieprasÄ«ta izskatīšana +issues.filter_type.reviewed_by_you=Manis izskatÄ«tie issues.filter_sort=KÄrtot issues.filter_sort.latest=JaunÄkie issues.filter_sort.oldest=Vecakie -issues.filter_sort.recentupdate=Nesen atjaunotÄs -issues.filter_sort.leastupdate=VissenÄk atjaunotÄs -issues.filter_sort.mostcomment=VisvairÄk komentÄ“tÄs -issues.filter_sort.leastcomment=VismazÄk komentÄ“tÄs +issues.filter_sort.recentupdate=Nesen atjauninÄtie +issues.filter_sort.leastupdate=VissenÄk atjauninÄtie +issues.filter_sort.mostcomment=VisvairÄk piebilžu +issues.filter_sort.leastcomment=VismazÄk piebilžu issues.filter_sort.nearduedate=TuvÄkais termiņš issues.filter_sort.farduedate=TÄlÄkais termiņš -issues.filter_sort.moststars=VisvairÄk atzÄ«mÄ“tie -issues.filter_sort.feweststars=VismazÄk atzÄ«mÄ“tie -issues.filter_sort.mostforks=VisvairÄk atdalÄ«tie -issues.filter_sort.fewestforks=VismazÄk atdalÄ«tie +issues.filter_sort.moststars=VisvairÄk zvaigžņu +issues.filter_sort.feweststars=VismazÄk zvaigžņu +issues.filter_sort.mostforks=VisvairÄk atzarojumu +issues.filter_sort.fewestforks=VismazÄk atzarojumu issues.keyword_search_unavailable=Meklēšana pÄ“c atslÄ“gvÄrda paÅ¡reiz nav pieejama. LÅ«gums sazinÄties ar vietnes administratoru. issues.action_open=AtvÄ“rt issues.action_close=AizvÄ“rt -issues.action_label=EtiÄ·ete +issues.action_label=IezÄ«me issues.action_milestone=Atskaites punkts issues.action_milestone_no_select=Nav atskaites punkta issues.action_assignee=AtbildÄ«gais issues.action_assignee_no_select=Nav atbildÄ«gÄ issues.action_check=AtzÄ«mÄ“t/NotÄ«rÄ«t -issues.action_check_all=AtzÄ«mÄ“t/NotÄ«rÄ«t visus ierakstus +issues.action_check_all=AtzÄ«mÄ“t/NotÄ«rÄ«t visus vienumus issues.opened_by=%[3]s atvÄ“ra %[1]s -pulls.merged_by=%[3]s sapludinÄja %[1]s -pulls.merged_by_fake=%[2]s sapludinÄja %[1]s +pulls.merged_by=%[3]s iekļÄva %[1]s +pulls.merged_by_fake=%[2]s iekļÄva %[1]s issues.closed_by=%[3]s aizvÄ“ra %[1]s issues.opened_by_fake=%[2]s atvÄ“ra %[1]s issues.closed_by_fake=%[2]s aizvÄ“ra %[1]s issues.previous=IepriekšējÄ issues.next=NÄkamÄ -issues.open_title=AtvÄ“rta -issues.closed_title=SlÄ“gta +issues.open_title=AtvÄ“rti +issues.closed_title=AizvÄ“rts issues.draft_title=Melnraksts -issues.num_comments_1=%d komentÄrs -issues.num_comments=%d komentÄri -issues.commented_at=`komentÄ“ja %s` -issues.delete_comment_confirm=Vai patieÅ¡Äm vÄ“laties dzÄ“st Å¡o komentÄru? -issues.context.copy_link=KopÄ“t saiti -issues.context.quote_reply=AtbildÄ“t citÄ“jot -issues.context.reference_issue=Atsaukties uz Å¡o jaunÄ problÄ“mÄ +issues.num_comments_1=%d piebilde +issues.num_comments=%d piebildes +issues.commented_at=`pievienoja piebildi %s` +issues.delete_comment_confirm=Vai tieÅ¡Äm izdzÄ“st Å¡o piebildi? +issues.context.copy_link=Ievietot saiti starpliktuvÄ“ +issues.context.quote_reply=CitÄ“t atbildi +issues.context.reference_issue=Atsaukties jaunÄ pieteikumÄ issues.context.edit=Labot -issues.context.delete=DzÄ“st -issues.no_content=Nav sniegts apraksts. -issues.close=SlÄ“gt problÄ“mu -issues.comment_pull_merged_at=saplidinÄta revÄ«zija %[1]s atzarÄ %[2]s %[3]s -issues.comment_manually_pull_merged_at=manuÄli saplidinÄta revÄ«zija %[1]s atzarÄ %[2]s %[3]s -issues.close_comment_issue=KomentÄ“t un aizvÄ“rt +issues.context.delete=IzdzÄ“st +issues.no_content=Apraksts nav sniegts. +issues.close=AizvÄ“rt pieteikumu +issues.comment_pull_merged_at=iekļÄva iesÅ«tÄ«jumu %[1]s %[2]s %[3]s +issues.comment_manually_pull_merged_at=paÅ¡rocÄ«gi iekļÄva iesÅ«tÄ«jumu %[1]s zarÄ %[2]s %[3]s +issues.close_comment_issue=AizvÄ“rt ar piebildi issues.reopen_issue=AtvÄ“rt atkÄrtoti -issues.reopen_comment_issue=KomentÄ“t un atvÄ“rt atkÄrtoti -issues.create_comment=KomentÄ“t -issues.closed_at=`slÄ“dza Å¡o problÄ“mu %[2]s` -issues.reopened_at=`atkÄrtoti atvÄ“ra Å¡o problÄ“mu %[2]s` -issues.commit_ref_at=`pieminÄ“ja Å¡o problÄ“mu revÄ«zijÄ %[2]s` -issues.ref_issue_from=`atsaucÄs uz Å¡o problÄ“mu %[4]s %[2]s` +issues.reopen_comment_issue=AtkÄrtoti atvÄ“rt ar piebildi +issues.create_comment=Pievienot piebildi +issues.closed_at=`aizvÄ“ra Å¡o pieteikumu %[2]s` +issues.reopened_at=`atkÄrtoti atvÄ“ra Å¡o pieteikumu %[2]s` +issues.commit_ref_at=`atsaucÄs uz Å¡o pieteikumu iesÅ«tÄ«jumÄ %[2]s` +issues.ref_issue_from=`atsaucÄs uz Å¡o pieteikumu %[4]s %[2]s` issues.ref_pull_from=`atsaucÄs uz Å¡o izmaiņu pieprasÄ«jumu %[4]s %[2]s` -issues.ref_closing_from=`atsaucÄs uz izmaiņu pieprasÄ«jumu %[4]s, kas atrisinÄs Å¡o problÄ“mu %[2]s` -issues.ref_reopening_from=`atsaucÄs uz izmaiņu pieprasÄ«jumu %[4]s, kas atkÄrtoti atvÄ“rs Å¡o problÄ“mu %[2]s` -issues.ref_closed_from=`aizvÄ“ra problÄ“mu %[4]s %[2]s` -issues.ref_reopened_from=`atkÄrtoti atvÄ“ra problÄ“mu %[4]s %[2]s` +issues.ref_closing_from=`atsaucÄs uz Å¡o pieteikumu izmaiņu pieprasÄ«jumÄ %[4]s, kas aizvÄ“rs to, %[2]s` +issues.ref_reopening_from=`atsaucÄs uz Å¡o pieteikumu izmaiņu pieprasÄ«jumÄ %[4]s, kas atkÄrtoti atvÄ“rs to, %[2]s` +issues.ref_closed_from=`aizvÄ“ra pieteikumu %[4]s %[2]s` +issues.ref_reopened_from=`atkÄrtoti atvÄ“ra pieteikumu %[4]s %[2]s` issues.ref_from=`no %[1]s` issues.author=Autors issues.author_helper=Å is lietotÄjs ir autors. issues.role.owner=ĪpaÅ¡nieks -issues.role.owner_helper=Å is lietotÄjs ir šī repozitorija Ä«paÅ¡nieks. +issues.role.owner_helper=Å is lietotÄjs ir šīs glabÄtavas Ä«paÅ¡nieks. issues.role.member=DalÄ«bnieks -issues.role.member_helper=Å is lietotÄjs ir organizÄcijas, kurai pieder Å¡is repozitorijs, dalÄ«bnieks. -issues.role.collaborator=LÄ«dzstrÄdnieks -issues.role.collaborator_helper=Å is lietotÄjs ir uzaicinÄts lÄ«dzdarboties repozitorijÄ. -issues.role.first_time_contributor=PirmreizÄ“js lÄ«dzradÄ«tÄjs -issues.role.first_time_contributor_helper=Å is ir pirmais šī lietotÄja ieguldÄ«jums Å¡ÄjÄ repozitorijÄ. -issues.role.contributor=LÄ«dzradÄ«tÄjs -issues.role.contributor_helper=Å is lietotÄjs repozitorijÄ ir iepriekÅ¡ veicis labojumus. -issues.re_request_review=PieprasÄ«t atkÄrtotu recenziju -issues.is_stale=Å ajÄ izmaiņu pieprasÄ«jumÄ ir notikuÅ¡as izmaiņÄs, kopÅ¡ veicÄt tÄ recenziju -issues.remove_request_review=Noņemt recenzijas pieprasÄ«jumu -issues.remove_request_review_block=Nevar noņemt recenzÄ«jas pieprasÄ«jumu -issues.dismiss_review=Atmest recenziju -issues.dismiss_review_warning=Vai patieÅ¡Äm vÄ“laties atmest Å¡o recenziju? +issues.role.member_helper=Å is lietotÄjs ir apvienÄ«bas, kurai pieder šī glabÄtava, dalÄ«bnieks. +issues.role.collaborator=LÄ«dzdalÄ«bnieks +issues.role.collaborator_helper=Å is lietotÄjs tika uzaicinÄts lÄ«dzdarboties glabÄtavÄ. +issues.role.first_time_contributor=PirmreizÄ“js lÄ«dzdalÄ«bnieks +issues.role.first_time_contributor_helper=Å is ir pirmais šī lietotÄja sniegums glabÄtavÄ. +issues.role.contributor=LÄ«dzdalÄ«bnieks +issues.role.contributor_helper=Å is lietotÄjs iepriekÅ¡ ir veicis iesÅ«tÄ«jumus Å¡ajÄ glabÄtavÄ. +issues.re_request_review=PieprasÄ«t atkÄrtotu izskatīšanu +issues.is_stale=KopÅ¡ šīs izskatīšanas Å¡ajÄ izmaiņu pieprasÄ«jumÄ ir bijuÅ¡as izmaiņas +issues.remove_request_review=Noņemt izskatīšanas pieprasÄ«jumu +issues.remove_request_review_block=Nevar noņemt izskatīšanas pieprasÄ«jumu +issues.dismiss_review=Atmest izskatīšanu +issues.dismiss_review_warning=Vai tieÅ¡Äm atmest Å¡o izskatīšanu? issues.sign_in_require_desc=NepiecieÅ¡ams pieteikties, lai pievienotos Å¡ai sarunai. issues.edit=Labot issues.cancel=Atcelt issues.save=SaglabÄt -issues.label_title=EtiÄ·etes nosaukums -issues.label_description=EtiÄ·etes apraksts -issues.label_color=EtiÄ·etes krÄsa -issues.label_exclusive=EkskluzÄ«vs -issues.label_archive=ArhÄ«vÄ“t etiÄ·eti -issues.label_archived_filter=RÄdÄ«t arhivÄ“tÄs etiÄ·etes -issues.label_archive_tooltip=ArhivÄ“tÄs etiÄ·etes pÄ“c noklusÄ“juma netiek iekļautas ieteikumos, kad meklÄ“ pÄ“c nosaukuma. -issues.label_exclusive_desc=Nosauciet etiÄ·eti grupa/nosaukums, lai grupÄ“tu etiÄ·Ä“tes un varÄ“tu norÄdÄ«t tÄs kÄ ekskluzÄ«vas ar citÄm grupa/ etiÄ·etÄ“m. -issues.label_exclusive_warning=Jebkura konfliktÄ“joÅ¡a ekskluzÄ«vas grupas etiÄ·ete tiks noņemta, labojot pieteikumu vai izmaiņu pietikumu etiÄ·etes. -issues.label_count=%d etiÄ·etes -issues.label_open_issues=%d atvÄ“rtas problÄ“mas +issues.label_title=Nosaukums +issues.label_description=Apraksts +issues.label_color=KrÄsa +issues.label_exclusive=Sevišķa +issues.label_archive=ArhivÄ“t iezÄ«mi +issues.label_archived_filter=RÄdÄ«t arhivÄ“tÄs iezÄ«mes +issues.label_archive_tooltip=ArhivÄ“tÄs iezÄ«mes pÄ“c noklusÄ“juma netiek iekļautas ieteikumos, kad meklÄ“ pÄ“c iezÄ«mes. +issues.label_exclusive_desc=IezÄ«me jÄnodÄ“vÄ“ tvÄ“rums/vienums, lai padarÄ«tu to savstarpÄ“ji sevišķu ar citÄm tvÄ“rums/ iezÄ«mÄ“m. +issues.label_exclusive_warning=Jebkura nesaderÄ«ga tvÄ“ruma iezÄ«me tiks noņemta, kad tiks labotas pieteikuma vai izmaiņu pieprasÄ«juma iezÄ«mes. +issues.label_count=%d iezÄ«mes +issues.label_open_issues=%d atvÄ“rti pieteikumi/izmaiņu pieprasÄ«jumi issues.label_edit=Labot -issues.label_delete=DzÄ“st -issues.label_modify=Labot etiÄ·eti -issues.label_deletion=DzÄ“st etiÄ·eti -issues.label_deletion_desc=Dzēšot etiÄ·eti, tÄ tiks noņemta no visÄm problÄ“mÄm un izmaiņu pieprasÄ«jumiem. Vai turpinÄt? -issues.label_deletion_success=EtiÄ·ete tika izdzÄ“sta. +issues.label_delete=IzdzÄ“st +issues.label_modify=Labot iezÄ«mi +issues.label_deletion=IzdzÄ“st iezÄ«mi +issues.label_deletion_desc=IezÄ«mes izdzēšana noņems to no visiem pieteikumiem. TurpinÄt? +issues.label_deletion_success=IezÄ«me tika izdzÄ“sta. issues.label.filter_sort.alphabetically=AlfabÄ“tiski issues.label.filter_sort.reverse_alphabetically=PretÄ“ji alfabÄ“tiski issues.label.filter_sort.by_size=MazÄkais izmÄ“rs issues.label.filter_sort.reverse_by_size=LielÄkais izmÄ“rs issues.num_participants_few=%d dalÄ«bnieki -issues.attachment.open_tab=`Noklikšķiniet, lai apskatÄ«tos "%s" jaunÄ logÄ` -issues.attachment.download=`Noklikšķiniet, lai lejupielÄdÄ“tu "%s"` +issues.attachment.open_tab=`KlikšķinÄt, lai apskatÄ«tu "%s" jaunÄ cilnÄ“` +issues.attachment.download=`KlikšķinÄt, lai lejupielÄdÄ“tu "%s"` issues.subscribe=AbonÄ“t issues.unsubscribe=AtrakstÄ«ties -issues.unpin_issue=Atspraust problÄ“mu -issues.max_pinned=Nevar piespraust vairÄk problÄ“mas +issues.unpin_issue=Atspraust pieteikumu +issues.max_pinned=Nevar piespraust vairÄk pieteikumu issues.pin_comment=piesprauda Å¡o %s issues.unpin_comment=atsprauda Å¡o %s -issues.lock=SlÄ“gt komentēšanu -issues.unlock=Atļaut komentēšanu -issues.lock.unknown_reason=NeizdevÄs slÄ“gt problÄ“mas komentēšanu. -issues.lock_duplicate=ProblÄ“mas komentēšanu nevar slÄ“gt vairÄkas reizes. -issues.unlock_error=Nevar atļaut komentēšanu, ja problÄ“mai tÄ nav slÄ“gta. -issues.lock_with_reason=slÄ“dza ar iemeslu %s un ierobežoja komentÄru pievienoÅ¡anu tikai lÄ«dzstrÄdniekiem %s -issues.lock_no_reason=slÄ“dza un ierobežoja komentÄru pievienoÅ¡anu tikai lÄ«dzstrÄdniekiem %s -issues.unlock_comment=atļÄva komentēšanu %s +issues.lock=SlÄ“gt apsprieÅ¡anu +issues.unlock=AtslÄ“gt apsprieÅ¡anu +issues.lock.unknown_reason=Nevar aizslÄ“gt pieteikumu ar nezinÄmu iemeslu. +issues.lock_duplicate=Pieteikumu nevar aizslÄ“gt divreiz. +issues.unlock_error=Nevar atslÄ“gt pieteikumu, kas nav aizslÄ“gts. +issues.lock_with_reason=aizslÄ“dza kÄ %s un padarÄ«ja sarunu pieejamu tikai lÄ«dzdalÄ«bniekiem %s +issues.lock_no_reason=aizslÄ“dza apsprieÅ¡anu un padarÄ«ja to pieejamu tikai lÄ«dzdalÄ«bniekiem %s +issues.unlock_comment=atslÄ“dza Å¡o apsprieÅ¡anu %s issues.lock_confirm=SlÄ“gt -issues.unlock_confirm=Atļaut -issues.lock.notice_1=- Citi lietotÄji nevar pievienot jaunus komentÄrus Å¡ai problÄ“mai. -issues.lock.notice_2=- Jums un citiem lÄ«dzstrÄdniekiem ar piekļuvi Å¡im repozitorijam tiks saglabÄta iespÄ“ja pievienot komentÄrus. -issues.lock.notice_3=- JÅ«s vienmÄ“r varat atkal atļaut komentēšanu. -issues.unlock.notice_1=- Ikviens varÄ“s atkal pievienot jaunus komentÄrus. -issues.unlock.notice_2=- JÅ«s vienmÄ“r varat atkal slÄ“gt komentēšanu. +issues.unlock_confirm=AtslÄ“gt +issues.lock.notice_1=- Citi lietotÄji Å¡im pieteikumam nevar pievienot jaunas piebildes. +issues.lock.notice_2=- Tu un citi lÄ«dzdalÄ«bnieki ar piekļuvi Å¡ai glabÄtavai joprojÄm var pievienot citiem redzamas piebildes. +issues.lock.notice_3=- Å o pieteikumu vienmÄ“r bÅ«s iespÄ“ja atkal atslÄ“gt. +issues.unlock.notice_1=- Ikviens atkal varÄ“s pievienot jaunas piebildes. +issues.unlock.notice_2=- Å o pieteikumu vienmÄ“r bÅ«s iespÄ“jams atkal aizslÄ“gt. issues.lock.reason=SlÄ“gÅ¡anas iemesls -issues.lock.title=SlÄ“gt komentēšanu Å¡ai problÄ“mai. -issues.unlock.title=Atļaut komentēšanu Å¡ai problÄ“mai. -issues.comment_on_locked=JÅ«s nevarat komentÄ“t slÄ“gtai problÄ“mai. -issues.delete=DzÄ“st -issues.delete.title=DzÄ“st Å¡o problÄ“mu? -issues.delete.text=Vai patieÅ¡Äm vÄ“laties dzÄ“st Å¡o problemu? (Neatgriezeniski tiks izdzÄ“sts viss saturs. Apsveriet iespÄ“ju to aizvÄ“rt, ja vÄ“laties informÄciju saglabÄt vÄ“sturei) +issues.lock.title=SlÄ“gt šī pieteikuma sarunu. +issues.unlock.title=AtslÄ“gt šī pieteikuma apsprieÅ¡anu. +issues.comment_on_locked=Nevar pievienot piebildi aizslÄ“gtam pieteikumam. +issues.delete=IzdzÄ“st +issues.delete.title=IzdzÄ“st Å¡o pieteikumu? +issues.delete.text=Vai tieÅ¡Äm izdzÄ“st Å¡o pieteikumu? (Tas neatgriezeniski noņems visu saturu. TÄ vietÄ vÄ“lams apsvÄ“rt aizvÄ“rÅ¡anu, ja ir paredzÄ“ts paturÄ“t to arhivÄ“tu) issues.tracker=Laika uzskaite -issues.start_tracking_short=UzsÄkt taimeri +issues.start_tracking_short=UzsÄkt laika uzskaitīšanu issues.start_tracking=UzsÄkt laika uzskaiti issues.start_tracking_history=` uzsÄka darbu %s` -issues.tracker_auto_close=Taimeris tiks automÄtiski apturÄ“ts, kad šī problÄ“ma tiks aizvÄ“rta -issues.tracking_already_started=`Jau ir uzsÄkta laika uzskaite par citu problÄ“mu!` -issues.stop_tracking=ApturÄ“t taimeri +issues.tracker_auto_close=Laika uzskaite tiks automÄtiski apturÄ“ta, kad Å¡is pieteikums tiks aizvÄ“rts +issues.tracking_already_started=`Laika uzskaitīšana jau ir uzsÄkta citÄ pieteikumÄ!` +issues.stop_tracking=ApturÄ“t laika uzskaitīšanu issues.stop_tracking_history=` beidza strÄdÄt %s` issues.cancel_tracking=Atmest -issues.cancel_tracking_history=`atcÄ“la laika uzskaiti %s` -issues.add_time=ManuÄli pievienot laiku -issues.del_time=DzÄ“st Å¡o laika žurnÄla ierakstu +issues.cancel_tracking_history=`atcÄ“la laika uzskaitīšanu %s` +issues.add_time=PaÅ¡rocÄ«gi pievienot laiku +issues.del_time=IzdzÄ“st Å¡o laika žurnÄla ierakstu issues.add_time_short=Pievienot laiku issues.add_time_cancel=Atcelt issues.add_time_history=` pievienoja patÄ“rÄ“to laiku %s` -issues.del_time_history=`dzÄ“sts patÄ“rÄ“tais laiks %s` +issues.del_time_history=`izdzÄ“sa patÄ“rÄ“to laiku %s` issues.add_time_hours=Stundas issues.add_time_minutes=MinÅ«tes issues.add_time_sum_to_small=Nav norÄdÄ«ts laiks. issues.time_spent_total=KopÄ“jais patÄ“rÄ“tais laiks issues.time_spent_from_all_authors=`KopÄ“jais patÄ“rÄ“tais laiks: %s` -issues.due_date=Izpildes termiņš +issues.due_date=Izpildes datums issues.invalid_due_date_format=Izpildes termiņam ir jÄbÅ«t formÄta 'yyyy-mm-dd'. issues.error_modifying_due_date=NeizdevÄs izmainÄ«t izpildes termiņu. issues.error_removing_due_date=NeizdevÄs noņemt izpildes termiņu. -issues.push_commit_1=iesÅ«tÄ«ja %d revÄ«ziju %s -issues.push_commits_n=iesÅ«tÄ«ja %d revÄ«zijas %s -issues.force_push_codes=`veica piespiedu izmaiņu iesÅ«tīšanu atzarÄ %[1]s no revÄ«zijas %[2]s uz %[4]s %[6]s` +issues.push_commit_1=pievienoja %d iesÅ«tÄ«jumu %s +issues.push_commits_n=pievienoja %d iesÅ«tÄ«jumus %s +issues.force_push_codes=`veica uzspiestu aizgÄdÄÅ¡anu zarÄ %[1]s no %[2]s uz %[4]s %[6]s` issues.force_push_compare=SalÄ«dzinÄt -issues.due_date_form=dd.mm.yyyy +issues.due_date_form=dd.mm.gggg. issues.due_date_form_add=Pievienot izpildes termiņu issues.due_date_form_edit=Labot issues.due_date_form_remove=Noņemt issues.due_date_not_writer=Ir nepiecieÅ¡ama rakstīšanas piekļuve Å¡im repozitorijam, lai varÄ“tu mainÄ«t problÄ“mas plÄnoto izpildes datumu. -issues.due_date_not_set=Izpildes termiņš nav uzstÄdÄ«ts. -issues.due_date_added=pievienoja izpildes termiņu %s %s -issues.due_date_modified=mainÄ«ja termiņa datumu no %[2]s uz %[1]s %[3]s -issues.due_date_remove=noņēma izpildes termiņu %s %s +issues.due_date_not_set=Nav uzstÄdÄ«ts izpildes datums. +issues.due_date_added=pievienoja izpildes datumu %s %s +issues.due_date_modified=mainÄ«ja izpildes datumu no %[2]s uz %[1]s %[3]s +issues.due_date_remove=noņēma izpildes datumu %s %s issues.due_date_overdue=NokavÄ“ts -issues.due_date_invalid=Datums lÄ«dz nav korekts. Izmantojiet formÄtu 'gggg-mm-dd'. +issues.due_date_invalid=Izpildes datums nav derÄ«gs vai tas ir Ärpus datumu apgabala. LÅ«gums izmantot pierakstu "gggg-mm-dd". issues.dependency.title=AtkarÄ«bas issues.dependency.issue_no_dependencies=Nav atkarÄ«bu. issues.dependency.pr_no_dependencies=Nav atkarÄ«bu. -issues.dependency.no_permission_1=Nav tiesÄ«bu nolasÄ«t %d atkarÄ«bu -issues.dependency.no_permission_n=Nav tiesÄ«bu nolasÄ«t %d atkarÄ«bas -issues.dependency.no_permission.can_remove=Nav tiesÄ«bu nolasÄ«t Å¡o atkarÄ«bu, bet iespÄ“jams to noņemt +issues.dependency.no_permission_1=Nav tiesÄ«bu lasÄ«t %d atkarÄ«bu +issues.dependency.no_permission_n=Nav tiesÄ«bu lasÄ«t %d atkarÄ«bas +issues.dependency.no_permission.can_remove=Nav tiesÄ«bu lasÄ«t Å¡o atkarÄ«bu, bet ir iespÄ“jams to noņemt issues.dependency.add=Pievienot atkarÄ«bu… issues.dependency.cancel=Atcelt issues.dependency.remove=Noņemt issues.dependency.remove_info=Noņemt Å¡o atkarÄ«bu issues.dependency.added_dependency=`pievienoja jaunu atkarÄ«bu %s` issues.dependency.removed_dependency=`noņema atkarÄ«bu %s` -issues.dependency.pr_closing_blockedby=Å Ä« izmaiņu pieprasÄ«juma sapludinÄÅ¡anu bloÄ·Ä“ sekojoÅ¡as problÄ“mas -issues.dependency.issue_closing_blockedby=Å Ä«s problÄ“mas aizvÄ“rÅ¡anu bloÄ·Ä“ sekojoÅ¡as problÄ“mas -issues.dependency.issue_close_blocks=Å Ä« problÄ“ma bloÄ·Ä“ sekojoÅ¡u problÄ“mu aizvÄ“rÅ¡anu -issues.dependency.pr_close_blocks=Å is izmaiņu pieprasÄ«jums bloÄ·Ä“ sekojoÅ¡u problÄ“mu aizvÄ“rÅ¡anu -issues.dependency.issue_close_blocked=NepiecieÅ¡ams aizvÄ“rt visas problÄ“mas, kas bloÄ·Ä“ Å¡o problÄ“mu, lai to varÄ“tu aizÄ“rt. -issues.dependency.issue_batch_close_blocked=Nav iespÄ“jams aizvÄ“rt vairÄkas atzÄ«mÄ“tÄs problÄ“mas, jo problÄ“mai #%d ir atvÄ“rtas atkarÄ«bas -issues.dependency.pr_close_blocked=NepiecieÅ¡ams aizvÄ“rt visas problÄ“mas, kas bloÄ·Ä“ Å¡o izmaiņu pieprasÄ«jumu, lai to varÄ“tu sapludinÄt. -issues.dependency.blocks_short=BloÄ·Ä“ +issues.dependency.pr_closing_blockedby=ZemÄk esoÅ¡ie pieteikumi liedz šī izmaiņu pieprasÄ«juma aizvÄ“rÅ¡anu +issues.dependency.issue_closing_blockedby=ZemÄk esoÅ¡ie pieteikumi liedz šī pieteikuma aizvÄ“rÅ¡anu +issues.dependency.issue_close_blocks=Å is pieteikums liedz zemÄk esoÅ¡o pieteikumu aizvÄ“rÅ¡anu +issues.dependency.pr_close_blocks=Å is izmaiņu pieprasÄ«jums liedz zemÄk esoÅ¡o pieteikumu aizvÄ“rÅ¡anu +issues.dependency.issue_close_blocked=NepiecieÅ¡ams aizvÄ“rt visus pieteikumus, kas aiztur Å¡o pieteikumu, lai to varÄ“tu aizvÄ“rt. +issues.dependency.issue_batch_close_blocked=Nav iespÄ“jama vairÄku izvÄ“lÄ“to pieteikumu aizvÄ“rÅ¡ana, jo pieteikumam #%d joprojÄm ir atvÄ“rtas atkarÄ«bas +issues.dependency.pr_close_blocked=NepiecieÅ¡ams aizvÄ“rt visus pieteikumus, kas aiztur Å¡o izmaiņu pieprasÄ«jumu, lai to varÄ“tu iekļaut. +issues.dependency.blocks_short=Aiztur issues.dependency.blocked_by_short=AtkarÄ«gs no issues.dependency.remove_header=Noņemt atkarÄ«bu -issues.dependency.issue_remove_text=Å Ä« darbÄ«ba noņems atkarÄ«bu no šīs problÄ“mas. TurpinÄt? +issues.dependency.issue_remove_text=Tas noņems atkarÄ«bu no šī pieteikuma. TurpinÄt? issues.dependency.pr_remove_text=Å Ä« darbÄ«ba noņems atkarÄ«bu no šī izmaiņu pieprasÄ«juma. TurpinÄt? -issues.dependency.setting=IespÄ“jot atkarÄ«bas problÄ“mÄm un izmaiņu pieprasÄ«jumiem -issues.dependency.add_error_same_issue=Nevar izveidot atkarÄ«bu uz paÅ¡u problÄ“mu. -issues.dependency.add_error_dep_issue_not_exist=AtkarÄ«gÄ problÄ“ma neeksistÄ“. -issues.dependency.add_error_dep_not_exist=AtkarÄ«ba neeksistÄ“. +issues.dependency.setting=IespÄ“jot pieteikumu un izmaiņu pieprasÄ«jumu atkarÄ«bas +issues.dependency.add_error_same_issue=Pieteikumu nevar padarÄ«t atkarÄ«gu paÅ¡u no sevis. +issues.dependency.add_error_dep_issue_not_exist=AtkarÄ«gais pieteikums nepastÄv. +issues.dependency.add_error_dep_not_exist=AtkarÄ«ba nepastÄv. issues.dependency.add_error_dep_exists=AtkarÄ«ba jau ir pievienota. -issues.dependency.add_error_cannot_create_circular=Nav iespÄ“jams veidot atkarÄ«bu, kur divas problÄ“mas bloÄ·Ä“tu viena otru. -issues.dependency.add_error_dep_not_same_repo=AbÄm problÄ“mÄm ir jÄbÅ«t no viena repozitorija. -issues.review.self.approval=Nevar apstiprinÄt savu izmaiņu pieprasÄ«jumi. +issues.dependency.add_error_cannot_create_circular=Nevar izveidot atkarÄ«bu ar diviem vienam otru aizturoÅ¡iem pieteikumiem. +issues.dependency.add_error_dep_not_same_repo=Abiem pieteikumiem jÄbÅ«t vienÄ un tajÄ paÅ¡Ä glabÄtavÄ. +issues.review.self.approval=Nevar apstiprinÄt savu izmaiņu pieprasÄ«jumu. issues.review.self.rejection=Nevar pieprasÄ«t izmaiņas savam izmaiņu pieprasÄ«jumam. -issues.review.approve=apstiprinÄja izmaiņas %s -issues.review.comment=recenzÄ“ja %s -issues.review.dismissed=atmeta %s recenziju %s +issues.review.approve=apstiprinÄja šīs izmaiņas %s +issues.review.comment=izskatÄ«ja %s +issues.review.dismissed=atmeta %s izskatīšanu %s issues.review.dismissed_label=Atmesta -issues.review.left_comment=atstÄja komentÄru -issues.review.content.empty=NepiecieÅ¡ams norÄdÄ«t komentÄru par prasÄ«tajÄm izmaiņÄm. -issues.review.reject=pieprasÄ«ja izmaiņas %s -issues.review.wait=tika pieprasÄ«ta recenzija %s -issues.review.add_review_request=pieprasÄ«ja recenziju no %s %s -issues.review.remove_review_request=noņema recenzijas pieprasÄ«jumu no %s %s -issues.review.remove_review_request_self=atteicÄs recenzÄ“t %s +issues.review.left_comment=pievienoja piebildi +issues.review.content.empty=Ir nepiecieÅ¡ams pievienot piebildi par pieprasÄ«to(ajÄm) izmaiņu(Äm). +issues.review.reject=pieprasÄ«ja labojumus %s +issues.review.wait=tika pieprasÄ«ts izskatÄ«t %s +issues.review.add_review_request=pieprasÄ«ja izskatīšanu no %[1]s %[2]s +issues.review.remove_review_request=noņēma izskatīšanas pieprasÄ«jumu %[1]s %[2]s +issues.review.remove_review_request_self=atteicÄs izskatÄ«t %s issues.review.pending=Nav iesÅ«tÄ«ts -issues.review.pending.tooltip=Å is komentÄrs nav redzams citiem lietotÄjiem. Lai padarÄ«tu neiesÅ«tÄ«tos komentÄrus pieejamus citiem, nospiediet "%s" -> "%s/%s/%s" lapas augÅ¡pusÄ“. -issues.review.review=Recenzija -issues.review.reviewers=Recenzenti -issues.review.outdated=Novecojis -issues.review.outdated_description=Saturs ir mainÄ«jies kopÅ¡ šī komentÄra pievienoÅ¡anas -issues.review.option.show_outdated_comments=RÄdÄ«t novecojuÅ¡us komentÄrus -issues.review.option.hide_outdated_comments=PaslÄ“pt novecojuÅ¡us komentÄrus +issues.review.pending.tooltip=Å Ä« piebilde pagaidÄm nav redzama citiem lietotÄjiem. Lai iesniegtu savas ierindotÄs piebildes, lapas augÅ¡daÄ¼Ä jÄatlasa "%s" -> "%s/%s/%s". +issues.review.review=Izskatīšana +issues.review.reviewers=IzskatÄ«tÄji +issues.review.outdated=Novecojusi +issues.review.outdated_description=PÄ“c šīs piebildes pievienoÅ¡anas ir mainÄ«jies saturs +issues.review.option.show_outdated_comments=RÄdÄ«t novecojuÅ¡as piebildes +issues.review.option.hide_outdated_comments=PaslÄ“pt novecojuÅ¡as piebildes issues.review.show_outdated=RÄdÄ«t novecojuÅ¡u issues.review.hide_outdated=PaslÄ“pt novecojuÅ¡u issues.review.show_resolved=RÄdÄ«t atrisinÄto issues.review.hide_resolved=PaslÄ“pt atrisinÄto issues.review.resolve_conversation=AtrisinÄt sarunu issues.review.un_resolve_conversation=Atcelt sarunas atrisinÄjumu -issues.review.resolved_by=atzÄ«mÄ“ja sarunu kÄ atrisinÄtu +issues.review.resolved_by=atzÄ«mÄ“ja Å¡o sarunu kÄ atrisinÄtu issues.assignee.error=Ne visi atbildÄ«gie tika pievienoti, jo radÄs neparedzÄ“ta kļūda. issues.reference_issue.body=Saturs -issues.content_history.deleted=dzÄ“sts -issues.content_history.edited=rediģēts +issues.content_history.deleted=izdzÄ“sts +issues.content_history.edited=labots issues.content_history.created=izveidots -issues.content_history.delete_from_history=DzÄ“st no vÄ“stures -issues.content_history.delete_from_history_confirm=Vai dzÄ“st no vÄ“stures? +issues.content_history.delete_from_history=IzdzÄ“st no vÄ“stures +issues.content_history.delete_from_history_confirm=IzdzÄ“st no vÄ“stures? issues.content_history.options=IespÄ“jas -issues.reference_link=Atsaucas uz: %s +issues.reference_link=Atsauce: %s compare.compare_base=pamata compare.compare_head=salÄ«dzinÄt -pulls.desc=IespÄ“jot izmaiņu pieprasÄ«jumus un koda recenzēšanu. +pulls.desc=IespÄ“jot izmaiņu pieprasÄ«jumus un koda izskatīšanu. pulls.new=Jauns izmaiņu pieprasÄ«jums -pulls.view=SkatÄ«ties izmaiņu pieprasÄ«jumu +pulls.view=ApskatÄ«t izmaiņu pieprasÄ«jumu pulls.compare_changes=Jauns izmaiņu pieprasÄ«jums pulls.allow_edits_from_maintainers=Atļaut labojumus no uzturÄ“tÄjiem -pulls.allow_edits_from_maintainers_desc=LietotÄji ar rakstīšanas tiesÄ«bÄm bÄzes atzarÄ, drÄ«kst iesÅ«tÄ«t izmaiņas Å¡ajÄ atzarÄ -pulls.allow_edits_from_maintainers_err=AtjaunoÅ¡ana neizdevÄs -pulls.compare_changes_desc=IzvÄ“lieties atzaru, kurÄ sapludinÄt izmaiņas un atzaru, no kura tÄs saņemt. -pulls.has_viewed_file=SkatÄ«ts -pulls.has_changed_since_last_review=MainÄ«ts kopÅ¡ pÄ“dÄ“jÄs recenzijas -pulls.viewed_files_label=%[1]d no %[2]d failiem apskatÄ«ts -pulls.expand_files=IzvÄ“rst visus failus -pulls.collapse_files=SavÄ“rst visus failus +pulls.allow_edits_from_maintainers_desc=LietotÄji ar rakstīšanas piekļuvi pamata zaram var aizgÄdÄt izmaiņas arÄ« Å¡ajÄ zarÄ +pulls.allow_edits_from_maintainers_err=AtjauninÄÅ¡ana neizdevÄs +pulls.compare_changes_desc=JÄatlasa zars, kurÄ iekļaut izmaiņas, un zars, no kura tÄs atgÄdÄt. +pulls.has_viewed_file=ApskatÄ«ta +pulls.has_changed_since_last_review=IzmainÄ«ts kopÅ¡ pÄ“dÄ“jÄs izskatīšanas +pulls.viewed_files_label=apskatÄ«tas %[1]d no %[2]d datnÄ“m +pulls.expand_files=IzvÄ“rst visas datnes +pulls.collapse_files=SavÄ“rst visas datnes pulls.compare_base=pamata -pulls.compare_compare=salÄ«dzinÄmais -pulls.switch_comparison_type=MainÄ«t salÄ«dzinÄÅ¡anas tipu -pulls.switch_head_and_base=MainÄ«t galvas un pamata atzarus -pulls.filter_branch=FiltrÄ“t atzarus +pulls.compare_compare=atgÄdÄt no +pulls.switch_comparison_type=PÄrslÄ“gt salÄ«dzinÄÅ¡anas veidu +pulls.switch_head_and_base=ApmainÄ«t galotnes un pamata zarus +pulls.filter_branch=AtlasÄ«t zarus pulls.no_results=Nekas netika atrasts. -pulls.show_all_commits=RÄdÄ«t visas revÄ«zijas -pulls.show_changes_since_your_last_review=RÄdÄ«t izmaiņas kopÅ¡ Tavas pÄ“dÄ“jÄs recenzijas -pulls.showing_only_single_commit=RÄda tikai revÄ«zijas %[1]s izmaiņas -pulls.showing_specified_commit_range=RÄda tikai izmaiņas starp %[1]s..%[2]s -pulls.select_commit_hold_shift_for_range=AtlasÄ«t revÄ«ziju. JÄtur Shift + klikšķis, lai atlasÄ«tu vairÄkas -pulls.review_only_possible_for_full_diff=Recenzēšana ir iespÄ“jama tikai tad, kad tiek apskatÄ«ts pilns salÄ«dzinÄjums -pulls.filter_changes_by_commit=AtlasÄ«t pÄ“c revÄ«zijas -pulls.nothing_to_compare=Nav ko salÄ«dzinÄt, jo bÄzes un salÄ«dzinÄmie atzari ir vienÄdi. -pulls.nothing_to_compare_and_allow_empty_pr=Å ie atzari ir vienÄdi. Izveidotais izmaiņu pieprasÄ«jums bÅ«s tukÅ¡s. -pulls.has_pull_request=`Izmaiņu pieprasÄ«jums starp Å¡iem atzariem jau eksistÄ“: %[2]s#%[3]d` +pulls.show_all_commits=RÄdÄ«t visus iesÅ«tÄ«jumus +pulls.show_changes_since_your_last_review=RÄdÄ«t izmaiņas kopÅ¡ Tavas pÄ“dÄ“jÄs izskatīšanas +pulls.showing_only_single_commit=RÄda tikai iesÅ«tÄ«juma %[1]s izmaiņas +pulls.showing_specified_commit_range=RÄda izmaiņas tikai starp %[1]s..%[2]s +pulls.select_commit_hold_shift_for_range=AtlasÄ«t iesÅ«tÄ«jumu. JÄtur Shift + klikšķis, lai atlasÄ«tu vairÄkus +pulls.review_only_possible_for_full_diff=Izskatīšana ir iespÄ“jama tikai tad, kad tiek apskatÄ«ts pilns salÄ«dzinÄjums +pulls.filter_changes_by_commit=AtlasÄ«t pÄ“c iesÅ«tÄ«juma +pulls.nothing_to_compare=Å ie zari ir vienÄdi. Nav nepiecieÅ¡ams izveidot izmaiņu pieprasÄ«jumu. +pulls.nothing_to_compare_and_allow_empty_pr=Å ie zari ir vienÄdi. Å is izmaiņu pieprasÄ«jums bÅ«s tukÅ¡s. +pulls.has_pull_request=`Jau pastÄv izmaiņu pieprasÄ«jums starp Å¡iem zariem: %[2]s#%[3]d` pulls.create=Izveidot izmaiņu pieprasÄ«jumu -pulls.title_desc_few=vÄ“las sapludinÄt %[1]d revÄ«zijas no %[2]s uz %[3]s -pulls.merged_title_desc_few=sapludinÄja %[1]d revÄ«zijas no %[2]s uz %[3]s %[4]s -pulls.change_target_branch_at=`nomainÄ«ja mÄ“rÄ·a atzaru no %s uz %s %s` +pulls.title_desc_few=vÄ“las iekļaut %[1]d iesÅ«tÄ«jumus no %[2]s zarÄ %[3]s +pulls.merged_title_desc_few=IekļÄva %[1]d iesÅ«tÄ«jumus no %[2]s zarÄ %[3]s %[4]s +pulls.change_target_branch_at=`nomainÄ«ja mÄ“rÄ·a zaru no %s uz %s %s` pulls.tab_conversation=Saruna -pulls.tab_commits=RevÄ«zijas -pulls.tab_files=IzmainÄ«tie faili -pulls.reopen_to_merge=AtkÄrtoti atveriet izmaiņu pieprasÄ«jumu, lai veiktu sapludinÄÅ¡anu. -pulls.cant_reopen_deleted_branch=Å o izmaiņu pieprasÄ«ju nevar atkÄroti atvÄ“rt, jo atzars ir izdzÄ“sts. -pulls.merged=SapludinÄts -pulls.merged_success=Izmaiņu pieprasÄ«jums vieksmÄ«gi sapludinÄts un aizvÄ“rts +pulls.tab_commits=IesÅ«tÄ«jumi +pulls.tab_files=IzmainÄ«tÄs datnes +pulls.reopen_to_merge=LÅ«gums atkÄrtoti atvÄ“rt Å¡o izmaiņu pieprasÄ«jumu, lai veiktu apvienoÅ¡anu. +pulls.cant_reopen_deleted_branch=Å o izmaiņu pieprasÄ«jumu nevar atkÄrtoti atvÄ“rt, jo zars ir izdzÄ“sts. +pulls.merged=Apvienots +pulls.merged_success=Izmaiņu pieprasÄ«jums sekmÄ«gi iekļauts un aizvÄ“rts pulls.closed=Izmaiņu pieprasÄ«jums aizvÄ“rts -pulls.manually_merged=ManuÄli sapludinÄts -pulls.merged_info_text=Atzaru %s tagad var dzÄ“st. +pulls.manually_merged=PaÅ¡rocÄ«gi apvienots +pulls.merged_info_text=Zaru %s tagad var izdzÄ“st. pulls.is_closed=Izmaiņu pieprasÄ«jums tika aizvÄ“rts. -pulls.title_wip_desc=`SÄciet virsrakstu ar %s, lai ierobežotu, ka izmaiņu pieprasÄ«jums netīšÄm tiktu sapludinÄts.` -pulls.cannot_merge_work_in_progress=Å is izmaiņu pieprasÄ«jums ir atzÄ«mÄ“ts, ka pie tÄ vÄ“l notiek izstrÄde. +pulls.title_wip_desc=`SÄkt virsrakstu ar %s, lai novÄ“rstu izmaiņu pieprasÄ«juma nejauÅ¡u iekļauÅ¡anu.` +pulls.cannot_merge_work_in_progress=Å is izmaiņu pieprasÄ«jums ir atzÄ«mÄ“ts kÄ nepabeigts darbs. pulls.still_in_progress=JoprojÄm notiek izstrÄde? -pulls.add_prefix=Pievienot %s prefiksu -pulls.remove_prefix=Noņemt %s prefiksu -pulls.data_broken=Izmaiņu pieprasÄ«jums ir bojÄts, jo dzÄ“sta informÄcija no atdalÄ«tÄ repozitorija. -pulls.files_conflicted=Å Ä«s izmaiņu pieprasÄ«juma izmaiņas konfliktÄ“ ar mÄ“rÄ·a atzaru. -pulls.is_checking=Notiek konfliktu pÄrbaude, mirkli uzgaidiet un atjaunojiet lapu. -pulls.is_ancestor=Atzars jau ir pilnÄ«bÄ iekļauts mÄ“rÄ·Ä atzarÄ. Nav izmaiņu, ko sapludinÄt. -pulls.is_empty=MÄ“rÄ·a atzars jau satur šī atzara izmaiņas. Å Ä« revÄ«zija bÅ«s tukÅ¡a. -pulls.required_status_check_failed=Dažas no pÄrbaudÄ“m nebija veiksmÄ«gas. -pulls.required_status_check_missing=TrÅ«kst dažu obligÄto pÄrbaužu. -pulls.required_status_check_administrator=KÄ administrators JÅ«s varat sapludinÄt Å¡o izmaiņu pieprasÄ«jumu. +pulls.add_prefix=Pievienot sÄkuma virkni %s +pulls.remove_prefix=Noņemt sÄkuma virkni %s +pulls.data_broken=Å is izmaiņu pieprasÄ«jums ir bojÄts trÅ«kstoÅ¡as atzarojuma informÄcijas dēļ. +pulls.files_conflicted=Å Ä« izmaiņu pieprasÄ«juma izmaiņas nav saderÄ«gas ar mÄ“rÄ·a zaru. +pulls.is_checking=Notiek apvienoÅ¡anas nesaderÄ«bu pÄrbaude. PÄ“c brīža jÄmēģina vÄ“lreiz. +pulls.is_ancestor=Zars jau ir pilnÄ«bÄ iekļauts mÄ“rÄ·a zarÄ. Nav izmaiņu, ko apvienot. +pulls.is_empty=Å Ä« zara izmaiņas jau ir mÄ“rÄ·a zarÄ. Å is bÅ«s tukÅ¡s iesÅ«tÄ«jums. +pulls.required_status_check_failed=Dažas no nepiecieÅ¡amajÄm pÄrbaudÄ“m bija nesekmÄ«gas. +pulls.required_status_check_missing=TrÅ«kst dažu nepiecieÅ¡amo pÄrbaužu. +pulls.required_status_check_administrator=KÄ pÄrvaldÄ«tÄjs joprojÄm vari iekļaut Å¡o izmaiņu pieprasÄ«jumu. pulls.blocked_by_approvals=Å im izmaiņu pieprasÄ«jumam vÄ“l nav pietiekami daudz apstiprinÄjumu. NodroÅ¡inÄti %d no %d apstiprinÄjumiem. -pulls.blocked_by_rejection=Å im izmaiņu pieprasÄ«jumam oficiÄlais recenzents ir pieprasÄ«jis labojumus. -pulls.blocked_by_official_review_requests=Å im izmaiņu pieprasÄ«jumam ir oficiÄli recenzijas pieprasÄ«jumi. -pulls.blocked_by_outdated_branch=Å is izmaiņu pieprasÄ«jums ir bloÄ·Ä“ts, jo tas ir novecojis. -pulls.blocked_by_changed_protected_files_1=Å is izmaiņu pieprasÄ«jums ir bloÄ·Ä“ts, jo tas izmaina aizsargÄto failu: -pulls.blocked_by_changed_protected_files_n=Å is izmaiņu pieprasÄ«jums ir bloÄ·Ä“ts, jo tas izmaina aizsargÄtos failus: -pulls.can_auto_merge_desc=Å o izmaiņu pieprasÄ«jumu var automÄtiski sapludinÄt. -pulls.cannot_auto_merge_desc=Å is izmaiņu pieprasÄ«jums nevar tikt automÄtiski sapludinÄts konfliktu dēļ. -pulls.cannot_auto_merge_helper=Sapludiniet manuÄli, lai atrisinÄtu konfliktus. -pulls.num_conflicting_files_1=%d fails ar konfliktiem -pulls.num_conflicting_files_n=%d faili ar konfliktiem +pulls.blocked_by_rejection=Å im izmaiņu pieprasÄ«jumam oficiÄlais izskatÄ«tÄjs ir pieprasÄ«jis labojumus. +pulls.blocked_by_official_review_requests=Å is izmaiņu pieprasÄ«jums ir aizturÄ“ts, jo tam trÅ«kst apstiprinÄjuma no viena vai vairÄkiem oficiÄlajiem izskatÄ«tÄjiem. +pulls.blocked_by_outdated_branch=Å is izmaiņu pieprasÄ«jums ir aizturÄ“ts, jo tas ir novecojis. +pulls.blocked_by_changed_protected_files_1=Å is izmaiņu pieprasÄ«jums ir aizturÄ“ts, jo tas izmaina aizsargÄtu datni: +pulls.blocked_by_changed_protected_files_n=Å is izmaiņu pieprasÄ«jums ir aizturÄ“ts, jo tas izmaina aizsargÄtas datnes: +pulls.can_auto_merge_desc=Å o izmaiņu pieprasÄ«jumu var automÄtiski iekļaut. +pulls.cannot_auto_merge_desc=Å o izmaiņu pieprasÄ«jumu nevar automÄtiski iekļaut nesaderÄ«bu dēļ. +pulls.cannot_auto_merge_helper=JÄapvieno paÅ¡rocÄ«gi, lai novÄ“rstu nesaderÄ«bas. +pulls.num_conflicting_files_1=%d nesaderÄ«ga datne +pulls.num_conflicting_files_n=%d nesaderÄ«gas datnes pulls.approve_count_1=%d apstiprinÄjums pulls.approve_count_n=%d apstiprinÄjumi -pulls.reject_count_1=%d izmaiņu pieprasÄ«jums -pulls.reject_count_n=%d pieprasÄ«tas izmaiņas -pulls.waiting_count_1=nepiecieÅ¡ama %d recenzija -pulls.waiting_count_n=nepiecieÅ¡amas %d recenzijas -pulls.wrong_commit_id=revÄ«zijas identifikÄtoram ir jÄbÅ«t revÄ«zijas identifikatoram no mÄ“rÄ·a atzara +pulls.reject_count_1=%d labojumu pieprasÄ«jums +pulls.reject_count_n=%d izmaiņu pieprasÄ«jumi +pulls.waiting_count_1=nepiecieÅ¡ama %d izskatīšana +pulls.waiting_count_n=nepiecieÅ¡amas %d izskatīšanas +pulls.wrong_commit_id=iesÅ«tÄ«juma identifikatoram jÄbÅ«t iesÅ«tÄ«juma identifikatoram mÄ“rÄ·a zarÄ -pulls.no_merge_desc=Å o izmaiņu pieprasÄ«jumu nav iespÄ“jams sapludinÄt, jo nav atļauts neviens sapludinÄÅ¡anas veids. -pulls.no_merge_helper=Lai sapludinÄtu Å¡o izmaiņu pieprasÄ«jumu, iespÄ“jojiet vismaz vienu sapludinÄÅ¡anas veidu repozitorija iestatÄ«jumos vai sapludiniet to manuÄli. -pulls.no_merge_wip=Å o izmaiņu pieprasÄ«jumu nav iespÄ“jams sapludinÄt, jo tas ir atzÄ«mÄ“ts, ka darbs pie tÄ vÄ“l nav pabeigts. -pulls.no_merge_not_ready=Izmaiņu pieprasÄ«jumu nav iespÄ“jams sapludinÄt, pÄrbaudiet recenziju statusu un statusa pÄrbaudes. -pulls.no_merge_access=Jums nav tiesÄ«bu sapludinÄt Å¡o izmaiņu pieprasÄ«jumu. -pulls.merge_pull_request=Izveidot sapludinÄÅ¡ana revÄ«ziju -pulls.rebase_merge_pull_request=PÄrbÄzÄ“t un pÄrtÄ«t uz priekÅ¡u -pulls.rebase_merge_commit_pull_request=PÄrbÄzÄ“t un izveidot sapludinÄÅ¡anas revÄ«ziju -pulls.squash_merge_pull_request=Izveidot saspieÅ¡anas revÄ«ziju -pulls.merge_manually=ManuÄli sapludinÄts -pulls.merge_commit_id=SapludinÄÅ¡anas revÄ«zijas ID -pulls.require_signed_wont_sign=AtzarÄ var iesÅ«tÄ«t tikai parakstÄ«tas revÄ«zijas, bet sapludinÄÅ¡anas revÄ«zijas netiks parakstÄ«ta +pulls.no_merge_desc=Å o izmaiņu pieprasÄ«jumu nevar iekļaut, jo visas glabÄtavas apvienoÅ¡anas iespÄ“jas ir atspÄ“jotas. +pulls.no_merge_helper=JÄiespÄ“jo apvienoÅ¡anas iespÄ“jas glabÄtavas iestatÄ«jumos vai arÄ« izmaiņu pieprasÄ«jums jÄiekļauj paÅ¡rocÄ«gi. +pulls.no_merge_wip=Å o izmaiņu pieprasÄ«jumu nav iespÄ“jams iekļaut, jo tas ir atzÄ«mÄ“ts kÄ nepabeigts darbs. +pulls.no_merge_not_ready=Å is izmaiņu pieprasÄ«jums nav gatavs apvienoÅ¡anai, jÄpÄrbauda izskatīšanas stÄvoklis un stÄvokļa pÄrbaudes. +pulls.no_merge_access=Nav pilnvaru, lai iekļautu Å¡o izmaiņu pieprasÄ«jumu. +pulls.merge_pull_request=Izveidot apvienoÅ¡anas iesÅ«tÄ«jumu +pulls.rebase_merge_pull_request=PÄrbÄzÄ“t, tad pÄrlÄ“kt +pulls.rebase_merge_commit_pull_request=PÄrbÄzÄ“t, tad izveidot apvienoÅ¡anas iesÅ«tÄ«jumu +pulls.squash_merge_pull_request=Izveidot saspieÅ¡anas iesÅ«tÄ«jumu +pulls.merge_manually=PaÅ¡rocÄ«gi apvienots +pulls.merge_commit_id=IekļauÅ¡anas iesÅ«tÄ«juma identifikators +pulls.require_signed_wont_sign=ZarÄ ir atļauti tikai parakstÄ«ti iesÅ«tÄ«jumi, bet šī apvienoÅ¡ana netiks parakstÄ«ta -pulls.invalid_merge_option=Nav iespÄ“jams izmantot Å¡Ädu sapludinÄÅ¡anas veidu Å¡im izmaiņu pieprasÄ«jumam. -pulls.merge_conflict=SapludinÄÅ¡ana neizdevÄs: Veicot sapludinÄÅ¡anu, radÄs konflikts. Mēģiniet izmantot citu sapludinÄÅ¡anas stratēģiju -pulls.merge_conflict_summary=Kļūdas paziņojums -pulls.rebase_conflict=SapludinÄÅ¡ana neizdevÄs: Veicot pÄrbÄzēšanu uz revÄ«ziju %[1]s, radÄs konflikts. Mēģiniet izmantot citu sapludinÄÅ¡anas stratēģiju -pulls.rebase_conflict_summary=Kļūdas paziņojums -pulls.unrelated_histories=SapludinÄÅ¡ana neizdevÄs: mÄ“rÄ·a un bÄzes atzariem nav kopÄ“jas vÄ“stures. Ieteikums: izvÄ“lieties citu sapludinÄÅ¡anas stratēģiju -pulls.merge_out_of_date=SapludinÄÅ¡ana neizdevÄs: sapludinÄÅ¡anas laikÄ, bÄzes atzarÄ tika iesÅ«tÄ«tas izmaiņas. Ieteikums: mēģiniet atkÄrtoti. -pulls.head_out_of_date=SapludinÄÅ¡ana neizdevÄs: sapludinÄÅ¡anas laikÄ, bÄzes atzarÄ tika iesÅ«tÄ«tas izmaiņas. Ieteikums: mēģiniet atkÄrtoti. -pulls.has_merged=NeizdevÄs: izmaiņu pieprasÄ«jums jau ir sapludinÄts, nevar to darÄ«t atkÄrtoti vai mainÄ«t mÄ“rÄ·a atzaru. -pulls.push_rejected=SapludinÄÅ¡ana neizdevÄs: iesÅ«tīšana tika noraidÄ«ta. PÄrbaudiet git ÄÄ·us Å¡im repozitorijam. +pulls.invalid_merge_option=Å im izmaiņu pieprasÄ«jumam nevar izmantot Å¡o apvienoÅ¡anas iespÄ“ju. +pulls.merge_conflict=ApvienoÅ¡ana neizdevÄs: iekļauÅ¡anas laikÄ radÄs nesaderÄ«bas. NorÄde: jÄmēģina cita pieeja +pulls.merge_conflict_summary=Kļūdas ziņojums +pulls.rebase_conflict=ApvienoÅ¡ana neizdevÄs: iesÅ«tÄ«juma %[1]s pÄrbÄzēšanas laikÄ radÄs nesaderÄ«ba. NorÄde: jÄmēģina cita pieeja +pulls.rebase_conflict_summary=Kļūdas ziņojums +pulls.unrelated_histories=ApvienoÅ¡ana neizdevÄs: apvienoÅ¡anas galotnei un pamatam nav kopÄ“jas vÄ“stures. NorÄde: jÄmēģina cita pieeja +pulls.merge_out_of_date=ApvienoÅ¡ana neizdevÄs: iekļauÅ¡anas laikÄ pamata zars tika atjauninÄts. NorÄde: jÄmēģina vÄ“lreiz. +pulls.head_out_of_date=ApvienoÅ¡ana neizdevÄs: iekļauÅ¡anas laikÄ galotne tika atjauninÄta. NorÄde: jÄmēģina vÄ“lreiz. +pulls.has_merged=NeizdevÄs: izmaiņu pieprasÄ«jums tika iekļauts, to nevar darÄ«t atkÄrtoti vai mainÄ«t mÄ“rÄ·a zaru. +pulls.push_rejected=AizgÄdÄÅ¡ana neizdevÄs: aizgÄdÄÅ¡ana tika noraidÄ«ta. JÄpÄrskata šīs glabÄtavas Git aizÄ·eres. pulls.push_rejected_summary=Pilns noraidīšanas ziņojums -pulls.push_rejected_no_message=SapludinÄÅ¡ana neizdevÄs: Izmaiņu iesÅ«tīšana tika noraidÄ«ta, bet serveris neatgrieza paziņojumu.
      PÄrbaudiet git ÄÄ·us Å¡im repozitorijam -pulls.open_unmerged_pull_exists=`JÅ«s nevarat veikt atkÄrtotas atvÄ“rÅ¡anas darbÄ«bu, jo jau eksistÄ“ izmaiņu pieprasÄ«jums (#%d) ar Å¡Ädu sapludinÄÅ¡anas informÄciju.` +pulls.push_rejected_no_message=AizgÄdÄÅ¡ana neizdevÄs: aizgÄdÄÅ¡ana tika noraidÄ«ta, bet serveris neatgrieza ziņojumu. JÄpÄrskata šīs glabÄtavas Git aizÄ·eres +pulls.open_unmerged_pull_exists=`Nevar veikt atkÄrtotu atvÄ“rÅ¡anu, jo jau pastÄv neapstiprinÄts izmaiņu pieprasÄ«jums (#%d) ar tieÅ¡i tÄdÄm paÅ¡Äm pazÄ«mÄ“m.` pulls.status_checking=Dažas pÄrbaudes vÄ“l tiek veiktas -pulls.status_checks_success=Visas pÄrbaudes ir veiksmÄ«gas -pulls.status_checks_warning=Dažas pÄrbaudes ziņoja brÄ«dinÄjumus +pulls.status_checks_success=Visas pÄrbaudes bija sekmÄ«gas +pulls.status_checks_warning=Dažas pÄrbaudes atgrieza brÄ«dinÄjumus pulls.status_checks_failure=Dažas pÄrbaudes neizdevÄs izpildÄ«t -pulls.status_checks_error=Dažu pÄrbaužu izpildes laikÄ, radÄs kļūdas -pulls.status_checks_requested=ObligÄts +pulls.status_checks_error=Dažas pÄrbaudes atgrieza kļūdas +pulls.status_checks_requested=NepiecieÅ¡ama pulls.status_checks_details=Papildu informÄcija pulls.status_checks_hide_all=PaslÄ“pt visas pÄrbaudes pulls.status_checks_show_all=ParÄdÄ«t visas pÄrbaudes -pulls.update_branch=Atjaunot atzaru, izmantojot, sapludinÄÅ¡anu -pulls.update_branch_rebase=Atjaunot atzaru, izmantojot, pÄrbÄzēšanu -pulls.update_branch_success=Atzara atjauninÄÅ¡ana veiksmÄ«gi pabeigta -pulls.update_not_allowed=Jums nav tiesÄ«bu veikt atzara atjaunoÅ¡anu -pulls.outdated_with_base_branch=Atzars ir novecojis salÄ«dzinot ar bÄzes atzaru +pulls.update_branch=AtjauninÄt zaru ar apvienoÅ¡anu +pulls.update_branch_rebase=AtjauninÄt zaru ar pÄrbÄzēšanu +pulls.update_branch_success=Zara atjauninÄÅ¡ana bija sekmÄ«ga +pulls.update_not_allowed=Nav ļauts atjauninÄt zaru +pulls.outdated_with_base_branch=Å is zars ir novecojis salÄ«dzinÄjumÄ ar pamata zaru pulls.close=AizvÄ“rt izmaiņu pieprasÄ«jumu pulls.closed_at=`aizvÄ“ra Å¡o izmaiņu pieprasÄ«jumu %[2]s` pulls.reopened_at=`atkÄrtoti atvÄ“ra Å¡o izmaiņu pieprasÄ«jumu %[2]s` -pulls.cmd_instruction_hint=`ApskatÄ«t komandrindas izmantoÅ¡anas norÄdes.` +pulls.cmd_instruction_hint=ApskatÄ«t komandrindas izmantoÅ¡anas norÄdes pulls.cmd_instruction_checkout_title=Paņemt -pulls.cmd_instruction_checkout_desc=Projekta repozitorijÄ jÄizveido jauns atzars un jÄpÄrbauda izmaiņas. -pulls.cmd_instruction_merge_title=SapludinÄt -pulls.cmd_instruction_merge_desc=SapludinÄt izmaiņas un atjaunot tÄs Gitea. -pulls.clear_merge_message=NotÄ«rÄ«t sapludinÄÅ¡anas ziņojumu -pulls.clear_merge_message_hint=NotÄ«rot sapludinÄÅ¡anas ziņojumu tiks noņemts tikai pats ziņojums, bet tiks paturÄ“ti Ä£enerÄ“tie git ziņojumu, kÄ "Co-Authored-By …". +pulls.cmd_instruction_checkout_desc=Projekta glabÄtavÄ jÄizveido jauns zars un jÄpÄrbauda izmaiņas. +pulls.cmd_instruction_merge_title=Apvienot +pulls.cmd_instruction_merge_desc=Apvienot izmaiņas un atjauninÄt tÄs Forgejo. +pulls.clear_merge_message=NotÄ«rÄ«t apvienoÅ¡anas ziņojumu +pulls.clear_merge_message_hint=ApvienoÅ¡anas ziņojuma notÄ«rīšana noņems tikai iesÅ«tÄ«juma ziņojuma saturu un paturÄ“s izveidotos noslÄ“gumus, piemÄ“ram, "Co-Authored-By …". -pulls.auto_merge_button_when_succeed=(Kad pÄrbaudes veiksmÄ«gas) -pulls.auto_merge_when_succeed=AutomÄtiski sapludinÄt, kad visas pÄrbaudes veiksmÄ«gas -pulls.auto_merge_newly_scheduled=Å is izmaiņu pieprasÄ«jums tika ieplÄnots automÄtiskajai sapludinÄÅ¡anai, kas visas pÄrbaudes bÅ«s veiksmÄ«gas. -pulls.auto_merge_has_pending_schedule=%[1]s ieplÄnoja šī izmaiņu pieprasÄ«juma automÄtisko sapludinÄÅ¡anu, kad visas pÄrbaudes tiks pabeigtas %[2]s. +pulls.auto_merge_button_when_succeed=(Kad pÄrbaudes sekmÄ«gi izpildÄs) +pulls.auto_merge_when_succeed=AutomÄtiski apvienot, kad visas pÄrbaudes ir sekmÄ«gi pabeigtas +pulls.auto_merge_newly_scheduled=Izmaiņu pieprasÄ«jums tika ieplÄnots apvienoÅ¡anai, kad visas pÄrbaudes bÅ«s sekmÄ«gi pabeigtas. +pulls.auto_merge_has_pending_schedule=%[1]s ieplÄnoja šī izmaiņu pieprasÄ«juma automÄtisku apvienoÅ¡anu, kad visas pÄrbaudes tiks sekmÄ«gi pabeigtas %[2]s. -pulls.auto_merge_cancel_schedule=Atcelt automÄtisko sapludinÄÅ¡anu -pulls.auto_merge_not_scheduled=Å o izmaiņu pieprasÄ«jumu nav ieplÄnots automÄtiski sapludinÄt. -pulls.auto_merge_canceled_schedule=AutomÄtiskÄ sapludinÄÅ¡ana Å¡im izmaiņu pieprasÄ«jumam tika atcelta. +pulls.auto_merge_cancel_schedule=Atcelt automÄtisko apvienoÅ¡anu +pulls.auto_merge_not_scheduled=Å o izmaiņu pieprasÄ«jumu nav ieplÄnots automÄtiski apvienot. +pulls.auto_merge_canceled_schedule=Å Ä« izmaiņu pieprasÄ«juma automÄtiskÄ apvienoÅ¡ana tika atcelta. -pulls.auto_merge_newly_scheduled_comment=`ieplÄnoja automÄtisko sapludinÄÅ¡anu Å¡im izmaiņu pieprasÄ«jumam, kad visas pÄrbaudes bÅ«s veiksmÄ«gas %[1]s` -pulls.auto_merge_canceled_schedule_comment=`atcÄ“la automÄtisko sapludinÄÅ¡anu Å¡im izmaiņu pieprasÄ«jumam %[1]s` +pulls.auto_merge_newly_scheduled_comment=`ieplÄnoja šī izmaiņu pieprasÄ«juma automÄtisko apvienoÅ¡anu, kad visas pÄrbaudes tiks sekmÄ«gi pabeigtas %[1]s` +pulls.auto_merge_canceled_schedule_comment=`atcÄ“la šī izmaiņu pieprasÄ«juma automÄtisku apvienoÅ¡anu pÄ“c visu pÄrbaužu sekmÄ«gas izpildes %[1]s` -pulls.delete.title=DzÄ“st Å¡o izmaiņu pieprasÄ«jumu? -pulls.delete.text=Vai patieÅ¡Äm vÄ“laties dzÄ“st Å¡o izmaiņu pieprasÄ«jumu? (Neatgriezeniski tiks izdzÄ“sts viss saturs. Apsveriet iespÄ“ju to aizvÄ“rt, ja vÄ“laties informÄciju saglabÄt vÄ“sturei) +pulls.delete.title=IzdzÄ“st Å¡o izmaiņu pieprasÄ«jumu? +pulls.delete.text=Vai tieÅ¡Äm izdzÄ“st Å¡o izmaiņu pieprasÄ«jumu? (Tiks neatgriezeniski izdzÄ“sts viss saturs. JÄapsver iespÄ“ja to aizvÄ“rt, ja ir nolÅ«ks to paturÄ“t arhivÄ“tu) -pulls.recently_pushed_new_branches=Tu iesÅ«tÄ«ji izmaiņas atzarÄ %[1]s %[2]s +pulls.recently_pushed_new_branches=Tu aizgÄdÄji izmaiņas zarÄ %[1]s %[2]s pull.deleted_branch=(izdzÄ“sts):%s milestones.new=Jauns atskaites punkts milestones.closed=AizvÄ“rts %s -milestones.update_ago=Atjaunots %s +milestones.update_ago=AtjauninÄts %s milestones.no_due_date=Bez termiņa -milestones.open=AtvÄ“rta +milestones.open=AtvÄ“rts milestones.close=AizvÄ“rt -milestones.new_subheader=Atskaites punkti var palÄ«dzÄ“t pÄrvaldÄ«t problÄ“mas un sekot to virzÄ«bai. -milestones.completeness=%d%% pabeigti +milestones.new_subheader=Atskaites punkti var palÄ«dzÄ“t pÄrvaldÄ«t pieteikumus un sekot to attÄ«stÄ«bai. +milestones.completeness=Pabeigtni %d%% milestones.create=Izveidot atskaites punktu milestones.title=Virsraksts milestones.desc=Apraksts -milestones.due_date=Termiņš (neobligÄts) +milestones.due_date=Beigu datums (pÄ“c izvÄ“les) milestones.clear=NotÄ«rÄ«t -milestones.invalid_due_date_format=Izpildes termiņam ir jÄbÅ«t formÄta 'yyyy-mm-dd'. -milestones.create_success=Atskaites punkts "%s" tika veiksmÄ«gi izveidots. +milestones.invalid_due_date_format=Beigu datuma pierakstam ir jÄbÅ«t "yyyy-mm-dd". +milestones.create_success=Tika izveidots atskaites punkts "%s". milestones.edit=Labot atskaites punktu -milestones.edit_subheader=Atskaites punkti, ļauj organizÄ“t problÄ“mas un sekot to progresam. +milestones.edit_subheader=Atskaites punkti ļauj sakÄrtot pieteikumus un sekot attÄ«stÄ«bai. milestones.cancel=Atcelt -milestones.modify=Labot atskaites punktu -milestones.edit_success=Izmaiņas atskaites punktÄ "%s" tika veiksmÄ«gi saglabÄtas. -milestones.deletion=DzÄ“st atskaites punktu -milestones.deletion_desc=Dzēšot Å¡o atskaites punktu, tas tiks noņemts no visÄm saistÄ«tajÄm problÄ“mÄm un izmaiņu pieprasÄ«jumiem. Vai turpinÄt? -milestones.deletion_success=Atskaites punkts tika veiksmÄ«gi izdzÄ“sts. -milestones.filter_sort.earliest_due_data=AgrÄkais izpildes laiks -milestones.filter_sort.latest_due_date=VÄ“lÄkais izpildes laiks +milestones.modify=AtjauninÄt atskaites punktu +milestones.edit_success=Atskaites punkts "%s" tika atjauninÄts. +milestones.deletion=IzdzÄ“st atskaites punktu +milestones.deletion_desc=Atskaites punkta izdzēšana noņems to no visiem saistÄ«tajiem pieteikumiem. TurpinÄt? +milestones.deletion_success=Atskaites punkts tika izdzÄ“sts. +milestones.filter_sort.earliest_due_data=AgrÄkais izpildes datums +milestones.filter_sort.latest_due_date=VÄ“lÄkais izpildes datums milestones.filter_sort.least_complete=VismazÄk pabeigtais milestones.filter_sort.most_complete=VisvairÄk pabeigtais -milestones.filter_sort.most_issues=VisvairÄk problÄ“mu -milestones.filter_sort.least_issues=VismazÄk problÄ“mu +milestones.filter_sort.most_issues=VisvairÄk pieteikumu +milestones.filter_sort.least_issues=VismazÄk pieteikumu -signing.will_sign=Å Ä« revÄ«zija tiks parakstÄ«ta ar atslÄ“gu "%s". -signing.wont_sign.error=Notika kļūda pÄrbaudot vai revÄ«zija var tikt parakstÄ«ta. -signing.wont_sign.nokey=Nav pieejamas atslÄ“gas, ar ko parakstÄ«t Å¡o revÄ«ziju. -signing.wont_sign.never=RevÄ«zijas nekad netiek parakstÄ«tas. -signing.wont_sign.always=RevÄ«zijas vienmÄ“r tiek parakstÄ«tas. -signing.wont_sign.pubkey=RevÄ«zija netiks parakstÄ«ta, jo kontam nav piesaistÄ«ta publiskÄ atslÄ“ga. -signing.wont_sign.twofa=JÄbÅ«t iespÄ“jotai divfaktoru autentifikÄcijai, lai parakstÄ«tu revÄ«zijas. -signing.wont_sign.parentsigned=RevÄ«zija netiks parakstÄ«ta, jo nav parakstÄ«ta vecÄka revÄ«zija. -signing.wont_sign.basesigned=SapludinÄÅ¡anas revÄ«zija netiks parakstÄ«ta, jo pamata revÄ«zija nav parakstÄ«ta. -signing.wont_sign.headsigned=SapludinÄÅ¡anas revÄ«zija netiks parakstÄ«ta, jo galvenÄ revÄ«zija nav parakstÄ«ta. -signing.wont_sign.commitssigned=SapludinÄÅ¡ana netiks parakstÄ«ta, jo visas saistÄ«tÄs revÄ«zijas nav parakstÄ«tas. -signing.wont_sign.approved=SapludinÄÅ¡ana netiks parakstÄ«ta, jo izmaiņu pieprasÄ«jums nav apstiprinÄts. -signing.wont_sign.not_signed_in=JÅ«s neesat pieteicies. +signing.will_sign=Å is iesÅ«tÄ«jums tiks parakstÄ«ts ar atslÄ“gu "%s". +signing.wont_sign.error=AtgadÄ«jÄs kļūda pÄrbaudot, vai iesÅ«tÄ«jums var tikt parakstÄ«ts. +signing.wont_sign.nokey=Nav pieejamas atslÄ“gas, ar ko parakstÄ«t Å¡o iesÅ«tÄ«jumu. +signing.wont_sign.never=IesÅ«tÄ«jumi nekad netiek parakstÄ«ti. +signing.wont_sign.always=IesÅ«tÄ«jumi vienmÄ“r tiek parakstÄ«ti. +signing.wont_sign.pubkey=IesÅ«tÄ«jums netiks parakstÄ«ts, jo kontam nav piesaistÄ«ta publiska atslÄ“ga. +signing.wont_sign.twofa=JÄbÅ«t iespÄ“jotai divpakÄpju autentificēšanai, lai parakstÄ«tu iesÅ«tÄ«jumus. +signing.wont_sign.parentsigned=IesÅ«tÄ«jums netiks parakstÄ«ts, jo nav parakstÄ«ts cilmes iesÅ«tÄ«jums. +signing.wont_sign.basesigned=ApvienoÅ¡ana netiks parakstÄ«ta, jo pamata iesÅ«tÄ«jums nav parakstÄ«ts. +signing.wont_sign.headsigned=ApvienoÅ¡ana netiks parakstÄ«ta, jo galvenais iesÅ«tÄ«jums nav parakstÄ«ts. +signing.wont_sign.commitssigned=ApvienoÅ¡ana netiks parakstÄ«ta, jo visi saistÄ«tie iesÅ«tÄ«jumi nav parakstÄ«ti. +signing.wont_sign.approved=ApvienoÅ¡ana netiks parakstÄ«ta, jo izmaiņu pieprasÄ«jums nav apstiprinÄts. +signing.wont_sign.not_signed_in=Tu neesi pieteicies. -ext_wiki=Piekļuve ÄrÄ“jai vikivietnei +ext_wiki=Ä€rÄ“ja vikivietne ext_wiki.desc=Ä€rÄ“jÄ vikivietne norÄda uz ÄrÄ“jo vikivietnes adresi. wiki=Vikivietne -wiki.welcome=Laipni lÅ«gti vikivietnÄ“. -wiki.welcome_desc=Vikivietne ļauj Jums un JÅ«su lÄ«dzstrÄdniekiem viegli dokumentÄ“t projektu. -wiki.desc=Vikivietne ir vieta, kur uzglabÄt dokumentÄciju. +wiki.welcome=Laipni lÅ«dzam vikivietnÄ“. +wiki.welcome_desc=Vikivietne ļauj rakstÄ«t un kopÄ«got dokumentÄciju ar lÄ«dzdalÄ«bniekiem. +wiki.desc=DokumentÄcijas rakstīšana un kopÄ«goÅ¡ana ar lÄ«dzdalÄ«bniekiem. wiki.create_first_page=Izveidot pirmo lapu wiki.page=Lapa wiki.filter_page=MeklÄ“t lapu wiki.new_page=Lapa wiki.page_title=Lapas virsraksts wiki.page_content=Lapas saturs -wiki.default_commit_message=Ierakstiet piezÄ«mes par šīs lapas izmaiņÄm (neobligÄts). +wiki.default_commit_message=RakstÄ«t piezÄ«mes par šīs lapas izmaiņÄm (pÄ“c izvÄ“les). wiki.save_page=SaglabÄt lapu wiki.last_commit_info=%s laboja lapu %s wiki.edit_page_button=Labot wiki.new_page_button=Jauna lapa -wiki.file_revision=Lapas rediģējums -wiki.wiki_page_revisions=Vikivietnes lapas rediģējumi +wiki.file_revision=Lapas labojums +wiki.wiki_page_revisions=Vikivietnes lapas labojumi wiki.back_to_wiki=Atpakaļ uz vikivietnes lapu -wiki.delete_page_button=DzÄ“st lapu +wiki.delete_page_button=IzdzÄ“st lapu wiki.delete_page_notice_1=Å Ä« darbÄ«ba izdzÄ“sÄ«s vikivietnes lapu "%s". Vai turpinÄt? -wiki.page_already_exists=Vikivietnes lapa ar Å¡Ädu nosaukumu jau eksistÄ“. +wiki.page_already_exists=Jau pastÄv vikivietnes lapa ar tÄdu paÅ¡u nosaukumu. wiki.reserved_page=Vikivietnes lapas nosaukums "%s" ir rezervÄ“ts. wiki.pages=Lapas wiki.last_updated=PÄ“dÄ“jo reizi labota %s -wiki.page_name_desc=Ievadiet vikivietnes lapas nosaukumu. SpeciÄlie nosaukumi ir: 'Home', '_Sidebar' un '_Footer'. -wiki.original_git_entry_tooltip=AttÄ“lot oriÄ£inÄlo Git faila nosaukumu. +wiki.page_name_desc=JÄievada šīs vikivietnes lapas nosaukums. Daži Ä«paÅ¡ie nosaukumi ir: "Home", "_Sidebar" un "_Footer". +wiki.original_git_entry_tooltip=RÄdÄ«t sÄkotnÄ“jo Git datni, nevis izmantot draudzÄ«go saiti. -activity=AktivitÄte -activity.period.filter_label=Laika periods: +activity=Notikumi +activity.period.filter_label=Laika posms: activity.period.daily=1 diena activity.period.halfweekly=3 dienas activity.period.weekly=1 nedēļa @@ -1912,63 +2079,63 @@ activity.period.quarterly=3 mÄ“neÅ¡i activity.period.semiyearly=6 mÄ“neÅ¡i activity.period.yearly=1 gads activity.overview=PÄrskats -activity.active_prs_count_1=%d aktÄ«vs izmaiņu pieprasÄ«jums -activity.active_prs_count_n=%d aktÄ«vi izmaiņu pieprasÄ«jumi -activity.merged_prs_count_1=SapludinÄts izmaiņu pieprasÄ«jums -activity.merged_prs_count_n=SapludinÄti izmaiņu pieprasÄ«jumi -activity.opened_prs_count_1=PiedÄvÄts izmaiņu pieprasÄ«jums -activity.opened_prs_count_n=PiedÄvÄti izmaiņu pieprasÄ«jumi +activity.active_prs_count_1=%d atvÄ“rts izmaiņu pieprasÄ«jums +activity.active_prs_count_n=%d atvÄ“rti izmaiņu pieprasÄ«jumi +activity.merged_prs_count_1=Iekļauts izmaiņu pieprasÄ«jums +activity.merged_prs_count_n=Iekļauti izmaiņu pieprasÄ«jumi +activity.opened_prs_count_1=IerosinÄts izmaiņu pieprasÄ«jums +activity.opened_prs_count_n=IerosinÄti izmaiņu pieprasÄ«jumi activity.title.user_1=%d lietotÄjs activity.title.user_n=%d lietotÄji activity.title.prs_1=%d izmaiņu pieprasÄ«jumu activity.title.prs_n=%d izmaiņu pieprasÄ«jumus -activity.title.prs_merged_by=%s sapludinÄja %s -activity.title.prs_opened_by=%s piedÄvÄja %s -activity.merged_prs_label=SapludinÄts -activity.opened_prs_label=PiedÄvÄts -activity.active_issues_count_1=%d aktÄ«va problÄ“ma -activity.active_issues_count_n=%d aktÄ«vas problÄ“mas -activity.closed_issues_count_1=SlÄ“gta problÄ“ma -activity.closed_issues_count_n=SlÄ“gtas problÄ“mas -activity.title.issues_1=%d problÄ“mu -activity.title.issues_n=%d problÄ“mas -activity.title.issues_closed_from=%s aizvÄ“rts no %s +activity.title.prs_merged_by=%s iekļÄva %s +activity.title.prs_opened_by=%s ierosinÄja %s +activity.merged_prs_label=Iekļauts +activity.opened_prs_label=IerosinÄts +activity.active_issues_count_1=%d atvÄ“rts pieteikums +activity.active_issues_count_n=%d atvÄ“rti pieteikumi +activity.closed_issues_count_1=AizvÄ“rts pieteikums +activity.closed_issues_count_n=AizvÄ“rti pieteikumi +activity.title.issues_1=%d pieteikumu +activity.title.issues_n=%d pieteikumus +activity.title.issues_closed_from=%s aizvÄ“ra %s activity.title.issues_created_by=%s izveidoja %s -activity.closed_issue_label=SlÄ“gta -activity.new_issues_count_1=Jauna problÄ“ma -activity.new_issues_count_n=Jaunas problÄ“mas -activity.new_issue_label=AtvÄ“rta -activity.title.unresolved_conv_1=%d neatrisinÄta diskusija -activity.title.unresolved_conv_n=%d neatrisinÄtas diskusijas -activity.unresolved_conv_desc=Saraksts ar visÄm problÄ“mÄm un izmaiņu pieprasÄ«jumiem, kas nesen mainÄ«ti un vÄ“l nav atrisinÄti. +activity.closed_issue_label=AizvÄ“rts +activity.new_issues_count_1=Jauns pieteikums +activity.new_issues_count_n=Jauni pieteikumi +activity.new_issue_label=AtvÄ“ra +activity.title.unresolved_conv_1=%d neatrisinÄta saruna +activity.title.unresolved_conv_n=%d neatrisinÄtu apsprieÅ¡anu +activity.unresolved_conv_desc=Å ie nesen mainÄ«tie pieteikumi un izmaiņu pieprasÄ«jumi vÄ“l nav atrisinÄti. activity.unresolved_conv_label=AtvÄ“rts -activity.title.releases_1=%d versiju -activity.title.releases_n=%d versijas -activity.title.releases_published_by=%s publicÄ“ja %s -activity.published_release_label=PublicÄ“ts +activity.title.releases_1=%d laidiens +activity.title.releases_n=%d laidieni +activity.title.releases_published_by=%s laida klÄjÄ %s +activity.published_release_label=Laidiens activity.no_git_activity=Å ajÄ laika periodÄ nav notikuÅ¡as nekÄdas izmaiņas. -activity.git_stats_exclude_merges=Neskaitot sapludinÄÅ¡anas revÄ«zijas, +activity.git_stats_exclude_merges=Neskaitot apvienoÅ¡anas iesÅ«tÄ«jumus, activity.git_stats_author_1=%d autors activity.git_stats_author_n=%d autori -activity.git_stats_pushed_1=iesÅ«tÄ«ja -activity.git_stats_pushed_n=iesÅ«tÄ«ja -activity.git_stats_commit_1=%d revÄ«ziju -activity.git_stats_commit_n=%d revÄ«zijas -activity.git_stats_push_to_branch=atzarÄ %s un -activity.git_stats_push_to_all_branches=visos atzaros. -activity.git_stats_on_default_branch=AtzarÄ %s, -activity.git_stats_file_1=%d fails -activity.git_stats_file_n=%d faili +activity.git_stats_pushed_1=aizgÄdÄja +activity.git_stats_pushed_n=aizgÄdÄja +activity.git_stats_commit_1=%d iesÅ«tÄ«jumu +activity.git_stats_commit_n=%d iesÅ«tÄ«jumus +activity.git_stats_push_to_branch=zarÄ %s un +activity.git_stats_push_to_all_branches=visos zaros. +activity.git_stats_on_default_branch=ZarÄ %s, +activity.git_stats_file_1=%d datne +activity.git_stats_file_n=%d datnes activity.git_stats_files_changed_1=tika izmainÄ«ts activity.git_stats_files_changed_n=tika izmainÄ«ti activity.git_stats_additions=un tika veiktas activity.git_stats_addition_1=%d pievienoÅ¡ana activity.git_stats_addition_n=%d pievienoÅ¡anas activity.git_stats_and_deletions=un -activity.git_stats_deletion_1=%d dzēšana -activity.git_stats_deletion_n=%d dzēšanas +activity.git_stats_deletion_1=%d izdzēšana +activity.git_stats_deletion_n=%d izdzēšanas -contributors.contribution_type.commits=RevÄ«zijas +contributors.contribution_type.commits=IesÅ«tÄ«jumi search=MeklÄ“t search.search_repo=Meklēšana repozitorijÄ @@ -1982,267 +2149,267 @@ search.code_no_results=Netika atrasts pirmkods, kas atbilstu kritÄ“rijiem. search.code_search_unavailable=PaÅ¡laik koda meklēšana nav pieejama. Sazinieties ar lapas administratoru. settings=IestatÄ«jumi -settings.desc=IestatÄ«jumi ir vieta, kur varat pÄrvaldÄ«t repozitorija iestatÄ«jumus -settings.options=Repozitorijs -settings.collaboration=LÄ«dzstrÄdnieks -settings.collaboration.admin=Administrators -settings.collaboration.write=Rakstīšanas -settings.collaboration.read=SkatīšanÄs +settings.desc=IestatÄ«jumi ir vieta, kur pÄrvaldÄ«t glabÄtavas iestatÄ«jumus +settings.options=GlabÄtava +settings.collaboration=LÄ«dzdalÄ«bnieki +settings.collaboration.admin=PÄrvaldÄ«tÄjs +settings.collaboration.write=RakstÄ«t +settings.collaboration.read=LasÄ«t settings.collaboration.owner=ĪpaÅ¡nieks settings.collaboration.undefined=NedefinÄ“tas -settings.hooks=TÄ«mekļa ÄÄ·i -settings.githooks=Git ÄÄ·i +settings.hooks=TÄ«mekļa aizÄ·eres +settings.githooks=Git aizÄ·eres settings.basic_settings=PamatiestatÄ«jumi -settings.mirror_settings=Spoguļa iestatÄ«jumi -settings.mirror_settings.docs=Iestatiet, ka tiks viekta automÄtiska revÄ«ziju, tagu un atzaru sinhronizÄcija ar citu repozitoriju. -settings.mirror_settings.docs.disabled_pull_mirror.instructions=Iestatiet, ka visas revÄ«zijas, tagi un atzari tiks automÄtiski nosÅ«tÄ«tu uz citu repozitoriju. Izgūšanas spoguļus administrators ir aizliedzis izmantot. -settings.mirror_settings.docs.disabled_push_mirror.instructions=Iestatiet, ka visas revÄ«zijas, tagi un atzari tiks automÄtiski pÄrņemti no cita repozitorija. -settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning=PaÅ¡laik to var izdarÄ«t tikai, izmantojot, sadaļu "Jauna migrÄcija". SÄ«kÄkai informÄcijai, skatieties: -settings.mirror_settings.docs.disabled_push_mirror.info=IesÅ«tīšanas spoguļus administrators ir aizliedzis izmantot. -settings.mirror_settings.docs.no_new_mirrors=Å is repozitorijs spoguļo izmaiņas uz vai no cita repozitorija. PaÅ¡laik vairÄk nav iespÄ“jams izveidot jaunus spoguļa repozitorijus. -settings.mirror_settings.docs.can_still_use=Lai arÄ« nav iespÄ“jams mainÄ«t esoÅ¡os vai izveidot jaunus spoguļa repozitorijus, esoÅ¡ie turpinÄs strÄdÄt. -settings.mirror_settings.docs.pull_mirror_instructions=Lai ietatÄ«tu atvilkÅ¡anas spoguli, sekojiet instrukcijÄm: -settings.mirror_settings.docs.more_information_if_disabled=VairÄk par piegÄdÄÅ¡anas un saņemÅ¡anas spoguļiem var uzzinÄt Å¡eit: -settings.mirror_settings.docs.doc_link_title=KÄ spoguļot repozitorijus? -settings.mirror_settings.docs.doc_link_pull_section=dokumentÄcijas nodaÄ¼Ä "Pulling from a remote repository". -settings.mirror_settings.docs.pulling_remote_title=Atvilkt no attÄla repozitorija -settings.mirror_settings.mirrored_repository=Spoguļotais repozitorijs +settings.mirror_settings=SpoguļglabÄtavas iestatÄ«jumi +settings.mirror_settings.docs=IestatÄ«t glabÄtavu, lai automÄtiski sinhronizÄ“tu iesÅ«tÄ«jumus, birkas un zarus ar citu glabÄtavu. +settings.mirror_settings.docs.disabled_pull_mirror.instructions=IestatÄ«t projektu, lai uz citu glabÄtavu automÄtiski aizgÄdÄtu iesÅ«tÄ«jumus, birkas un zarus. Vietnes pÄrvaldÄ«tÄjs ir atspÄ“jojis izgūšanas spoguļglabÄtavas. +settings.mirror_settings.docs.disabled_push_mirror.instructions=IestatÄ«t projektu, lai no citas glabÄtavas automÄtiski atgÄdÄtu iesÅ«tÄ«jumus, birkas un zarus. +settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning=PaÅ¡laik tas ir izdarÄms tikai sadaÄ¼Ä "Jauna pÄrcelÅ¡ana". PÄ“c vairÄk informÄcijas lÅ«gums vÄ“rsties: +settings.mirror_settings.docs.disabled_push_mirror.info=Vietnes pÄrvaldÄ«tÄjs ir atspÄ“jojis iesÅ«tīšanas spoguļglabÄtavas. +settings.mirror_settings.docs.no_new_mirrors=Å Ä« glabÄtava spoguļo izmaiņas uz vai no citas glabÄtavas. LÅ«gums paturÄ“t prÄtÄ, ka paÅ¡laik nevar izveidot jaunas spoguļglabÄtavas. +settings.mirror_settings.docs.can_still_use=Lai arÄ« nevar labot esoÅ¡Äs spoguļglabÄtavas vai izveidot jaunas, joprojÄm var izmantot esoÅ¡Äs spoguļglabÄtavas. +settings.mirror_settings.docs.pull_mirror_instructions=Lai iestatÄ«tu atgÄdÄÅ¡anas spoguļglabÄtavu, lÅ«gums pÄrskatÄ«t: +settings.mirror_settings.docs.more_information_if_disabled=VairÄk par aizgÄdÄÅ¡anas un izgūšanas spoguļglabÄtavÄm var uzzinÄt Å¡eit: +settings.mirror_settings.docs.doc_link_title=KÄ spoguļot glabÄtavas? +settings.mirror_settings.docs.doc_link_pull_section=dokumentÄcijas nodaÄ¼Ä "Izgūšana no attÄlas glabÄtavas". +settings.mirror_settings.docs.pulling_remote_title=AtgÄdÄ no attÄlas glabÄtavas +settings.mirror_settings.mirrored_repository=SpoguļotÄ glabÄtava settings.mirror_settings.direction=Virziens -settings.mirror_settings.direction.pull=Izmaiņu saņemÅ¡ana -settings.mirror_settings.direction.push=Izmaiņu nosÅ«tīšana +settings.mirror_settings.direction.pull=AtgÄdÄÅ¡ana +settings.mirror_settings.direction.push=AizgÄdÄÅ¡ana settings.mirror_settings.last_update=PÄ“dÄ“jÄs izmaiņas -settings.mirror_settings.push_mirror.none=Nav konfigurÄ“ts iesÅ«tīšanas spogulis -settings.mirror_settings.push_mirror.remote_url=Git attÄlinÄtÄ repozitorija URL -settings.mirror_settings.push_mirror.add=Pievienot iesÅ«tīšanas spoguli -settings.mirror_settings.push_mirror.edit_sync_time=Labot spoguļa sinhronizÄcijas intervÄlu +settings.mirror_settings.push_mirror.none=Nav pievienotu aizgÄdÄÅ¡anas spoguļglabÄtavu +settings.mirror_settings.push_mirror.remote_url=Git attÄlÄs glabÄtavas URL +settings.mirror_settings.push_mirror.add=Pievienot aizgÄdÄÅ¡anas spoguļglabÄtavu +settings.mirror_settings.push_mirror.edit_sync_time=Labot spoguļglabÄtavas sinhronizēšanas starplaiku settings.sync_mirror=SinhronizÄ“t tagad -settings.pull_mirror_sync_in_progress=PaÅ¡laik tiek saņemtas izmaiņas no attÄlÄ %s. -settings.push_mirror_sync_in_progress=PaÅ¡laik tiek piegÄdÄtas izmaiņas uz attÄlo %s. -settings.site=MÄjas lapa -settings.update_settings=MainÄ«t iestatÄ«jumus -settings.update_mirror_settings=Atjaunot spoguļa iestatÄ«jumus -settings.branches.switch_default_branch=MainÄ«t noklusÄ“to atzaru -settings.branches.update_default_branch=Atjaunot noklusÄ“to atzaru -settings.branches.add_new_rule=Pievienot jaunu noteikumu +settings.pull_mirror_sync_in_progress=PaÅ¡laik tiek atgÄdÄtas izmaiņas no attÄlÄs %s. +settings.push_mirror_sync_in_progress=PaÅ¡laik tiek aizgÄdÄtas izmaiņas uz attÄlo %s. +settings.site=TÄ«mekļvietne +settings.update_settings=SaglabÄt iestatÄ«jumus +settings.update_mirror_settings=AtjauninÄt spoguļglabÄtavas iestatÄ«jumus +settings.branches.switch_default_branch=MainÄ«t noklusÄ“juma zaru +settings.branches.update_default_branch=AtjauninÄt noklusÄ“juma zaru +settings.branches.add_new_rule=Pievienot jaunu kÄrtulu settings.advanced_settings=Papildu iestatÄ«jumi -settings.wiki_desc=IespÄ“jot vikivietnes +settings.wiki_desc=IespÄ“jot glabÄtavas vikivietni settings.use_internal_wiki=Izmantot iebÅ«vÄ“to vikivietni -settings.use_external_wiki=Izmantot ÄrÄ“jo vikivietni -settings.external_wiki_url=Ä€rÄ“jÄs Vikivietnes adrese -settings.external_wiki_url_error=Ä€rÄ“jÄs vikivietnes URL nav korekts URL. +settings.use_external_wiki=Izmantot ÄrÄ“ju vikivietni +settings.external_wiki_url=Ä€rÄ“jÄs vikivietnes URL +settings.external_wiki_url_error=Ä€rÄ“jÄs vikivietnes URL nav derÄ«gs URL. settings.external_wiki_url_desc=ApmeklÄ“tÄji tiks novirzÄ«ti uz ÄrÄ“jÄs vikivietnes adresi, kad uzklikšķinÄs uz cilnes. -settings.issues_desc=IespÄ“jot iebÅ«vÄ“to problÄ“mu sekotÄju -settings.use_internal_issue_tracker=Izmantot iebÅ«vÄ“to problÄ“mu sekotÄju -settings.use_external_issue_tracker=Izmantot ÄrÄ“jo problÄ“mu sekotÄju -settings.external_tracker_url=Ä€rÄ“jÄ problÄ“mu reÄ£istra URL -settings.external_tracker_url_error=Nekorekts ÄrÄ“jÄ problÄ“mu sekotÄja URL. -settings.external_tracker_url_desc=ApmeklÄ“tÄji tiks novirzÄ«ti uz ÄrÄ“jÄ problÄ“mu sekotÄja adresi, kad uzklikšķinÄs uz cilnes. -settings.tracker_url_format=Ä€rÄ“jÄ problÄ“mu sekotÄja adreses formÄts -settings.tracker_url_format_error=Ä€rÄ“jÄ problÄ“mu sekotÄja URL formÄts nav korekts URL. -settings.tracker_issue_style=Ä€rÄ“jÄ problÄ“mu sekotÄja numura formÄts +settings.issues_desc=IespÄ“jot glabÄtavas pieteikumu izsekotÄju +settings.use_internal_issue_tracker=Izmantot iebÅ«vÄ“to pieteikumu izsekotÄju +settings.use_external_issue_tracker=Izmantot ÄrÄ“ju pieteikumu izsekotÄju +settings.external_tracker_url=Ä€rÄ“jÄ pieteikumu izsekotÄja URL +settings.external_tracker_url_error=Ä€rÄ“jÄ pieteikumu izsekotÄja URL nav derÄ«gs URL. +settings.external_tracker_url_desc=ApmeklÄ“tÄji tiks novirzÄ«ti uz ÄrÄ“jÄ pieteikumu izsekotÄja URL pÄ“c klikšķinÄÅ¡anas uz pieteikumu cilnes. +settings.tracker_url_format=Ä€rÄ“jÄ pieteikumu izsekotÄja URL uzbÅ«ve +settings.tracker_url_format_error=Ä€rÄ“jÄ pieteikumu izsekotÄja URL uzbÅ«ve neatbilst derÄ«gam URL. +settings.tracker_issue_style=Ä€rÄ“jÄ pieteikumu izsekotÄja numuru uzbÅ«ve settings.tracker_issue_style.numeric=Cipari settings.tracker_issue_style.alphanumeric=Burti un cipari settings.tracker_issue_style.regexp=RegulÄrÄ izteiksme -settings.tracker_issue_style.regexp_pattern=RegulÄrÄs izteiksmes Å¡ablons -settings.tracker_issue_style.regexp_pattern_desc=PirmÄ iegultÄ grupa tiks izmantota {index} vietÄ. -settings.tracker_url_format_desc=JÅ«s varat izmantot {user}, {repo} un {index} lietotÄjvÄrdam, repozitorija nosaukumam un problÄ“mas identifikatoram. +settings.tracker_issue_style.regexp_pattern=RegulÄrÄs izteiksmes paraugs +settings.tracker_issue_style.regexp_pattern_desc=PirmÄ tveramÄ kopa tiks izmantota {index} vietÄ. +settings.tracker_url_format_desc=Var izmantot vietturus {user}, {repo} un {index} lietotÄjvÄrdam, glabÄtavas nosaukumam un pieteikuma indeksam. settings.enable_timetracker=IespÄ“jot laika uzskaiti -settings.allow_only_contributors_to_track_time=Atļaut tikai dalÄ«bniekiem uzskaitÄ«t laiku -settings.pulls_desc=IespÄ“jot repozitorija izmaiņu pieprasÄ«jumus -settings.pulls.ignore_whitespace=PÄrbaudot konfliktus, ignorÄ“t izmaiņas atstarpÄ“s -settings.pulls.enable_autodetect_manual_merge=IespÄ“jot manuÄlas sapludinÄÅ¡anas noteikÅ¡anu (PiezÄ«me: dažos speciÄlos gadÄ«jumos, tas var nostrÄdÄt nekorekti) -settings.pulls.allow_rebase_update=IespÄ“jot izmaiņu pieprasÄ«juma atjaunoÅ¡anu ar pÄrbÄzēšanu -settings.pulls.default_delete_branch_after_merge=PÄ“c noklusÄ“juma dzÄ“st izmaiņu pieprasÄ«juma atzaru pÄ“c sapludinÄÅ¡anas +settings.allow_only_contributors_to_track_time=Atļaut uzskaitÄ«t laiku tikai lÄ«dzdalÄ«bniekiem +settings.pulls_desc=IespÄ“jot glabÄtavas izmaiņu pieprasÄ«jumus +settings.pulls.ignore_whitespace=NesaderÄ«bu noteikÅ¡anÄ neņemt vÄ“rÄ atstarpes +settings.pulls.enable_autodetect_manual_merge=IespÄ“jot paÅ¡rocÄ«gas apvienoÅ¡anas noteikÅ¡anu (PiezÄ«me: dažos Ä«paÅ¡os gadÄ«jumos tÄ var nenostrÄdÄt pareizi) +settings.pulls.allow_rebase_update=IespÄ“jot izmaiņu pieprasÄ«juma zara atjauninÄÅ¡anu ar pÄrbÄzēšanu +settings.pulls.default_delete_branch_after_merge=PÄ“c noklusÄ“juma izdzÄ“st izmaiņu pieprasÄ«juma zaru pÄ“c apvienoÅ¡anas settings.pulls.default_allow_edits_from_maintainers=Atļaut uzturÄ“tÄjiem labot pÄ“c noklusÄ“juma -settings.releases_desc=IespÄ“jot repozitorija laidienus -settings.packages_desc=IespÄ“jot repozitorija pakotņu reÄ£istru -settings.projects_desc=IespÄ“jot repozitorija projektus -settings.actions_desc=IespÄ“jot repozitorija darbÄ«bas -settings.admin_settings=Administratora iestatÄ«jumi -settings.admin_enable_health_check=IespÄ“jot veselÄ«bas pÄrbaudi (git fsck) Å¡im repozitorijam -settings.admin_code_indexer=Izejas koda indeksÄ“tÄjs -settings.admin_stats_indexer=Izejas koda statistikas indeksÄ“tÄjs -settings.admin_indexer_commit_sha=PÄ“dÄ“jÄ indeksÄ“tÄ revÄ«zija +settings.releases_desc=IespÄ“jot glabÄtavas laidienus +settings.packages_desc=IespÄ“jot glabÄtavas pakotņu reÄ£istru +settings.projects_desc=IespÄ“jot glabÄtavas projektus +settings.actions_desc=IespÄ“jot iekļautos CI/CD cauruļvadus ar Forgejo Actions +settings.admin_settings=PÄrvaldÄ«tÄja iestatÄ«jumi +settings.admin_enable_health_check=IespÄ“jot glabÄtavas darbspÄ“jas pÄrbaudes (git fsck) +settings.admin_code_indexer=Koda indeksÄ“tÄjs +settings.admin_stats_indexer=Koda statistikas indeksÄ“tÄjs +settings.admin_indexer_commit_sha=PÄ“dÄ“jais indeksÄ“tais iesÅ«tÄ«jums settings.admin_indexer_unindexed=NeindeksÄ“ts -settings.reindex_button=Pievienot pÄrindeksēšanas rindai +settings.reindex_button=Pievienot pÄrindeksēšanas rindsarakstam settings.reindex_requested=PieprasÄ«ta pÄrindeksēšana -settings.admin_enable_close_issues_via_commit_in_any_branch=AizvÄ“rt problÄ“mu ar izmaiņu komentÄru iesÅ«tÄ«tu jebkurÄ atzarÄ -settings.danger_zone=BÄ«stamÄ zona -settings.new_owner_has_same_repo=Jaunajam Ä«paÅ¡niekam jau ir repozitorijs ar Å¡Ädu nosaukumu. -settings.convert=KonvertÄ“t uz parastu repozitoriju -settings.convert_desc=JÅ«s varat nomainÄ«t Å¡o spoguli uz parastu repozitoriju. Å Ä« darbÄ«ba ir neatgriezeniska. -settings.convert_notices_1=Å Ä« darbÄ«ba mainÄ«s spoguli uz parastu repozitoriju un ir neatgriezeniska. -settings.convert_confirm=KonvertÄ“t repozitoriju -settings.convert_succeed=Spogulis tika izmainÄ«ts par parastu repozitoriju. -settings.convert_fork=KonvertÄ“t uz parastu repozitoriju -settings.convert_fork_desc=JÅ«s varat nomainÄ«t Å¡o atdalÄ«to repozitoriju kÄ neatkarÄ«gu repozitoriju. Å Ä« darbÄ«ba ir neatgriezeniska. -settings.convert_fork_notices_1=Å Ä« darbÄ«ba mainÄ«s atdalÄ«to repozitoriju uz neatkarÄ«gu repozitoriju un ir neatgriezeniska. -settings.convert_fork_confirm=KonvertÄ“t repozitoriju -settings.convert_fork_succeed=AtdalÄ«tais repozitorijs tika izmainÄ«ts par neatkarÄ«gu repozitoriju. -settings.transfer.title=MainÄ«t Ä«paÅ¡nieku -settings.transfer.rejected=Repozitorija Ä«paÅ¡nieka maiņas pieprasÄ«jums tika noraidÄ«ts. -settings.transfer.success=Repozitorija Ä«paÅ¡nieka maiņa veiksmÄ«ga. -settings.transfer_abort=Atcelt Ä«paÅ¡nieka maiņu -settings.transfer_abort_invalid=Nevar atcelt neeksistÄ“joÅ¡a repozitorija Ä«paÅ¡nieka maiņu. -settings.transfer_abort_success=Repozitorija Ä«paÅ¡nieka maiņa uz %s tika veiksmÄ«gi atcelta. -settings.transfer_desc=MainÄ«t šī repozitorija Ä«paÅ¡nieku uz citu lietotÄju vai organizÄciju, kurai Jums ir administratora tiesÄ«bas. +settings.admin_enable_close_issues_via_commit_in_any_branch=AizvÄ“rt pieteikumu ar iesÅ«tÄ«jumu ne noklusÄ“juma zarÄ +settings.danger_zone=BÄ«stamais apgabals +settings.new_owner_has_same_repo=Jaunajam Ä«paÅ¡niekam jau ir glabÄtava ar tÄdu paÅ¡u nosaukumu. LÅ«gums izvÄ“lÄ“ties citu nosaukumu. +settings.convert=PÄrveidot par parastu glabÄtavu +settings.convert_desc=Å o spoguļglabÄtavu var pÄrveidot par parastu glabÄtavu. To nevar atsaukt. +settings.convert_notices_1=Å Ä« darbÄ«ba pÄrveidos spoguļglabÄtavu par parastu glabÄtavu un nav atsaucama. +settings.convert_confirm=PÄrveidot glabÄtavu +settings.convert_succeed=SpoguļglabÄtava tika pÄrveidota par parastu glabÄtavu. +settings.convert_fork=PÄrveidot par parastu glabÄtavu +settings.convert_fork_desc=Å o atzarojumu var pÄrveidot par parastu glabÄtavu. To nevar atsaukt. +settings.convert_fork_notices_1=Å Ä« darbÄ«ba pÄrveidos atzarojumu par parastu glabÄtavu, un tÄ nav atsaucama. +settings.convert_fork_confirm=PÄrveidot glabÄtavu +settings.convert_fork_succeed=Atzarojums tika pÄrveidots par parastu glabÄtavu. +settings.transfer.title=Nodot Ä«paÅ¡umtiesÄ«bas +settings.transfer.rejected=GlabÄtavas nodoÅ¡ana tika noraidÄ«ta. +settings.transfer.success=GlabÄtavas nodoÅ¡ana bija sekmÄ«ga. +settings.transfer_abort=Atcelt nodoÅ¡anu +settings.transfer_abort_invalid=Nevar atcelt neesoÅ¡u glabÄtavas nodoÅ¡anu. +settings.transfer_abort_success=GlabÄtavas nodoÅ¡ana %s tika sekmÄ«gi atcelta. +settings.transfer_desc=Nodot Å¡o glabÄtavu lietotÄjam vai apvienÄ«bai, kurÄ Tev ir pÄrvaldÄ«tÄja tiesÄ«bas. settings.transfer_form_title=Ievadiet repozitorija nosaukumu, lai apstiprinÄtu: -settings.transfer_in_progress=PaÅ¡laik jau tiek veikta repozitorija Ä«paÅ¡nieka maiņa. Atceliet iepriekšējo Ä«paÅ¡nieka maiņu, ja vÄ“laties mainÄ«t uz citu. -settings.transfer_notices_1=- Tiks zaudÄ“ta piekļuve repozitorijam, ja jaunais Ä«paÅ¡nieks ir individuÄls lietotÄjs. -settings.transfer_notices_2=- Tiks saglabÄta piekļuve, ja jaunais Ä«paÅ¡nieks ir organizÄcija un esat viens no tÄs Ä«paÅ¡niekiem. -settings.transfer_notices_3=- Ja repozitorijs ir privÄts un tas tiks pÄrsÅ«tÄ«ts lietotÄjam, tad pÄrliecinÄties, ka lietotÄjam ir vismaz skatīšanÄs tiesÄ«bas (veiciet nepiecieÅ¡amÄs izmaiņas, ja nepiecieÅ¡ams). +settings.transfer_in_progress=PaÅ¡laik jau ir notiekoÅ¡a nodoÅ¡ana. LÅ«gums to atcelt, ja ir vÄ“lme nodot Å¡o glabÄtavu citam lietotÄjam. +settings.transfer_notices_1=- Tiks zaudÄ“ta piekļuve glabÄtavai, ja tÄ tiks nodota atsevišķam lietotÄjam. +settings.transfer_notices_2=- Tiks saglabÄta piekļuve glabÄtavai, ja tÄ tiks nodota apvienÄ«bai, kurai esi (lÄ«dz)Ä«paÅ¡nieks. +settings.transfer_notices_3=- Ja glabÄtava ir privÄta un tÄ tiek nodota atsevišķam lietotÄjam, šī darbÄ«ba pÄrbauda, vai lietotÄjam ir vismaz lasīšanas atļauja (un izmaina atļaujas, ja nepiecieÅ¡ams). settings.transfer_owner=Jaunais Ä«paÅ¡nieks -settings.transfer_perform=Veikt Ä«paÅ¡nieka maiņu -settings.transfer_started=`Å im repozitorijam tiek veikta Ä«paÅ¡nieka maiņa un nepiecieÅ¡ams apstiprinÄjums no "%s"` -settings.transfer_succeed=Repozitorijs tika pÄrcelts. -settings.signing_settings=Parakstu pÄrbaudes iestatÄ«jumi -settings.trust_model=UzticēšanÄs modelis parakstiem +settings.transfer_perform=Veikt nodoÅ¡anu +settings.transfer_started=Å Ä« glabÄtava ir atzÄ«mÄ“ta nodoÅ¡anai un gaida apstiprinÄjumu no "%s" +settings.transfer_succeed=GlabÄtava tika nodota. +settings.signing_settings=Parakstu apliecinÄÅ¡anas iestatÄ«jumi +settings.trust_model=Parakstu uzticēšanÄs modelis settings.trust_model.default=NoklusÄ“juma uzticēšanÄs modelis -settings.trust_model.default.desc=Izmantot noklusÄ“to repozitoriju uzticÄ«bas modeli. -settings.trust_model.collaborator=LÄ«dzstrÄdnieka -settings.trust_model.collaborator.long=LÄ«dzstrÄdnieka: UzticÄ“ties lÄ«dzstrÄdnieku parakstiem -settings.trust_model.collaborator.desc=DerÄ«gi lÄ«dzstrÄdnieku paraksti tiks atzÄ«mÄ“ti kÄ "uzticami" (neatkarÄ«gi no tÄ vai tie atbilst revÄ«zijas iesÅ«tÄ«tÄjam vai nÄ“). Citos gadÄ«jumos derÄ«gi paraksti tiks atzÄ«mÄ“ti kÄ "neuzticami", ja paraksts atbilst revÄ«zijas iesÅ«tÄ«tÄjam vai "nesakrÄ«toÅ¡s", ja neatbilst. -settings.trust_model.committer=RevÄ«zijas iesÅ«tÄ«tÄja -settings.trust_model.committer.long=RevÄ«zijas iesÅ«tÄ«tÄja: UzticÄ“ties parakstiem, kas atbilst revÄ«zijas iesÅ«tÄ«tÄjiem (Å is atbilst GitHub uzvedÄ«bai un piespiedÄ«s Forgejo parakstÄ«tÄm revÄ«zijÄm norÄdÄ«t Forgejo kÄ revÄ«zijas iesÅ«tÄ«tÄju) -settings.trust_model.committer.desc=DerÄ«gi paraksti tiks atzÄ«mÄ“ti kÄ "uzticami", ja tie atbilst revÄ«zijas iesÅ«tÄ«tÄjam, citos gadÄ«jumos tie tiks atzÄ«mÄ“ti kÄ "nesakrÄ«toÅ¡i". Å is nozÄ«mÄ“, ka Forgejo bÅ«s kÄ revÄ«zijas iesÅ«tÄ«tÄjs parakstÄ«tÄm revÄ«zijÄm, kur Ä«stais revÄ«zijas iesÅ«tÄ«tÄjs tiks atÄ«zmÄ“ts revÄ«zijas komentÄra beigÄs ar tekstu Co-authored-by: un Co-committed-by:. NoklusÄ“tajai Forgejo atslÄ“gai ir jÄatbilst lietotÄjam datubÄzÄ“. -settings.trust_model.collaboratorcommitter=LÄ«dzstrÄdnieka un revÄ«zijas iesÅ«tÄ«tÄja -settings.trust_model.collaboratorcommitter.long=LÄ«dzstrÄdnieka un revÄ«zijas iesÅ«tÄ«tÄja: UzticÄ“ties lÄ«dzstrÄdnieku parakstiem, kas atbilst revÄ«zijas iesÅ«tÄ«tÄjam -settings.trust_model.collaboratorcommitter.desc=DerÄ«gi lÄ«dzstrÄdnieku paraksti tiks atzÄ«mÄ“ti kÄ "uzticami", ja tie atbilst revÄ«zijas iesÅ«tÄ«tÄjam, citos gadÄ«jumos tie tiks atzÄ«mÄ“ti kÄ "neuzticami", ja paraksts atbilst revÄ«zijas iesÅ«tÄ«tajam, vai "nesakrÄ«toÅ¡i", ja neatbilst. Å is nozÄ«mÄ“, ka Forgejo bÅ«s kÄ revÄ«zijas iesÅ«tÄ«tÄjs parakstÄ«tÄm revÄ«zijÄm, kur Ä«stais revÄ«zijas iesÅ«tÄ«tÄjs tiks atÄ«zmÄ“ts revÄ«zijas komentÄra beigÄs ar tekstu Co-Authored-By: un Co-Committed-By:. NoklusÄ“tajai Forgejo atslÄ“gai ir jÄatbilst lietotÄjam datubÄzÄ“. -settings.wiki_delete=DzÄ“st vikivietnes datus -settings.wiki_delete_desc=Vikivietnes repozitorija dzēšana ir neatgriezeniska un nav atsaucama. -settings.wiki_delete_notices_1=- Å Ä« darbÄ«ba dzÄ“sÄ«s un atspÄ“jos repozitorija %s vikivietni. -settings.confirm_wiki_delete=DzÄ“st vikivietnes datus -settings.wiki_deletion_success=Repozitorija vikivietnes dati tika izdzÄ“sti. -settings.delete=DzÄ“st Å¡o repozitoriju -settings.delete_desc=Repozitorija dzēšana ir neatgriezeniska un nav atsaucama. +settings.trust_model.default.desc=Izmantot noklusÄ“juma glabÄtavu uzticÄ«bas modeli. +settings.trust_model.collaborator=LÄ«dzdalÄ«bnieks +settings.trust_model.collaborator.long=LÄ«dzdalÄ«bnieks: uzticÄ“ties lÄ«dzdalÄ«bnieku parakstiem +settings.trust_model.collaborator.desc=DerÄ«gi šīs glabÄtavas lÄ«dzdalÄ«bnieku paraksti tiks atzÄ«mÄ“ti ar "uzticams" (neatkarÄ«gi no tÄ, vai tie atbilst iesÅ«tÄ«tÄjam vai nÄ“). PretÄ“jÄ gadÄ«jumÄ derÄ«gi paraksti tiks atzÄ«mÄ“ti ar "neuzticams", ja paraksts atbilst iesÅ«tÄ«tÄjam, un ar "neatbilstoÅ¡s", ja neatbilst. +settings.trust_model.committer=IesÅ«tÄ«tÄjs +settings.trust_model.committer.long=IesÅ«tÄ«tÄjs: uzticÄ“ties parakstiem, kas atbilst iesÅ«tÄ«tÄjiem (Å is atbilst GitHub un uzsspiedÄ«s Forgejo parakstÄ«tiem iesÅ«tÄ«jumiem norÄdÄ«t Forgejo kÄ iesÅ«tÄ«tÄju) +settings.trust_model.committer.desc=DerÄ«gi paraksti tiks atzÄ«mÄ“ti ar "uzticams" tikai tad, ja tie atbildÄ«s iesÅ«tÄ«tÄjam, pretÄ“jÄ gadÄ«jumÄ tie tiks atzÄ«mÄ“ti ar "neatbilstoÅ¡s". Tas nozÄ«mÄ“, ka Forgejo bÅ«s iesÅ«tÄ«tÄjs parakstÄ«tiem iesÅ«tÄ«jumiem, patieso iesÅ«tÄ«tÄju iesÅ«tÄ«jumÄ atzÄ«mÄ“jot ar Co-authored-by: un Co-committed-by: noslÄ“gumu. NoklusÄ“juma Forgejo atslÄ“gai ir jÄatbilst lietotÄjam datu bÄzÄ“. +settings.trust_model.collaboratorcommitter=LÄ«dzdalÄ«bnieks un iesÅ«tÄ«tÄjs +settings.trust_model.collaboratorcommitter.long=LÄ«dzdalÄ«bnieks un iesÅ«tÄ«tÄjs: uzticÄ“ties lÄ«dzdalÄ«bnieku, kas atbilst iesÅ«tÄ«tÄjam, parakstiem +settings.trust_model.collaboratorcommitter.desc=DerÄ«gi šīs glabÄtavas lÄ«dzdalÄ«bnieku paraksti tiks atzÄ«mÄ“ti ar "uzticams", ja tie atbildÄ«s iesÅ«tÄ«tÄjam. PretÄ“jÄ gadÄ«jumÄ derÄ«gi paraksti tiks atzÄ«mÄ“ti ar "neuzticams" un ar "neatbilstoÅ¡s", ja neatbilst. Tas nozÄ«mÄ“, ka Forgejo tiks atzÄ«mÄ“ts kÄ iesÅ«tÄ«tÄjs parakstÄ«tiem iesÅ«tÄ«jumiem, patieso iesÅ«tÄ«tÄju iesÅ«tÄ«jumÄ atzÄ«mÄ“jot ar Co-authored-by: un Co-committed-by: noslÄ“gumu. NoklusÄ“juma Forgejo atslÄ“gai ir jÄatbilst lietotÄjam datubÄzÄ“. +settings.wiki_delete=IzdzÄ“st vikivietnes datus +settings.wiki_delete_desc=GlabÄtavas vikivietnes datu izdzēšana ir neatgriezeniska un nav atsaucama. +settings.wiki_delete_notices_1=- Å Ä« darbÄ«ba neatgriezeniski izdzÄ“sÄ«s un atspÄ“jos glabÄtavas %s vikivietni. +settings.confirm_wiki_delete=IzdzÄ“st vikivietnes datus +settings.wiki_deletion_success=GlabÄtavas vikivietnes dati tika izdzÄ“sti. +settings.delete=IzdzÄ“st Å¡o glabÄtavu +settings.delete_desc=GlabÄtavas izdzēšana ir neatgriezeniska un nav atsaucama. settings.delete_notices_1=- Å Ä« darbÄ«ba ir NEATGRIEZENISKA. -settings.delete_notices_2=- Å Ä« darbÄ«ba neatgriezeniski izdzÄ“sÄ«s visu repozitorijÄ %s, tai skaitÄ problÄ“mas, komentÄrus, vikivietni un lÄ«dzstrÄdnieku piesaisti. -settings.delete_notices_fork_1=- Visi atdalÄ«tie repozitoriju pÄ“c dzēšanas kļūs neatkarÄ«gi. -settings.deletion_success=Repozitorijs tika izdzÄ“sts. -settings.update_settings_success=Repozitorija iestatÄ«jumi tika saglabÄti. -settings.update_settings_no_unit=Repozitorijam ir jÄbÅ«t piešķirtÄm vismaz kÄdÄm tiesÄ«bÄm. -settings.confirm_delete=DzÄ“st repozitoriju -settings.add_collaborator=Pievienot lÄ«dzstrÄdnieku -settings.add_collaborator_success=Jauns lÄ«dzstrÄdnieks tika pievienots. -settings.add_collaborator_inactive_user=Nevar pievienot neaktÄ«vu lietotÄju kÄ lÄ«dzstrÄdnieku. -settings.add_collaborator_owner=Nevar pievienot Ä«paÅ¡nieku kÄ lÄ«dzstrÄdnieku. -settings.add_collaborator_duplicate=LÄ«dzstrÄdnieks jau ir pievienots Å¡im repozitorijam. +settings.delete_notices_2=- Å Ä« darbÄ«ba neatgriezeniski izdzÄ“sÄ«s glabÄtavu %s, tostarp kodu, pieteikumus, piebildes, vikivietnes datus un lÄ«dzdalÄ«bnieku iestatÄ«jumus. +settings.delete_notices_fork_1=- PÄ“c izdzēšanas šīs glabÄtavas atzarojumi kļūs neatkarÄ«gi. +settings.deletion_success=GlabÄtava tika izdzÄ“sta. +settings.update_settings_success=GlabÄtavas iestatÄ«jumi tika atjauninÄti. +settings.update_settings_no_unit=GlabÄtavÄ bÅ«tu jÄbÅ«t atļautai vismaz kaut kÄdai mijiedarbÄ«bai. +settings.confirm_delete=IzdzÄ“st glabÄtavu +settings.add_collaborator=Pievienot lÄ«dzdalÄ«bnieku +settings.add_collaborator_success=LÄ«dzdalÄ«bnieks tika pievienots. +settings.add_collaborator_inactive_user=NeaktÄ«vu lietotÄju nevar pievienot kÄ lÄ«dzdalÄ«bnieku. +settings.add_collaborator_owner=ĪpaÅ¡nieku nevar pievienot kÄ lÄ«dzdalÄ«bnieku. +settings.add_collaborator_duplicate=LÄ«dzdalÄ«bnieks jau ir pievienots Å¡ai glabÄtavai. settings.delete_collaborator=Noņemt -settings.collaborator_deletion=Noņemt lÄ«dzstrÄdnieku -settings.collaborator_deletion_desc=Noņemot lÄ«dzstrÄdnieku, tam tiks liegta piekļuve Å¡im repozitorijam. Vai turpinÄt? -settings.remove_collaborator_success=LÄ«dzstrÄdnieks tika noņemts. +settings.collaborator_deletion=Noņemt lÄ«dzdalÄ«bnieku +settings.collaborator_deletion_desc=LÄ«dzdalÄ«bnieka noņemÅ¡ana atsauks tÄ piekļuvi Å¡ai glabÄtavai. TurpinÄt? +settings.remove_collaborator_success=LÄ«dzdalÄ«bnieks tika noņemts. settings.search_user_placeholder=MeklÄ“t lietotÄju… -settings.org_not_allowed_to_be_collaborator=OrganizÄcijas nevar tikt pievienotas kÄ lÄ«dzstrÄdnieki. -settings.change_team_access_not_allowed=IespÄ“ja mainÄ«t komandu piekļuvi repozitorijam ir organizÄcijas Ä«paÅ¡niekam -settings.team_not_in_organization=Komanda nav tajÄ paÅ¡Ä organizÄcijÄ kÄ repozitorijs +settings.org_not_allowed_to_be_collaborator=ApvienÄ«bas nevar tikt pievienotas kÄ lÄ«dzdalÄ«bnieki. +settings.change_team_access_not_allowed=Komandu piekļuves mainīšana glabÄtavai ir pieejama tikai apvienÄ«bas Ä«paÅ¡niekam +settings.team_not_in_organization=Komanda nav tajÄ paÅ¡Ä apvienÄ«bÄ kÄ glabÄtava settings.teams=Komandas settings.add_team=Pievienot komandu -settings.add_team_duplicate=Komandai jau ir piekļuve Å¡im repozitorijam -settings.add_team_success=Komandai tagad ir piekļuve Å¡im repozitorijam. +settings.add_team_duplicate=Komandai jau ir piekļuve glabÄtavai +settings.add_team_success=Komandai tagad ir piekļuve glabÄtavai. settings.search_team=MeklÄ“t komandu… -settings.change_team_permission_tip=Komandas tiesÄ«bas tiek uzstÄdÄ«tas komandas iestatÄ«jumu lapÄ un nevar tikt individuÄli mainÄ«tas katram repozitorijam atsevišķi -settings.delete_team_tip=Komandai ir piekļuve visiem repozitorijiem un tÄ nevar tikt noņemta individuÄli -settings.remove_team_success=Komandas piekļuve Å¡im repozitorijam ir noņemta. -settings.add_webhook=Pievienot tÄ«mekļa ÄÄ·i -settings.add_webhook.invalid_channel_name=TÄ«mekļa ÄÄ·a kanÄla nosaukums nevar bÅ«t tukÅ¡s vai saturÄ“t tikai # simbolu. -settings.hooks_desc=TÄ«mekļa ÄÄ·i ļauj paziņot ÄrÄ“jiem servisiem par noteiktiem notikumiem, kas notiek Forgejo. Kad iestÄsies kÄds notikums, katram ÄrÄ“jÄ servisa URL tiks nosÅ«tÄ«ts POST pieprasÄ«jums. Lai uzzinÄtu sÄ«kÄk skatieties tÄ«mekļa ÄÄ·u rokasgrÄmatÄ. -settings.webhook_deletion=Noņemt tÄ«mekļa ÄÄ·i -settings.webhook_deletion_desc=Noņemot tÄ«mekļa ÄÄ·i, tiks dzÄ“sti visi tÄ iestatÄ«jumi un piegÄdes vÄ“sture. Vai turpinÄt? -settings.webhook_deletion_success=TÄ«mekļa ÄÄ·is tika noņemts. -settings.webhook.test_delivery=Testa piegÄde -settings.webhook.test_delivery_desc=Veikt viltus push-notikuma piegÄdi, lai notestÄ“tu JÅ«su tÄ«mekļa ÄÄ·a iestatÄ«jumus. -settings.webhook.test_delivery_desc_disabled=Lai pÄrbaudÄ«tu Å¡o tÄ«mekļa ÄÄ·i ar neÄ«stu notikumu, tas ir jÄiespÄ“jo. +settings.change_team_permission_tip=Komandas atļauja ir iestatÄ«ta komandas iestatÄ«jumu lapÄ un nav mainÄma katrai glabÄtavai atsevišķi +settings.delete_team_tip=Komandai ir piekļuve visÄm glabÄtavÄm, un to nevar noņemt +settings.remove_team_success=Tika noņemta komandas piekļuve glabÄtavai. +settings.add_webhook=Pievienot tÄ«mekļa aizÄ·eri +settings.add_webhook.invalid_channel_name=TÄ«mekļa aizÄ·eres plÅ«smas nosaukums nevar bÅ«t tukÅ¡s vai saturÄ“t tikai rakstzÄ«mi #. +settings.hooks_desc=TÄ«mekļa aizÄ·eres automÄtiski sÅ«ta serverim HTTP POST pieprasÄ«jumus, kad iedarbojas noteikti Forgejo notikumi. VairÄk ir lasÄms tÄ«mekļa aizÄ·eru rokasgrÄmatÄ. +settings.webhook_deletion=Noņemt tÄ«mekļa aizÄ·eri +settings.webhook_deletion_desc=TÄ«mekļa aizÄ·eres noņemÅ¡ana izdzēš tÄs iestatÄ«jumus un piegÄdes vÄ“sturi. TurpinÄt? +settings.webhook_deletion_success=TÄ«mekļa aizÄ·ere tika noņemta. +settings.webhook.test_delivery=PÄrbaudÄ«t piegÄdi +settings.webhook.test_delivery_desc=PÄrbaudÄ«t Å¡o tÄ«mekļa aizÄ·eri ar neÄ«stu notikumu. +settings.webhook.test_delivery_desc_disabled=Lai pÄrbaudÄ«tu Å¡o tÄ«mekļa aizÄ·eri ar neÄ«stu notikumu, tÄ ir jÄiespÄ“jo. settings.webhook.request=PieprasÄ«jums settings.webhook.response=Atbilde settings.webhook.headers=Galvenes settings.webhook.payload=Saturs settings.webhook.body=Saturs -settings.webhook.replay.description=IzpildÄ«t atkÄrtoti Å¡o tÄ«mekļa ÄÄ·i. -settings.webhook.replay.description_disabled=Lai atkÄrtoti izpildÄ«tu Å¡o tÄ«mekļa ÄÄ·i, tas ir jÄiespÄ“jo. -settings.webhook.delivery.success=Notikums tika veiksmÄ«gi pievienots piegÄdes rindai. Var paiet vairÄkas sekundes lÄ«dz tas parÄdÄs piegÄdes vÄ“sturÄ“. -settings.githooks_desc=Git ÄÄ·us apstrÄdÄ pats Git. JÅ«s varat labot atbalstÄ«to Äku failus sarakstÄ zemÄk, lai veiktu pielÄgotas darbÄ«bas. -settings.githook_edit_desc=Ja ÄÄ·is nav aktÄ«vs, tiks attÄ“lots piemÄ“rs kÄ to izmantot. AtstÄjot ÄÄ·a saturu tukÅ¡u, tas tiks atspÄ“jots. -settings.githook_name=Āķa nosaukums -settings.githook_content=Āķa saturs -settings.update_githook=Labot ÄÄ·i -settings.add_webhook_desc=Uz norÄdÄ«to URL tiks nosÅ«tÄ«ts POST pieprasÄ«jums ar notikuma datiem. DetalizÄ“tÄku informÄciju ir iespÄ“jams uzzinÄt tÄ«mekļa ÄÄ·u rokasgrÄmatÄ. +settings.webhook.replay.description=AtkÄrtoti izpildÄ«t Å¡o tÄ«mekļa aizÄ·eri. +settings.webhook.replay.description_disabled=Lai atkÄrtoti izpildÄ«tu Å¡o tÄ«mekļa aizÄ·eri, tÄ ir jÄiespÄ“jo. +settings.webhook.delivery.success=Notikums tika sekmÄ«gi pievienots piegÄdes rindsarakstam. Var paiet vairÄkas sekundes, lÄ«dz tas parÄdÄs piegÄdes vÄ“sturÄ“. +settings.githooks_desc=Git aizÄ·eres apstrÄdÄ pats Git. ZemÄk var labot aizÄ·eru datnes, lai uzstÄdÄ«tu pielÄgotas darbÄ«bas. +settings.githook_edit_desc=Ja aizÄ·ere ir bezdarbÄ«ga, tiks parÄdÄ«ts piemÄ“ra saturs. Satura atstÄÅ¡ana bez vÄ“rtÄ«bas atspÄ“jos Å¡o aizÄ·eri. +settings.githook_name=AizÄ·eres nosaukums +settings.githook_content=AizÄ·eres saturs +settings.update_githook=AtjauninÄt aizÄ·eri +settings.add_webhook_desc=Forgejo uz mÄ“rÄ·a URL nosÅ«tÄ«s POST pieprasÄ«jumus ar noteiktu satura veidu. VairÄk ir lasÄmstÄ«mekļa aizÄ·eru rokasgrÄmatÄ. settings.payload_url=SaņēmÄ“ja URL settings.http_method=HTTP metode -settings.content_type=POST satura tips +settings.content_type=POST satura veids settings.secret=NoslÄ“pums settings.slack_username=LietotÄjvÄrds settings.slack_icon_url=Ikonas URL settings.slack_color=KrÄsa settings.discord_username=LietotÄjvÄrds settings.discord_icon_url=Ikonas URL -settings.event_desc=Izsaukt notikumiem: -settings.event_push_only=Izmaiņu nosÅ«tīšanas notikumi -settings.event_send_everything=Visus notikumus -settings.event_choose=IzvÄ“lÄ“ties notikumus… -settings.event_header_repository=Repozitorija notikumi +settings.event_desc=Iedarboties uz: +settings.event_push_only=AizgÄdÄÅ¡anas notikumi +settings.event_send_everything=Visiem notikumiem +settings.event_choose=PielÄgoti notikumi… +settings.event_header_repository=GlabÄtavas notikumi settings.event_create=Izveidot -settings.event_create_desc=Atzara vai taga izveidoÅ¡ana. -settings.event_delete=DzÄ“st -settings.event_delete_desc=Atzars vai tags izdzÄ“sts. -settings.event_fork=AtdalÄ«ts -settings.event_fork_desc=Repozitorijs atdalÄ«ts. +settings.event_create_desc=Zars vai birka izveidota. +settings.event_delete=IzdzÄ“st +settings.event_delete_desc=Zars vai birka izdzÄ“sta. +settings.event_fork=Izveidot atzarojumu +settings.event_fork_desc=Izveidots glabÄtavas atzarojums. settings.event_wiki=Vikivietni settings.event_wiki_desc=Vikivietnes lapa izveidota, pÄrsaukta, labota vai dzÄ“sta. settings.event_release=Laidiens -settings.event_release_desc=PublicÄ“ts, atjaunots vai dzÄ“sts laidiens repozitorijÄ. -settings.event_push=Izmaiņu nosÅ«tīšana -settings.event_push_desc=Git izmaiņu nosÅ«tīšana uz repozitoriju. -settings.event_repository=Repozitorijs -settings.event_repository_desc=Repozitorijs izveidots vai dzÄ“sts. -settings.event_header_issue=ProblÄ“mu notikumi -settings.event_issues=ProblÄ“mas -settings.event_issues_desc=ProblÄ“ma atvÄ“rta, aizvÄ“rta, atkÄrtoti atvÄ“rta vai mainÄ«ta. -settings.event_issue_assign=ProblÄ“mas atbildÄ«gie -settings.event_issue_assign_desc=ProblÄ“mai piešķirti vai noņemti atbildÄ«gie. -settings.event_issue_label=ProblÄ“mu etiÄ·etes -settings.event_issue_label_desc=ProblÄ“mai pievienotas vai noņemtas etiÄ·etes. -settings.event_issue_milestone=ProblÄ“mas atskaites punkts -settings.event_issue_milestone_desc=ProblÄ“mai pievienots vai noņemts atskaites punkts. -settings.event_issue_comment=ProblÄ“mas komentÄrs -settings.event_issue_comment_desc=ProblÄ“mas komentÄrs pievienots, labots vai dzÄ“sts. +settings.event_release_desc=Laists klajÄ, atjauninÄts vai izdzÄ“sts laidiens glabÄtavÄ. +settings.event_push=AizgÄdÄÅ¡ana +settings.event_push_desc=Git aizgÄdÄÅ¡ana uz glabÄtavu. +settings.event_repository=GlabÄtava +settings.event_repository_desc=Izveidota vai izdzÄ“sta glabÄtava. +settings.event_header_issue=Pieteikumu notikumi +settings.event_issues=Izmaiņas +settings.event_issues_desc=Pieteikums atvÄ“rts, aizvÄ“rts, atkÄrtoti atvÄ“rts vai labots. +settings.event_issue_assign=Piešķīrums +settings.event_issue_assign_desc=Pieteikumam ir norÄdÄ«ts vai noņemts atbildÄ«gais. +settings.event_issue_label=IezÄ«mes +settings.event_issue_label_desc=Pievienotas vai noņemtas pieteikuma iezÄ«mes. +settings.event_issue_milestone=Atskaites punkti +settings.event_issue_milestone_desc=Pievienots, noņemts vai izmainÄ«ts atskaites punkts. +settings.event_issue_comment=Piebildes +settings.event_issue_comment_desc=Izveidota, labota vai izdzÄ“sta pieteikuma piebilde. settings.event_header_pull_request=Izmaiņu pieprasÄ«juma notikumi -settings.event_pull_request=Izmaiņu pieprasÄ«jums +settings.event_pull_request=Izmaiņas settings.event_pull_request_desc=Izmaiņu pieprasÄ«jums atvÄ“rts, aizvÄ“rts, atkÄrtoti atvÄ“rts vai mainÄ«ts. -settings.event_pull_request_assign=Izmaiņu pieprasÄ«juma atbildÄ«gie +settings.event_pull_request_assign=Piešķīrums settings.event_pull_request_assign_desc=Izmaiņu pieprasÄ«jumam piešķirti vai noņemti atbildÄ«gie. -settings.event_pull_request_label=Izmaiņu pieprasÄ«juma etiÄ·etes -settings.event_pull_request_label_desc=Izmaiņu pieprasÄ«jumam pievienotas vai noņemtas etiÄ·etes. -settings.event_pull_request_milestone=Izmaiņu pieprasÄ«juma atskaites punkts -settings.event_pull_request_milestone_desc=Izmaiņu pieprasÄ«jumam pievienots vai noņemts atskaites punkts. -settings.event_pull_request_comment=Izmaiņu pieprasÄ«juma komentÄrs -settings.event_pull_request_comment_desc=Izmaiņu pieprasÄ«juma komentÄrs pievienots, labots vai dzÄ“sts. -settings.event_pull_request_review=Izmaiņu pieprasÄ«jums recenzÄ“ts -settings.event_pull_request_review_desc=Izmaiņu pieprasÄ«jums apstiprinÄts, noraidÄ«ts vai atstÄts komentÄrs. -settings.event_pull_request_sync=Izmaiņu pieprasÄ«jums sinhronizÄ“ts -settings.event_pull_request_sync_desc=Izmaiņu pieprasÄ«jums sinhronizÄ“ts. -settings.event_pull_request_review_request=Izmaiņu pieprasÄ«juma recenzÄ«ju pieprasīšana -settings.event_pull_request_review_request_desc=Izmaiņu pieprasÄ«juma recenzÄ«jas pieprasÄ«jums vai recenzijas pieprasÄ«juma atcelÅ¡ana. -settings.event_pull_request_approvals=Izmaiņu pieprasÄ«juma apstiprinÄÅ¡ana -settings.event_pull_request_merge=Izmaiņu pieprasÄ«juma sapludinÄÅ¡ana +settings.event_pull_request_label=IezÄ«mes +settings.event_pull_request_label_desc=Izmaiņu pieprasÄ«juma iezÄ«mes tika pievienotas vai noņemtas. +settings.event_pull_request_milestone=Atskaites punkti +settings.event_pull_request_milestone_desc=Atskaites punkts pievienots, noņemts vai mainÄ«ts. +settings.event_pull_request_comment=Piebildes +settings.event_pull_request_comment_desc=Izmaiņu pieprasÄ«juma piebilde izveidota, labota vai izdzÄ“sta. +settings.event_pull_request_review=Izskatīšanas +settings.event_pull_request_review_desc=Izmaiņu pieprasÄ«jums apstiprinÄts, noraidÄ«ts vai pievienota izskatīšanas piebilde. +settings.event_pull_request_sync=SinhronizÄ“ts +settings.event_pull_request_sync_desc=Zars automÄtiski atjauninÄts ar mÄ“rÄ·a zaru. +settings.event_pull_request_review_request=Izskatīšanas pieprasÄ«jumi +settings.event_pull_request_review_request_desc=PieprasÄ«ta izmaiņu pieprasÄ«juma izskatīšana vai noņemts izskatīšanas pieprasÄ«jums. +settings.event_pull_request_approvals=Izmaiņu pieprasÄ«juma apstiprinÄjumi +settings.event_pull_request_merge=Izmaiņu pieprasÄ«juma iekļauÅ¡ana settings.event_package=Pakotne -settings.event_package_desc=RepozitorijÄ izveidota vai dzÄ“sta pakotne. -settings.branch_filter=Atzaru filtrs -settings.branch_filter_desc=Atzaru ierobežojumi izmaiņu iesÅ«tīšanas, zaru izveidoÅ¡anas vai dzēšanas notikumiem, izmantojot, glob Å¡ablonu. Ja norÄdÄ«ts tukÅ¡s vai *, tiks nosÅ«tÄ«ti notikumi no visiem zariem. Skatieties %[2]s pieraksta dokumentÄciju. PiemÄ“rs: master, {master,release*}. -settings.authorization_header=AutorizÄcijas galvene -settings.authorization_header_desc=Tiks iekļauta kÄ autorizÄcijas galvenei pieprasÄ«jumiem, ja ir norÄdÄ«ta. PiemÄ“ram: %s. +settings.event_package_desc=Izveidota vai izdzÄ“sta pakotne glabÄtavÄ. +settings.branch_filter=Zaru atlase +settings.branch_filter_desc=Zaru baltais saraksts aizgÄdÄÅ¡anas, zaru izveidoÅ¡anas un izdzēšanas notikumiem, kas ir norÄdÄ«ts kÄ glob paraugs. Ja tukÅ¡s vai *, tiks nosÅ«tÄ«ti visu zaru notikumi. Par pierakstu skatÄ«t%[2]s dokumentÄcijÄ. PiemÄ“ri: main, {main,release*}. +settings.authorization_header=PilnvaroÅ¡anas galvene +settings.authorization_header_desc=Tiks iekļauta pieprasÄ«jumos kÄ pilnvaroÅ¡anas galvene, ja ir norÄdÄ«ta. PiemÄ“ram: %s. settings.active=AktÄ«vs -settings.active_helper=InformÄcija par notikumiem tiks nosÅ«tÄ«ta uz Å¡o tÄ«mekļa ÄÄ·a URL. -settings.add_hook_success=TÄ«mekļa ÄÄ·is tika pievienots. -settings.update_webhook=MainÄ«t tÄ«mekļa ÄÄ·i -settings.update_hook_success=TÄ«mekļa ÄÄ·is tika atjaunots. -settings.delete_webhook=Noņemt tÄ«mekļa ÄÄ·i -settings.recent_deliveries=PÄ“dÄ“jÄs piegÄdes -settings.hook_type=Āķa veids +settings.active_helper=InformÄcija par iedarbinÄtajiem notikumiem tiks nosÅ«tÄ«ta uz Å¡o tÄ«mekļa aizÄ·eres URL. +settings.add_hook_success=TÄ«mekļa aizÄ·ere tika pievienota. +settings.update_webhook=AtjauninÄt tÄ«mekļa aizÄ·eri +settings.update_hook_success=TÄ«mekļa aizÄ·ere tika atjauninÄta. +settings.delete_webhook=Noņemt tÄ«mekļa aizÄ·eri +settings.recent_deliveries=Nesenas piegÄdes +settings.hook_type=AizÄ·eres veids settings.slack_token=Pilnvara settings.slack_domain=DomÄ“ns settings.slack_channel=KanÄls -settings.add_web_hook_desc=IntegrÄ“t %s repozitorijÄ. +settings.add_web_hook_desc=Iekļaut %s savÄ glabÄtavÄ. settings.web_hook_name_gitea=Gitea settings.web_hook_name_forgejo = Forgejo settings.web_hook_name_gogs=Gogs @@ -2252,7 +2419,7 @@ settings.web_hook_name_dingtalk=DingTalk settings.web_hook_name_telegram=Telegram settings.web_hook_name_matrix=Matrix settings.web_hook_name_msteams=Microsoft Teams -settings.web_hook_name_feishu=Feishu / Lark Suite +settings.web_hook_name_feishu=Feishu/Lark Suite settings.web_hook_name_feishu_only =Feishu settings.web_hook_name_larksuite_only =Lark Suite settings.web_hook_name_wechatwork=WeCom (Wechat Work) @@ -2260,470 +2427,650 @@ settings.web_hook_name_packagist=Packagist settings.packagist_username=Packagist lietotÄjvÄrds settings.packagist_api_token=API pilnvara settings.packagist_package_url=Packagist pakotnes URL -settings.deploy_keys=Izvietot atslÄ“gas +settings.deploy_keys=IzvietoÅ¡anas atslÄ“gas settings.add_deploy_key=Pievienot izvietoÅ¡anas atslÄ“gu -settings.deploy_key_desc=IzvietoÅ¡anas atslÄ“gÄm ir lasīšanas piekļuve repozitorijam. +settings.deploy_key_desc=IzvietoÅ¡anas atslÄ“gÄm ir lasīšanas piekļuve glabÄtavai. settings.is_writable=IespÄ“jot rakstīšanas piekļuvi -settings.is_writable_info=Atļaut Å¡ai izvietoÅ¡anas atslÄ“gai nosÅ«tÄ«t izmaiņas uz repozitoriju. +settings.is_writable_info=Atļaut Å¡ai izvietoÅ¡anas atslÄ“gai aizgÄdÄt uz glabÄtavu. settings.no_deploy_keys=PagaidÄm nav nevienas izvietoÅ¡anas atslÄ“gas. settings.title=Virsraksts settings.deploy_key_content=Saturs settings.key_been_used=IzvietoÅ¡anas atslÄ“ga ar Å¡Ädu saturu jau ir pievienota. -settings.key_name_used=IzvietoÅ¡anas atslÄ“ga ar Å¡Ädu nosaukumu jau eksistÄ“. +settings.key_name_used=Jau pastÄv izvietoÅ¡anas atslÄ“ga ar tÄdu paÅ¡u nosaukumu. settings.add_key_success=IzvietoÅ¡anas atslÄ“ga "%s" tika pievienota. settings.deploy_key_deletion=Noņemt izvietoÅ¡anas atslÄ“gu -settings.deploy_key_deletion_desc=Noņemot izvietoÅ¡anas atslÄ“gu, tai tiks liegta piekļuve Å¡im repozitorija. Vai turpinÄt? +settings.deploy_key_deletion_desc=IzvietoÅ¡anas atslÄ“gas noņemÅ¡ana atsauks tÄs piekļuvi Å¡ai glabÄtavai. TurpinÄt? settings.deploy_key_deletion_success=IzvietoÅ¡anas atslÄ“ga tika noņemta. -settings.branches=Atzari -settings.protected_branch=Atzaru aizsargÄÅ¡ana -settings.protected_branch.save_rule=SaglabÄt noteikumu -settings.protected_branch.delete_rule=DzÄ“st noteikumu +settings.branches=Zari +settings.protected_branch=Zaru aizsargÄÅ¡ana +settings.protected_branch.save_rule=SaglabÄt kÄrtulu +settings.protected_branch.delete_rule=IzdzÄ“st kÄrtulu settings.protected_branch_can_push=Atļaut izmaiņu nosÅ«tīšanu? settings.protected_branch_can_push_yes=JÅ«s varat nosÅ«tÄ«t izmaiņas settings.protected_branch_can_push_no=JÅ«s nevarat nosÅ«tÄ«t izmaiņas -settings.branch_protection=Atzara aizsardzÄ«ba atzaram '%s' +settings.branch_protection=Zara "%s" aizsargÄÅ¡anas kÄrtulas settings.protect_this_branch=IespÄ“jot atzara aizsardzÄ«bu settings.protect_this_branch_desc=Neļauj atzara dzēšanu, kÄ arÄ« ierobežo izmaiņu iesÅ«tīšanu un sapludinÄÅ¡anu Å¡ajÄ atzarÄ. -settings.protect_disable_push=Neļaut iesÅ«tÄ«t izmaiņas -settings.protect_disable_push_desc=Izmaiņu iesÅ«tīšana Å¡ajÄ atzarÄ netiks atļauta. -settings.protect_enable_push=Atļaut iesÅ«tÄ«t izmaiņas -settings.protect_enable_push_desc=Ikviens, kam ir rakstīšanas tiesÄ«bas uz Å¡o repozitoriju, varÄ“s iesÅ«tÄ«t izmaiņas Å¡ajÄ atzarÄ (piespiedu izmaiņu iesÅ«tīšanas netiks atļauta). -settings.protect_enable_merge=IespÄ“jot sapludinÄÅ¡anu -settings.protect_enable_merge_desc=Ikviens ar rakstīšanas tiesÄ«bÄm varÄ“st sapludinÄt izmaiņu pieprasÄ«jumus Å¡ajÄ atzarÄ. -settings.protect_whitelist_committers=Atļaut iesÅ«tÄ«t izmaiņas norÄdÄ«tajiem lietotÄjiem vai komandÄm -settings.protect_whitelist_committers_desc=Tikai norÄdÄ«tiem lietotÄji vai komandas varÄ“s iesÅ«tÄ«t izmaiņas Å¡ajÄ atzarÄ (piespiedu izmaiņu iesÅ«tīšanas netiks atļauta). -settings.protect_whitelist_deploy_keys=Atļaut izvietoÅ¡anas atslÄ“gÄm ar rakstīšanas tiesÄ«bÄm nosÅ«tÄ«t izmaiņas. -settings.protect_whitelist_users=LietotÄji, kas var veikt izmaiņu nosÅ«tīšanu: +settings.protect_disable_push=AtspÄ“jot aizgÄdÄÅ¡anu +settings.protect_disable_push_desc=AizgÄdÄÅ¡ana Å¡ajÄ zarÄ netiks ļauta. +settings.protect_enable_push=IespÄ“jot aizgÄdÄÅ¡anu +settings.protect_enable_push_desc=Ikvienam ar rakstīšanas piekļuvi bÅ«s ļauts aizgÄdÄt izmaiņas uz Å¡o zaru (bet ne uzspiesta aizgÄdÄÅ¡ana). +settings.protect_enable_merge=IespÄ“jot apvienoÅ¡anu +settings.protect_enable_merge_desc=Ikvienam ar rakstīšanas tiesÄ«bÄm bÅ«s ļauts apvienot izmaiņu pieprasÄ«jumus ar Å¡o zaru. +settings.protect_whitelist_committers=Ierobežotas aizgÄdÄÅ¡anas izņēmumi +settings.protect_whitelist_committers_desc=Tikai norÄdÄ«tajiem lietotÄjiem vai komandÄm bÅ«s ļauts aizgÄdÄt izmaiņas Å¡ajÄ zarÄ (bet ne uzspiesta aizgÄdÄÅ¡ana). +settings.protect_whitelist_deploy_keys=Atļaut izvietoÅ¡anas atslÄ“gÄm ar rakstīšanas piekļuvi aizgÄdÄt izmaiņas. +settings.protect_whitelist_users=LietotÄji, kuriem ir ļauts aizgÄdÄt izmaiņas settings.protect_whitelist_search_users=MeklÄ“t lietotÄjus… -settings.protect_whitelist_teams=Komandas, kas var veikt izmaiņu nosÅ«tīšanu: +settings.protect_whitelist_teams=Komandas, kurÄm ir ļauts aizgÄdÄt izmaiņas settings.protect_whitelist_search_teams=MeklÄ“t komandas… -settings.protect_merge_whitelist_committers=IespÄ“jot sapludinÄÅ¡anas ierobežoÅ¡anu -settings.protect_merge_whitelist_committers_desc=Atļaut tikai noteiktiem lietotÄjiem vai komandÄm sapludinÄt izmaiņu pieprasÄ«jumus Å¡ajÄ atzarÄ. -settings.protect_merge_whitelist_users=LietotÄji, kas var veikt izmaiņu sapludinÄÅ¡anu: -settings.protect_merge_whitelist_teams=Komandas, kas var veikt izmaiņu sapludinÄÅ¡anu: -settings.protect_check_status_contexts=IespÄ“jot statusu pÄrbaudi -settings.protect_status_check_patterns=Statusa pÄrbaudes Å¡abloni: -settings.protect_status_check_patterns_desc=NorÄdiet Å¡ablonus, kurÄm statusa pÄrbaudÄ“m ir jÄatbilst pirms atzaru iespÄ“jams sapludinÄt Å¡ajÄ atzarÄ, kas atbilst Å¡im nosacÄ«jumam. Katru Å¡ablonu norÄdÄ«t savÄ rindÄ, tie nevar bÅ«t tukÅ¡i. -settings.protect_check_status_contexts_desc=NepiecieÅ¡amas veiksmÄ«gas statusa pÄrbaudes pirms sapludinÄÅ¡anas. IzvÄ“lieties, kurÄm statusa pÄrbaudÄ“m ir jÄizpildÄs pirms ir iespejams tÄs sapludinÄt. Ja iespÄ“jots, tad revÄ«zijas sÄkotnÄ“ji jÄnosÅ«ta uz atsevišķu atzaru, pÄ“c kÄ var tikt saplusinÄtas vai tieÅ¡i nosÅ«tÄ«tas uz atzariem, kas atbildst veiksmÄ«gÄm norÄdÄ«tajÄm stautsa pÄrbaudÄ“m. Ja konteksts nav norÄdÄ«ts, pÄ“dÄ“jai revÄ«zijai ir jÄbÅ«t veiksmÄ«ga neatkarÄ«gi no konteksta. -settings.protect_check_status_contexts_list=Statusu pÄrbaudes, kas Å¡im repozitorijam bijuÅ¡as pÄ“dÄ“jÄs nedēļas laikÄ +settings.protect_merge_whitelist_committers=IespÄ“jot apvienoÅ¡anas atļauÅ¡anas sarakstu +settings.protect_merge_whitelist_committers_desc=Atļaut tikai noteiktiem lietotÄjiem vai komandÄm apvienot izmaiņu pieprasÄ«jumus ar Å¡o zaru. +settings.protect_merge_whitelist_users=LietotÄji, kuri var veikt apvienoÅ¡anu +settings.protect_merge_whitelist_teams=Komandas, kuras var veikt apvienoÅ¡anu +settings.protect_check_status_contexts=IespÄ“jot stÄvokļa pÄrbaudi +settings.protect_status_check_patterns=StÄvokļa pÄrbaužu paraugi +settings.protect_status_check_patterns_desc=JÄievada paraugi, lai norÄdÄ«tu, kurÄm stÄvokļa pÄrbaudÄ“m sekmÄ«gi jÄizpildÄs, pirms zari var tikt iekļauti zarÄ, kas atbilst Å¡ai kÄrtulai. KatrÄ rindÄ ir norÄdÄms viens paraugs. Paraugi nevar bÅ«t tukÅ¡i. +settings.protect_check_status_contexts_desc=Pirms apvienoÅ¡anas ir nepiecieÅ¡ama sekmÄ«ga stÄvokļa pÄrbaužu izpilde. Kad iespÄ“jots, iesÅ«tÄ«jumiem vispirms jÄbÅ«t aizgÄdÄtiem citÄ zarÄ, tad pÄ“c stÄvokļa pÄrbaužu sekmÄ«gas izpildes iekļautiem vai aizgÄdÄtiem tieÅ¡i zarÄ, kas atbilst Å¡ai kÄrtulai. Ja nav atbilstoÅ¡u kontekstu, pÄ“dÄ“jam iesÅ«tÄ«jumam jÄbÅ«t sekmÄ«gam neatkarÄ«gi no konteksta. +settings.protect_check_status_contexts_list=StÄvokļa pÄrbaudes, kas Å¡ajÄ glabÄtavÄ atrastas pÄ“dÄ“jÄs nedēļas laikÄ settings.protect_status_check_matched=Atbilst -settings.protect_invalid_status_check_pattern=Kļūdains statusa pÄrbaudes Å¡ablons: "%s". -settings.protect_no_valid_status_check_patterns=Nav korekta statusa pÄrbaudes Å¡ablona. -settings.protect_required_approvals=VajadzÄ«gi apstiprinÄjumi: -settings.protect_required_approvals_desc=Atļaut sapludinÄt izmaiņu pieprasÄ«jumu tikai ar pietiekamu skaitu pozitÄ«vu recenziju. +settings.protect_invalid_status_check_pattern=NederÄ«gs stÄvokļa pÄrbaudes paraugs: "%s". +settings.protect_no_valid_status_check_patterns=Nav derÄ«gu stÄvokļa pÄrbaužu paraugu. +settings.protect_required_approvals=NepiecieÅ¡amie apstiprinÄjumi +settings.protect_required_approvals_desc=Atļaut iekļaut izmaiņu pieprasÄ«jumu tikai ar pietiekamu daudzumu apstiprinoÅ¡u izskatīšanu. settings.protect_approvals_whitelist_enabled=Ierobežot apstiprinÄjumus norÄdÄ«tajiem lietotÄjiem vai komandÄm -settings.protect_approvals_whitelist_enabled_desc=Tikai recenzijas no Å¡iem lietotÄjiem vai komandÄm tiks skaitÄ«tas, lai pÄrbaudÄ«tu nepiecieÅ¡amo apstiprinÄjumu skaitu. Bez šīs pazÄ«mes, recenzijas no ikviena lietotÄja, kam ir rakstīšanas piekļuve, tiks skaitÄ«tas, lai pÄrbaudÄ«tu nepiecieÅ¡amo apstiprinÄjumu skaitu. -settings.protect_approvals_whitelist_users=LietotÄji, kas var veikt recenzijas: -settings.protect_approvals_whitelist_teams=Komandas, kas var veikt recenzijas: -settings.dismiss_stale_approvals=PieprasÄ«t apstiprinÄjumus jaunÄkajÄm izmaiņÄm -settings.dismiss_stale_approvals_desc=Kad tiek iesÅ«tÄ«tas jaunas revÄ«zijas, kas izmaina izmaiņu pieprasÄ«juma saturu, iepriekšējie apstiprinÄjumi tiks atzÄ«mÄ“ti kÄ novecojuÅ¡i un bÅ«s nepiecieÅ¡ams apstiprinÄt tos atkÄroti. -settings.require_signed_commits=PieprasÄ«t parakstÄ«tas revÄ«zijas -settings.require_signed_commits_desc=NoraidÄ«t iesÅ«tÄ«tÄs izmaiņas Å¡im atzaram, ja tÄs nav parakstÄ«tas vai nav iespÄ“jams pÄrbaudÄ«t. -settings.protect_branch_name_pattern=AizsargÄtÄ zara Å¡ablons -settings.protect_branch_name_pattern_desc=AizsargÄto atzaru nosaukumu Å¡abloni. Å ablonu pierakstu skatÄ«t dokumentÄcijÄ. PiemÄ“ri: main, release/** -settings.protect_patterns=Å abloni -settings.protect_protected_file_patterns=AizsargÄto failu Å¡ablons (vairÄkus var norÄdÄ«t atdalot ar semikolu ';'): -settings.protect_protected_file_patterns_desc=AizsargÄtie faili, ko nevar mainÄ«t, pat ja lietotÄjam ir tiesÄ«bas veidot jaunus, labot vai dzÄ“st failus Å¡ajÄ atzarÄ. VairÄkus Å¡ablons ir iespÄ“jams norÄdÄ«t atdalot tos ar semikolu (';'). SÄ«kÄka informÄcija par Å¡abloniem pieejama github.com/gobwas/glob dokumentÄcijÄ. PiemÄ“ram, .drone.yml, /docs/**/*.txt. -settings.protect_unprotected_file_patterns=NeaizsargÄto failu Å¡ablons (vairÄkus var norÄdÄ«t atdalot ar semikolu ';'): -settings.protect_unprotected_file_patterns_desc=NeaizsargÄtie faili, ko iespÄ“jams mainÄ«t apejot iesÅ«tīšanas ierobežojumus, ja lietotÄjam ir tiesÄ«bas iesÅ«tÄ«t izmaiņas Å¡ajÄ atzarÄ. VairÄkus Å¡ablons ir iespÄ“jams norÄdÄ«t atdalot tos ar semikolu (';'). SÄ«kÄka informÄcija par Å¡abloniem pieejama %[2]s dokumentÄcijÄ. PiemÄ“ram, .drone.yml, /docs/**/*.txt. +settings.protect_approvals_whitelist_enabled_desc=Tikai iepriekÅ¡norÄdÄ«tiem lietotÄju vai komandu izskatīšanas tiks ieskaitÄ«tas nepiecieÅ¡amo apstiprinÄjumu skaitÄ. Bez iepriekÅ¡norÄdÄ«ta apstiprinÄjumu izskatÄ«tÄju saraksta izskatīšanas no ikviena, kam ir rakstīšanas piekļuve, tiks ieskaitÄ«tas nepiecieÅ¡amo apstiprinÄjumu skaitÄ. +settings.protect_approvals_whitelist_users=LietotÄji, kas var veikt izskatīšanu +settings.protect_approvals_whitelist_teams=Komandas, kas var veikt izskatīšanu +settings.dismiss_stale_approvals=Atmest novecojuÅ¡us apstiprinÄjumus +settings.dismiss_stale_approvals_desc=Kad zarÄ tiek aizgÄdÄti jauni iesÅ«tÄ«jumi, kas izmaina izmaiņu pieprasÄ«juma saturu, iepriekšējie apstiprinÄjumi tiks atcelti. +settings.require_signed_commits=PieprasÄ«t parakstÄ«tus iesÅ«tÄ«jumus +settings.require_signed_commits_desc=NoraidÄ«t aizgÄdÄÅ¡anu uz Å¡o zaru, ja iesÅ«tÄ«jumi nav parakstÄ«ti vai apliecinÄmi. +settings.protect_branch_name_pattern=AizsargÄtÄ zara nosaukuma paraugs +settings.protect_branch_name_pattern_desc=AizsargÄto zaru nosaukumu paraugi. Paraugu pierakstu skatÄ«t dokumentÄcijÄ. PiemÄ“ri: main, release/** +settings.protect_patterns=Paraugi +settings.protect_protected_file_patterns=AizsargÄto datņu paraugs (vairÄkus atdala ar semikolu ";") +settings.protect_protected_file_patterns_desc=AizsargÄtÄs datnes nav ļauts tieÅ¡Ä veidÄ mainÄ«t, pat ja lietotÄjam Å¡ajÄ zarÄ ir tiesÄ«bas pievienot, labot vai izdzÄ“st datnes. VairÄkus paraugus var atdalÄ«t ar semikolu (";"). Paraugu pieraksts ir skatÄms %[2]s dokumentÄcijÄ. PiemÄ“ri: .drone.yml, /docs/**/*.txt. +settings.protect_unprotected_file_patterns=NeaizsargÄto datņu paraugs (vairÄkus atdala ar semikolu ";") +settings.protect_unprotected_file_patterns_desc=NeaizsargÄtÄs datnes, kuras ir ļauts izmainÄ«t tieÅ¡Ä veidÄ, apejot aizgÄdÄÅ¡anas ierobežojumu, ja lietotÄjam ir rakstīšanas piekļuve. VairÄki paraugi ir atdalÄmi ar semikolu (";"). Paraugu pierakstu skatÄ«t %[2]s dokumentÄcijÄ. PiemÄ“ri: .drone.yml, /docs/**/*.txt. settings.add_protected_branch=IespÄ“jot aizsargÄÅ¡anu settings.delete_protected_branch=AtspÄ“jot aizsargÄÅ¡anu -settings.update_protect_branch_success=Atzara aizsardzÄ«bas nosacÄ«jums "%s" tika saglabÄta. -settings.remove_protected_branch_success=Atzara aizsardzÄ«bas nosacÄ«jums "%s" tika noņemts. -settings.remove_protected_branch_failed=NeizdevÄs izdzÄ“st atzara aizsardzÄ«bas nosacÄ«jumu "%s". -settings.protected_branch_deletion=AtspÄ“jot atzara aizsardzÄ«bu -settings.protected_branch_deletion_desc=AtspÄ“jojot atzara aizsardzÄ«bu, ļaus lietotÄjiem ar rakstīšanas tiesÄ«bÄm nosÅ«tÄ«t izmaiņas uz atzaru. Vai turpinÄt? -settings.block_rejected_reviews=Neļaut sapludinÄt izmaiņu pieprasÄ«jumus, kam ir pieprasÄ«tas izmaiņas -settings.block_rejected_reviews_desc=SapludinÄÅ¡ana nebÅ«s iespÄ“jama, kad ir pieprasÄ«tas izmaiņas, pat ja ir nepiecieÅ¡amais apstiprinÄjumu skaits. -settings.block_on_official_review_requests=BloÄ·Ä“t sapludinÄÅ¡anu, ja ir oficiÄlas recenzijas pieprasÄ«tÄs izmaiņas -settings.block_on_official_review_requests_desc=SapludinÄÅ¡ana nebÅ«s iespÄ“jama, ja ir pieprasÄ«tas oficiÄlas recenzijas izmaiņas, pat ja ir pietiekoÅ¡s apstiprinÄjumu skaits. -settings.block_outdated_branch=BloÄ·Ä“t sapludinÄÅ¡anau, ja izmaiņu pieprasÄ«jums ir novecojis -settings.block_outdated_branch_desc=SapludinÄÅ¡ana nebÅ«s pieejama, ja atzars bÅ«s atpalicis no bÄzes atzara. -settings.default_branch_desc=NorÄdiet noklusÄ“to repozitorija atzaru izmaiņu pieprasÄ«jumiem un koda revÄ«zijÄm: -settings.merge_style_desc=SapludinÄÅ¡anas veidi -settings.default_merge_style_desc=NoklusÄ“tais sapludinÄÅ¡anas veids izmaiņu pieprasÄ«jumiem: -settings.choose_branch=IzvÄ“lieties atzaru… -settings.no_protected_branch=Nav neviena aizsargÄtÄ atzara. +settings.update_protect_branch_success=Zara aizsargÄÅ¡anas kÄrtula "%s" tika atjauninÄta. +settings.remove_protected_branch_success=Zara aizsargÄÅ¡anas kÄrtula "%s" tika noņemta. +settings.remove_protected_branch_failed=Zara aizsargÄÅ¡anas kÄrtulas "%s" noņemÅ¡ana neizdevÄs. +settings.protected_branch_deletion=IzdzÄ“st zara aizsargÄÅ¡anu +settings.protected_branch_deletion_desc=Zara aizsargÄÅ¡anas atspÄ“joÅ¡ana ļauj lietotÄjiem ar rakstīšanas atļauju aizgÄdÄt zarÄ izmaiņas. TurpinÄt? +settings.block_rejected_reviews=Liegt apvienoÅ¡anu, ja izskatīšana ir beigusies ar noraidīšanu +settings.block_rejected_reviews_desc=ApvienoÅ¡ana nebÅ«s iespÄ“jama, kad oficiÄlie izskatÄ«tÄji gÅ«s pieprasÄ«juÅ¡i izmaiņas, pat ja ir pietiekami daudz apstiprinÄjumu. +settings.block_on_official_review_requests=Liegt apvienoÅ¡anu, ja ir oficiÄli izskatīšanas pieprasÄ«jumi +settings.block_on_official_review_requests_desc=ApvienoÅ¡ana nebÅ«s iespÄ“jama, ja bÅ«s oficiÄli izskatīšanas pieprasÄ«jumi, pat ja bÅ«s pietiekami daudz apstiprinÄjumu. +settings.block_outdated_branch=Liegt apvienoÅ¡anu, ja izmaiņu pieprasÄ«jums ir novecojis +settings.block_outdated_branch_desc=ApvienoÅ¡ana nebÅ«s iespÄ“jama, ja zars bÅ«s atpalicis no pamata zara. +settings.default_branch_desc=AtlasÄ«t noklusÄ“juma glabÄtavas zaru izmaiņu pieprasÄ«jumiem un koda iesÅ«tÄ«jumiem: +settings.merge_style_desc=ApvienoÅ¡anas veidi +settings.default_merge_style_desc=NoklusÄ“juma apvienoÅ¡anas veids +settings.choose_branch=AtlasÄ«t zaru… +settings.no_protected_branch=Nav neviena aizsargÄtÄ zara. settings.edit_protected_branch=Labot -settings.protected_branch_required_rule_name=Nav norÄdÄ«ts noteikuma nosaukums -settings.protected_branch_duplicate_rule_name=DublÄ“joÅ¡s noteikuma nosaukumu -settings.protected_branch_required_approvals_min=PieprasÄ«to recenziju skaits nevar bÅ«t negatÄ«vs. -settings.tags=Tagi -settings.tags.protection=Tagu aizsargÄÅ¡ana -settings.tags.protection.pattern=Tagu Å¡ablons +settings.protected_branch_required_rule_name=JÄnorÄda kÄrtulas nosaukums +settings.protected_branch_duplicate_rule_name=Å ai zaru kopai jau pastÄv kÄrtula +settings.protected_branch_required_approvals_min=PieprasÄ«to izskatīšanu skaits nevar bÅ«t mazÄks par nulli. +settings.tags=Birkas +settings.tags.protection=Birku aizsargÄÅ¡ana +settings.tags.protection.pattern=Birku paraugs settings.tags.protection.allowed=Atļauts settings.tags.protection.allowed.users=Atļauts lietotÄjiem settings.tags.protection.allowed.teams=Atļauts komandÄm -settings.tags.protection.allowed.noone=Nevienam -settings.tags.protection.create=AizsargÄt tagus -settings.tags.protection.none=Nav uzstÄdÄ«ta tagu aizsargÄÅ¡ana. -settings.tags.protection.pattern.description=Var izmantot vienkÄrÅ¡u nosaukumu vai glob Å¡ablonu, vai regulÄro izteiksmi, lai atbilstu vairÄkiem tagiem. VairÄk ir lasÄms aizsargÄto tagu Å¡ablonu dokumentÄcijÄ. -settings.bot_token=Bota pilnvara +settings.tags.protection.allowed.noone=Neviens +settings.tags.protection.create=Pievienot kÄrtulu +settings.tags.protection.none=Nav aizsargÄtu birku. +settings.tags.protection.pattern.description=Var izmantot vienkÄrÅ¡u nosaukumu vai glob paraugu, vai regulÄro izteiksmi, lai atbilstu vairÄkÄm birkÄm. VairÄk ir lasÄms norÄdÄ“s par aizsargÄtajÄm birkÄm. +settings.bot_token=RobotprogrammatÅ«ras pilnvara settings.chat_id=TÄ“rzēšanas ID -settings.thread_id=Pavediena ID +settings.thread_id=Pavediena identifikators settings.matrix.homeserver_url=MÄjas servera URL settings.matrix.room_id=Istabas ID -settings.matrix.message_type=Ziņas veids -settings.archive.button=ArhivÄ“t -settings.archive.header=ArhivÄ“t repozitoriju -settings.archive.text=Repozitorija arhivēšana padarÄ«s to tikai lasÄmu. Tas nebÅ«s redzams infopanelÄ«. Neviens nevarÄ“s izveidot jaunas revÄ«zijas vai atvÄ“rt jaunus problÄ“mu pieteikumus vai izmaiņu pieprasÄ«jumus. -settings.archive.success=Repozitorijs veiksmÄ«gi arhivÄ“ts. -settings.archive.error=ArhivÄ“jot repozitoriju radÄs neparedzÄ“ta kļūda. PÄrbaudiet kļūdu žurnÄlu, lai uzzinÄtu sÄ«kÄk. -settings.archive.error_ismirror=Nav iespÄ“jams arhivÄ“t spoguļotus repozitorijus. -settings.archive.branchsettings_unavailable=Atzaru iestatÄ«jumi nav pieejami, ja repozitorijs ir arhivÄ“ts. -settings.archive.tagsettings_unavailable=Tagu iestatÄ«jumi nav pieejami, ja repozitorijs ir arhivÄ“ts. -settings.unarchive.button=Atcelt repozitorija arhivēšanu -settings.unarchive.header=Atcelt šī repozitorija arhivēšanu -settings.unarchive.text=Repozitorija arhivēšanas atcelÅ¡ana atjaunos tÄ spÄ“ju saņemt izmaiņas, kÄ arÄ« jaunus problÄ“mu pieteikumus un izmaiņu pieprasÄ«jumus. -settings.unarchive.success=Repozitorijam veiksmÄ«gi atcelta arhivÄcija. -settings.unarchive.error=Repozitorija arhivēšanas atcelÅ¡anas laikÄ atgadÄ«jÄs kļūda. VairÄk ir redzams žurnÄlÄ. -settings.update_avatar_success=Repozitorija attÄ“ls tika atjauninÄts. +settings.matrix.message_type=Ziņojuma veids +settings.archive.button=ArhivÄ“t glabÄtavu +settings.archive.header=ArhivÄ“t Å¡o glabÄtavu +settings.archive.text=GlabÄtavas arhivēšana padarÄ«s to tikai lasÄmu. TÄ nebÅ«s redzama pÄrskata panelÄ«. Neviens (pat ne Tu) nevarÄ“s izveidot jaunus iesÅ«tÄ«jumus vai atvÄ“rt pieteikumus vai izmaiņu pieprasÄ«jumus. +settings.archive.success=GlabÄtava tika sekmÄ«gi arhivÄ“ts. +settings.archive.error=AtgadÄ«jÄs kļūda, kad tika mēģinÄts arhivÄ“t glabÄtavu. JÄapskata žurnÄls, lai uzzinÄtu vairÄk. +settings.archive.error_ismirror=Nevar arhivÄ“t spoguļotu glabÄtavu. +settings.archive.branchsettings_unavailable=Zaru iestatÄ«jumi nav pieejami arhivÄ“tÄs glabÄtavÄs. +settings.archive.tagsettings_unavailable=Birku iestatÄ«jumi arhivÄ“tÄs glabÄtavÄs nav pieejami. +settings.unarchive.button=Atcelt glabÄtavas arhivēšanu +settings.unarchive.header=Atcelt šīs glabÄtavas arhivēšanu +settings.unarchive.text=GlabÄtavas arhivēšanas atcelÅ¡ana atjaunos tÄs spÄ“ju saņemt izmaiņas, kÄ arÄ« jaunus pieteikumus un izmaiņu pieprasÄ«jumus. +settings.unarchive.success=GlabÄtavas arhivēšana tika sekmÄ«gi atcelta. +settings.unarchive.error=GlabÄtavas arhivēšanas atcelÅ¡anas laikÄ atgadÄ«jÄs kļūda. VairÄk ir redzams žurnÄlÄ. +settings.update_avatar_success=GlabÄtavas attÄ“ls tika atjauninÄts. settings.lfs=LFS -settings.lfs_filelist=LFS faili, kas saglabÄti Å¡ajÄ repozitorijÄ -settings.lfs_no_lfs_files=Å ajÄ repozitorijÄ nav saglabÄts neviens LFS fails -settings.lfs_findcommits=Atrast revÄ«zijas -settings.lfs_lfs_file_no_commits=Å im LFS failam netika atrasta neviena revÄ«zija -settings.lfs_noattribute=NorÄdÄ«tÄjam ceļam nav bloķēšanas atribÅ«ta noklusÄ“tajÄ atzarÄ -settings.lfs_delete=DzÄ“st LFS failu ar OID %s -settings.lfs_delete_warning=Dzēšot LFS failu, tas var izraisÄ«t kļūdu 'object does not exist' veicot git izmaiņu saņemÅ¡anu. Vai vÄ“laties turpinÄt? -settings.lfs_findpointerfiles=Atrast norÄžu failus -settings.lfs_locks=Bloķēšanas -settings.lfs_invalid_locking_path=Nekorekts ceļš: %s -settings.lfs_invalid_lock_directory=Nevar bloÄ·Ä“t direktoriju: %s -settings.lfs_lock_already_exists=Fails vai direktorija jau ir bloÄ·Ä“ta: %s -settings.lfs_lock=BloÄ·Ä“t -settings.lfs_lock_path=Faila ceļš, ko bloÄ·Ä“t... -settings.lfs_locks_no_locks=Nav bloÄ·Ä“ts neviens fails -settings.lfs_lock_file_no_exist=BloÄ·Ä“jamais fails neeksistÄ“ noklusÄ“tajÄ atzarÄ -settings.lfs_force_unlock=Piespiedu atbloķēšana -settings.lfs_pointers.found=Atrasta(s) %d binÄrÄ objekta norÄde(s) - %d saistÄ«tas, %d nesaistÄ«tas (%d trÅ«kstoÅ¡as glabÄtuvÄ“) -settings.lfs_pointers.sha=BinÄrÄ objekta SHA +settings.lfs_filelist=Å ajÄ glabÄtavÄ uzglabÄtÄs LFS datnes +settings.lfs_no_lfs_files=Å ajÄ glabÄtavÄ netiek glabÄtas LFS datnes +settings.lfs_findcommits=Atrast iesÅ«tÄ«jumus +settings.lfs_lfs_file_no_commits=Å ai LFS datnei netika atrasts neviens iesÅ«tÄ«jums +settings.lfs_noattribute=Å im ceļam noklusÄ“juma zarÄ nav slÄ“dzamÄ«bas atribÅ«ta +settings.lfs_delete=IzdzÄ“st LFS datni ar OID %s +settings.lfs_delete_warning=LFS datnes izdzēšana var izraisÄ«t kļūdu "object does not exist" paņemÅ¡anas laikÄ. TieÅ¡Äm izdzÄ“st? +settings.lfs_findpointerfiles=Atrast norÄžu datnes +settings.lfs_locks=SlÄ“dzenes +settings.lfs_invalid_locking_path=NederÄ«gs ceļš: %s +settings.lfs_invalid_lock_directory=Nevar slÄ“gt mapi: %s +settings.lfs_lock_already_exists=SlÄ“dzene jau pastÄv: %s +settings.lfs_lock=SlÄ“gt +settings.lfs_lock_path=SlÄ“dzamÄs datnes ceļš… +settings.lfs_locks_no_locks=Nav slÄ“dzeņu +settings.lfs_lock_file_no_exist=AizslÄ“gtÄ datne nepastÄv noklusÄ“juma zarÄ +settings.lfs_force_unlock=Uzspiest atslÄ“gÅ¡anu +settings.lfs_pointers.found=Atrasta(s) %d binÄrÄ objekta norÄde(s) - %d saistÄ«ta(s), %d nesaistÄ«ta(s) (%d trÅ«kst krÄtuvÄ“) +settings.lfs_pointers.sha=BinÄrÄ objekta jaucÄ“jvirkne settings.lfs_pointers.oid=OID -settings.lfs_pointers.inRepo=RepozitorijÄ -settings.lfs_pointers.exists=EksistÄ“ glabÄtuvÄ“ +settings.lfs_pointers.inRepo=GlabÄtavÄ +settings.lfs_pointers.exists=PastÄv krÄtuvÄ“ settings.lfs_pointers.accessible=Pieejams lietotÄjam settings.lfs_pointers.associateAccessible=SaistÄ«t pieejamos %d OID'us -settings.rename_branch_failed_exist=Nevar pÄrsaukt atzaru, jo atzars %s jau eksistÄ“. -settings.rename_branch_failed_not_exist=Nevar pÄrsaukt atzaru %s, jo tÄds neeksistÄ“. -settings.rename_branch_success=Atzars %s tika veiksmÄ«gi pÄrsaukts par %s. +settings.rename_branch_failed_exist=Nevar pÄrdÄ“vÄ“t zaru, jo mÄ“rÄ·a zars %s jau pastÄv. +settings.rename_branch_failed_not_exist=Nevar pÄrdÄ“vÄ“t zaru %s, jo tas nepastÄv. +settings.rename_branch_success=Zars %s tika sekmÄ«gi pÄrdÄ“vÄ“ts par %s. settings.rename_branch_from=no vecÄ atzara nosaukuma settings.rename_branch_to=jaunais atzara nosaukums -settings.rename_branch=PÄrsaukt atzaru +settings.rename_branch=PÄrdÄ“vÄ“t zaru -diff.browse_source=PÄrlÅ«kot izejas kodu +diff.browse_source=PÄrlÅ«kot avotu diff.parent=vecÄks -diff.commit=revÄ«zija +diff.commit=iesÅ«tÄ«jums diff.git-notes=PiezÄ«mes diff.data_not_available=Satura salÄ«dzinÄÅ¡ana nav pieejama diff.options_button=SalÄ«dzinÄÅ¡anas iespÄ“jas -diff.show_diff_stats=RÄdÄ«t statistiku -diff.download_patch=LejupielÄdÄ“t ielÄpa failu -diff.download_diff=LejupielÄdÄ“t izmaiņu failu -diff.show_split_view=DalÄ«tais skats +diff.show_diff_stats=RÄdÄ«t apkopojumu +diff.download_patch=LejupielÄdÄ“t ielÄpa datni +diff.download_diff=LejupielÄdÄ“t atšķirÄ«bu datni +diff.show_split_view=SadalÄ«tais skats diff.show_unified_view=Apvienotais skats diff.whitespace_button=Atstarpes diff.whitespace_show_everything=RÄdÄ«t visas izmaiņas -diff.whitespace_ignore_all_whitespace=IgnorÄ“t atstarpes salÄ«dzinot rindas -diff.whitespace_ignore_amount_changes=IgnorÄ“t atstarpju daudzuma izmaiņas -diff.whitespace_ignore_at_eol=IgnorÄ“t atstarpju izmaiņas rindu beigÄs -diff.stats_desc=%d mainÄ«ti faili ar %d papildinÄjumiem un %d dzēšanÄm -diff.stats_desc_file=%d izmaiņas: %d pievienotas un %d dzÄ“stas +diff.whitespace_ignore_all_whitespace=Neņemt vÄ“rÄ atstarpes, kad tiek salÄ«dzinÄtas rindas +diff.whitespace_ignore_amount_changes=Neņemt vÄ“rÄ atstarpju daudzuma izmaiņas +diff.whitespace_ignore_at_eol=Neņemt vÄ“rÄ atstarpju izmaiņas rindu beigÄs +diff.stats_desc=%d izmainÄ«tas datnes ar %d papildinÄjumiem un %d izdzēšanÄm +diff.stats_desc_file=%d izmaiņas: %d pievienoÅ¡anas un %d izdzēšanas diff.bin=BinÄrs -diff.bin_not_shown=BinÄro failu nav iespÄ“jams attÄ“lot. -diff.view_file=ParÄdÄ«t failu +diff.bin_not_shown=BinÄrÄ datne netiek rÄdÄ«ta. +diff.view_file=ApskatÄ«t datni diff.file_before=Pirms diff.file_after=PÄ“c diff.file_image_width=Platums diff.file_image_height=Augstums diff.file_byte_size=IzmÄ“rs -diff.file_suppressed=FailÄ izmaiņas netiks attÄ“lotas, jo tÄs ir par lielu -diff.file_suppressed_line_too_long=Faila izmaiņas netiek rÄdÄ«tas, jo viena vai vairÄkas lÄ«nijas ir pÄrÄk garas -diff.too_many_files=Daži faili netika attÄ“loti, jo izmaiņu fails ir pÄrÄk liels -diff.show_more=RÄdÄ«t vairÄk -diff.load=IelÄdÄ“t izmaiņas -diff.generated=Ä£enerÄ“ts +diff.file_suppressed=Datnes izmaiņas netiek rÄdÄ«tas, jo tÄs ir pÄrÄk lielas +diff.file_suppressed_line_too_long=Datnes izmaiņas netiek rÄdÄ«tas, jo viena vai vairÄkas rindas ir pÄrÄk garas +diff.too_many_files=Dažas datnes netika parÄdÄ«tas, jo Å¡ajÄs izmaiņÄs ir pÄrÄk daudz izmainÄ«tu datņu +diff.show_more=ParÄdÄ«t vairÄk +diff.load=IelÄdÄ“t atšķirÄ«bas +diff.generated=izveidots diff.vendored=ÄrÄ“js -diff.comment.add_line_comment=Pievienot rindas komentÄru -diff.comment.placeholder=Ievadiet komentÄru -diff.comment.markdown_info=Tiek atbalstÄ«ta formatēšana ar Markdown. -diff.comment.add_single_comment=Pievienot vienu komentÄru -diff.comment.add_review_comment=Pievienot komentÄru -diff.comment.start_review=SÄkt recenziju +diff.comment.add_line_comment=Pievienot piebildi par rindu +diff.comment.placeholder=IerakstÄ«t piebildi +diff.comment.markdown_info=Tiek nodroÅ¡inÄta formatēšana ar Markdown. +diff.comment.add_single_comment=Pievienot vienu piebildi +diff.comment.add_review_comment=Pievienot piebildi +diff.comment.start_review=UzsÄkt izskatīšanu diff.comment.reply=AtbildÄ“t -diff.review=Recenzija -diff.review.header=IesÅ«tÄ«t recenziju -diff.review.placeholder=Recenzijas komentÄrs -diff.review.comment=KomentÄ“t +diff.review=Pabeigt izskatīšanu +diff.review.header=Iesniegt izskatīšanu +diff.review.placeholder=Izskatīšanas piezÄ«mes +diff.review.comment=Pievienot piebildi diff.review.approve=ApstiprinÄt -diff.review.self_reject=Izmaiņu pieprasÄ«juma autors nevar pieprasÄ«t izmaiņas savam izmaiņu pieprasÄ«jumam +diff.review.self_reject=Izmaiņu pieprasÄ«juma iesniedzÄ“ji nevar pieprasÄ«t izmaiņas savam izmaiņu pieprasÄ«jumam diff.review.reject=PieprasÄ«t izmaiņas -diff.review.self_approve=Izmaiņu pieprasÄ«juma autors nevar apstiprinÄt savu izmaiņu pieprasÄ«jumu -diff.committed_by=revÄ«ziju iesÅ«tÄ«ja +diff.review.self_approve=Izmaiņu pieprasÄ«juma iesniedzÄ“ji nevar apstiprinÄt savu izmaiņu pieprasÄ«jumu +diff.committed_by=iesÅ«tÄ«ja diff.protected=AizsargÄts diff.image.side_by_side=Blakus diff.image.swipe=PÄrvelkot diff.image.overlay=PÄrklÄjoÅ¡i -diff.has_escaped=Å ajÄ lÄ«nijÄ ir paslÄ“pti unikoda simboli -diff.show_file_tree=ParÄdÄ«t failu koku -diff.hide_file_tree=PaslÄ“pt failu koku +diff.has_escaped=Å ajÄ rindÄ ir slÄ“ptas unikoda rakstzÄ«mes +diff.show_file_tree=ParÄdÄ«t datņu koku +diff.hide_file_tree=PaslÄ“pt datņu koku -releases.desc=PÄrvaldiet projekta versijas un lejupielÄdes. +releases.desc=Projekta versiju un lejupielÄžu pÄrraudzīšana. release.releases=Laidieni -release.detail=Laidiena papildus informÄcija -release.tags=Tagi +release.detail=InformÄcija par laidienu +release.tags=Birkas release.new_release=Jauns laidiens release.draft=Melnraksts -release.prerelease=Pirmsizlaides versija +release.prerelease=Pirmsizlaide release.stable=Stabila release.compare=SalÄ«dzinÄt -release.edit=labot -release.ahead.commits=%d revÄ«zijas -release.ahead.target=no %s kopÅ¡ laidiena publicēšanas -tag.ahead.target=revÄ«zijas atzarÄ %s no šī taga izveidoÅ¡anas -release.source_code=Izejas kods -release.new_subheader=Laidieni palÄ«dz organizÄ“t projekta versijas. -release.edit_subheader=Laidieni palÄ«dz organizÄ“t projekta versijas. +release.edit=Labot +release.ahead.commits=%d iesÅ«tÄ«jumi +release.ahead.target=%s kopÅ¡ šī laidiena laiÅ¡anas klajÄ +tag.ahead.target=%s kopÅ¡ šīs birkas +release.source_code=Pirmkods +release.new_subheader=Laidieni apkopo projekta versijas. +release.edit_subheader=Laidieni apkopo projekta versijas. release.tag_name=Taga nosaukums release.target=MÄ“rÄ·is -release.tag_helper=IzvÄ“lieties jau esoÅ¡u tagu vai izveidojiet jaunu. -release.tag_helper_new=Jauns tags. Å is tags tiks izveidots no mÄ“rÄ·a. -release.tag_helper_existing=EsoÅ¡s tags. +release.tag_helper=JÄizvÄ“las esoÅ¡a birka vai jÄizveido jauna. +release.tag_helper_new=Jauna birka. Å Ä« birka tiks izveidota no mÄ“rÄ·a. +release.tag_helper_existing=EsoÅ¡a birka. release.title=Laidiena nosaukums release.title_empty=Nosaukums nevar bÅ«t tukÅ¡s. -release.message=Aprakstiet Å¡o laidienu -release.prerelease_desc=AtzÄ«mÄ“t kÄ pirmslaidiena versiju -release.prerelease_helper=AtzÄ«mÄ“t, ka Å¡o laidienu nav ieteicams lietot produkcijÄ. +release.message=AprakstÄ«t Å¡o laidienu +release.prerelease_desc=AtzÄ«mÄ“t kÄ pirmsizlaidi +release.prerelease_helper=AtzÄ«mÄ“t Å¡o laidienu kÄ nepiemÄ“rotu izmantoÅ¡anai produkcijÄ. release.cancel=Atcelt -release.publish=PublicÄ“t laidienu +release.publish=Laist klajÄ laidienu release.save_draft=SaglabÄt melnrakstu -release.edit_release=Labot laidienu -release.delete_release=DzÄ“st laidienu -release.delete_tag=DzÄ“st tagu -release.deletion=DzÄ“st laidienu -release.deletion_desc=Laidiena izdzēšana tikai noņem to no Gitea. TÄ neietekmÄ“s Git tagu, repozitorija saturu vai vÄ“sturi. Vai turpinÄt? +release.edit_release=AtjauninÄt laidienu +release.delete_release=IzdzÄ“st laidienu +release.delete_tag=IzdzÄ“st birku +release.deletion=IzdzÄ“st laidienu +release.deletion_desc=Laidiena izdzēšana tikai noņem to no Forgejo. TÄ neietekmÄ“s Git birku, glabÄtavas saturu vai vÄ“sturi. TurpinÄt? release.deletion_success=Laidiens tika izdzÄ“sts. -release.deletion_tag_desc=Tiks izdzÄ“sts tags no repozitorija. Repozitorija saturs un vÄ“sture netiks mainÄ«ta. Vai turpinÄt? -release.deletion_tag_success=Tags tika izdzÄ“sts. -release.tag_name_already_exist=Laidiens ar Å¡Ädu taga nosaukumu jau eksistÄ“. -release.tag_name_invalid=Nekorekts taga nosaukums. -release.tag_name_protected=Taga nosaukums ir aizsargÄts. -release.tag_already_exist=Tags ar Å¡Ädu nosaukumu jau eksistÄ“. +release.deletion_tag_desc=Å Ä« birka tiks izdzÄ“sta no glabÄtavas. GlabÄtavas saturs un vÄ“sture paliks nemainÄ«ta. TurpinÄt? +release.deletion_tag_success=Birka tika izdzÄ“sta. +release.tag_name_already_exist=Laidiens ar Å¡Ädu birkas nosaukumu jau pastÄv. +release.tag_name_invalid=NederÄ«gs birkas nosaukums. +release.tag_name_protected=Birkas nosaukums ir aizsargÄts. +release.tag_already_exist=Å Äds birkas nosaukums jau pastÄv. release.downloads=LejupielÄdes release.download_count=LejupielÄdes: %s -release.add_tag_msg=Izmantot laidiena nosaukumu un saturu kÄ taga aprakstu. -release.add_tag=Izveidot tikai tagu -release.releases_for=Repozitorja %s laidieni -release.tags_for=Repozitorija %s tagi +release.add_tag_msg=Izmantot laidiena nosaukumu un saturu kÄ birkas ziņojumu. +release.add_tag=Izveidot birku +release.releases_for=GlabÄtavas %s laidieni +release.tags_for=%s birkas -branch.name=Atzara nosaukums -branch.already_exists=Atzars ar nosaukumu "%s" jau eksistÄ“. -branch.delete_head=DzÄ“st -branch.delete=`DzÄ“st atzaru "%s"` -branch.delete_html=DzÄ“st atzaru -branch.delete_desc=Atzara dzēšana ir neatgriezeniska. Kaut arÄ« izdzÄ“stais zars neilgu laiku var turpinÄt pastÄvÄ“t, pirms tas tieÅ¡Äm tiek noņemts, to vairumÄ gadÄ«jumu NEVAR atsaukt. Vai turpinÄt? -branch.deletion_success=Atzars "%s" tika izdzÄ“sts. -branch.deletion_failed=NeizdevÄs izdzÄ“st atzaru "%s". -branch.delete_branch_has_new_commits=Atzars "%s" nevar tik dzÄ“sts, jo pÄ“c sapludinÄÅ¡anas, tam ir pievienotas jaunas revÄ«zijas. -branch.create_branch=Izveidot atzaru %s +branch.name=Zara nosaukums +branch.already_exists=Jau pastÄv zars ar nosaukumu "%s". +branch.delete_head=IzdzÄ“st +branch.delete=IzdzÄ“st zaru "%s" +branch.delete_html=IzdzÄ“st zaru +branch.delete_desc=Zara izdzēšana ir neatgriezeniska. Kaut arÄ« izdzÄ“stais zars neilgu laiku var turpinÄt pastÄvÄ“t, pirms tas patieÅ¡Äm tiek noņemts, to vairumÄ gadÄ«jumu NEVAR atsaukt. TurpinÄt? +branch.deletion_success=Zars "%s" tika izdzÄ“sts. +branch.deletion_failed=NeizdevÄs izdzÄ“st zaru "%s". +branch.delete_branch_has_new_commits=Zaru "%s" nevar izdzÄ“st, jo pÄ“c apvienoÅ¡anas ir pievienoti jauni iesÅ«tÄ«jumi. +branch.create_branch=Izveidot zaru %s branch.create_from=`no "%s"` -branch.create_success=Tika izveidots atzars "%s". -branch.branch_already_exists=Atzars "%s" Å¡ajÄ repozitorijÄ jau eksistÄ“. -branch.branch_name_conflict=Atzara nosaukums "%s" konfliktÄ“ ar jau esoÅ¡u atzaru "%s" Å¡ajÄ repozitorijÄ. -branch.tag_collision=Atzaru "%s" nevar izveidot, jo repozitorijÄ eksistÄ“ tags ar tÄdu paÅ¡u nosaukumu. +branch.create_success=Zars "%s" tika izveidots. +branch.branch_already_exists=Å ajÄ glabÄtavÄ jau ir zars "%s". +branch.branch_name_conflict=Zara nosaukums "%s" ir pretrunÄ ar jau esoÅ¡u zaru "%s". +branch.tag_collision=Zaru "%s" nevar izveidot, jo glabÄtavÄ jau ir birka ar tÄdu paÅ¡u nosaukumu. branch.deleted_by=IzdzÄ“sa %s -branch.restore_success=Tika atjaunots atzars "%s". -branch.restore_failed=NeizdevÄs atjaunot atzaru "%s". -branch.protected_deletion_failed=Atzars "%s" ir aizsargÄts. To nevar dzÄ“st. -branch.default_deletion_failed=Atzars "%s" ir noklusÄ“tais atzars un to nevar dzÄ“st. -branch.restore=`Atjaunot atzaru "%s"` -branch.download=`LejupielÄdÄ“t atzaru "%s"` -branch.rename=`PÄrsaukt atzaru "%s"` +branch.restore_success=Zars "%s" tika atjaunots. +branch.restore_failed=NeizdevÄs atjaunot zaru "%s". +branch.protected_deletion_failed=Zars "%s" ir aizsargÄts. To nevar izdzÄ“st. +branch.default_deletion_failed=Zars "%s" ir noklusÄ“juma zars. To nevar izdzÄ“st. +branch.restore=Atjaunot zaru "%s" +branch.download=LejupielÄdÄ“t zaru "%s" +branch.rename=PÄrdÄ“vÄ“t zaru "%s" branch.search=MeklÄ“t atzarÄ -branch.included_desc=Å is atzars ir daļa no noklusÄ“ta atzara +branch.included_desc=Å is zars ir daļa no noklusÄ“juma zara branch.included=Iekļauts -branch.create_new_branch=Izveidot jaunu atzaru no atzara: -branch.confirm_create_branch=Izveidot atzaru -branch.warning_rename_default_branch=Tiks pÄrsaukts noklusÄ“tais atzars. -branch.rename_branch_to=PÄrsaukt "%s" uz: +branch.create_new_branch=Izveidot zaru no zara: +branch.confirm_create_branch=Izveidot zaru +branch.warning_rename_default_branch=Tiek pÄrdÄ“vÄ“ts noklusÄ“juma zars. +branch.rename_branch_to=PÄrdÄ“vÄ“t "%s" par: branch.confirm_rename_branch=PÄrdÄ“vÄ“t atzaru -branch.create_branch_operation=Izveidot atzaru -branch.new_branch=Izveidot jaunu atzaru -branch.new_branch_from=`Izveidot jaunu atzaru no "%s"` -branch.renamed=Atzars %s tika pÄrsaukts par %s. +branch.create_branch_operation=Izveidot zaru +branch.new_branch=Izveidot jaunu zaru +branch.new_branch_from=Izveidot jaunu zaru no "%s" +branch.renamed=Zars %s tika pÄrdÄ“vÄ“ts par %s. -tag.create_tag=Izveidot tagu %s -tag.create_tag_operation=Izveidot tagu -tag.confirm_create_tag=Izveidot tagu -tag.create_tag_from=`Izveidot tagu no "%s"` +tag.create_tag=Izveidot birku %s +tag.create_tag_operation=Izveidot birku +tag.confirm_create_tag=Izveidot birku +tag.create_tag_from=Izveidot jaunu birku no "%s" -tag.create_success=Tags "%s" tika izveidots. +tag.create_success=Birka "%s" tika izveidota. topic.manage_topics=PÄrvaldÄ«t tÄ“mas topic.done=Gatavs topic.count_prompt=Nevar pievienot vairÄk kÄ 25 tÄ“mas -topic.format_prompt=TÄ“mai jÄsÄkas ar burtu vai ciparu, tÄ var saturÄ“t domu zÄ«mes ('-') un punktus ('.') un var bÅ«t lÄ«dz 35 rakstzÄ«mÄ“m gara. Burtiem jÄbÅ«t mazajiem. +topic.format_prompt=TÄ“mai jÄsÄkas ar burtu vai ciparu, tÄ var saturÄ“t domu zÄ«mes ("-") un punktus (".") un var bÅ«t lÄ«dz 35 rakstzÄ«mÄ“m gara. JÄizmanto mazie burti. -find_file.go_to_file=Iet uz failu -find_file.no_matching=AtbilstoÅ¡s fails netika atrasts +find_file.go_to_file=Atrast datni +find_file.no_matching=Netika atrasta neviena atbilstoÅ¡a datne -error.csv.too_large=Nevar attÄ“lot Å¡o failu, jo tas ir pÄrÄk liels. -error.csv.unexpected=Nevar attÄ“lot Å¡o failu, jo tas satur neparedzÄ“tu simbolu %d. lÄ«nijas %d. kolonnÄ. -error.csv.invalid_field_count=Nevar attÄ“lot Å¡o failu, jo tas satur nepareizu skaitu ar laukiem %d. lÄ«nijÄ. +error.csv.too_large=Nevar atveidot Å¡o datni, jo tÄ ir pÄrÄk liela. +error.csv.unexpected=Nevar atveidot Å¡o datni, jo tÄ satur neparedzÄ“tu rakstzÄ«mi %d. rindas %d. slejÄ. +error.csv.invalid_field_count=Nevar atveidot Å¡o datni, jo tÄ satur nepareizu lauku skaitu %d. rindÄ. +n_release_one = %s laidiens +n_release_few = %s laidieni +issues.new.assign_to_me = Piešķirt man +admin.flags_replaced = GlabÄtavas karogi aizvietoti +admin.failed_to_replace_flags = NeizdevÄs aizvietot glabÄtavas karogus +admin.manage_flags = PÄrvaldÄ«t karogus +admin.enabled_flags = GlabÄtavÄ iespÄ“jotie karogi: +n_commit_one = %s iesÅ«tÄ«jums +editor.push_out_of_date = AizgÄdÄjums izskatÄs novecojis. +file_follow = Sekot simboliskajai saitei +stars = Zvaigznes +vendored = PiegÄdÄta +subscribe.pull.guest.tooltip = JÄpiesakÄs, lai abonÄ“tu Å¡o izmaiņu pieprasÄ«jumu. +mirror_sync = sinhronizÄ“ta +editor.invalid_commit_mail = NederÄ«ga e-pasta adrese iesÅ«tÄ«juma izveidoÅ¡anai. +form.string_too_long = Å Ä« virkne ir garÄka par %d rakstzÄ«mÄ“m. +issues.filter_sort.relevance = AtbilstÄ«ba +generated = Izveidota +commits.search_branch = Å is zars +editor.commit_id_not_matching = Datne laboÅ¡anas laikÄ tika izmainÄ«ta. JÄiesÅ«ta jaunÄ zarÄ, tad jÄapvieno. +object_format = Objektu veidols +n_tag_one = %s birka +n_tag_few = %s birkas +n_branch_few = %s zari +n_branch_one = %s zars +object_format_helper = GlabÄtavas objektu veidols. VÄ“lak to nevarÄ“s mainÄ«t. SHA1 ir vissaderÄ«gÄkais. +commits.renamed_from = PÄrdÄ“vÄ“ts no %s +rss.must_be_on_branch = JÄatrodas zarÄ, lai iegÅ«tu RSS barotni. +admin.update_flags = AtjauninÄt karogus +open_with_editor = AtvÄ“rt ar %s +n_commit_few = %s iesÅ«tÄ«jumi +no_eol.text = Nav EOL +size_format = %[1]s: %[2]s; %[3]s: %[4]s +mirror_public_key = PubliskÄ SSH atslÄ“ga +mirror_use_ssh.text = Izmantot SSH autentificēšanos +mirror_use_ssh.helper = Forgejo spoguļos glabÄtavu ar Git un SSH un izveidos atslÄ“gu pÄri, kad tiks atlasÄ«ta šī iespÄ“ja. JÄnodroÅ¡ina, ka izveidotais atslÄ“gu pÄris ir pilnvarots aizgÄdÄt mÄ“rÄ·a glabÄtavÄ. NevarÄ“s izmantot pilnvaroÅ¡anu ar paroli, kad Å¡is tiek atlasÄ«ts. +mirror_use_ssh.not_available = SSH autentificēšanÄs nav pieejama. +mirror_denied_combination = Nevar izmantot autentificēšanos ar publiskÄs atslÄ“gas un paroles apvienojumu. +migrate.forgejo.description = PÄrcelt datus no codeberg.org vai citiem Fogejo serveriem. +subscribe.issue.guest.tooltip = JÄpiesakÄs, lai abonÄ“tu Å¡o pieteikumu. +project = Projekti +no_eol.tooltip = Å Ä« datne nesatur noslÄ“dzoÅ¡o rindas beigu rakstzÄ«mi. +commits.browse_further = PÄrlÅ«kot tÄlÄk +issues.edit.already_changed = NeizdevÄs saglabÄt pieteikuma izmaiņas. IzskatÄs, ka saturu jau ir mainÄ«jis kÄds cits lietotÄjs. LÅ«gums atsvaidzinÄt lapu un mēģinÄt labot vÄ“lreiz, lai izvairÄ«tos no izmaiņu pÄrrakstīšanas +settings.wiki_rename_branch_main_desc = PÄrdÄ“vÄ“t vikivietnes iekšēji izmantoto zaru par "%s". Å Ä« izmaiņa ir neatgriezeniska, un to nevar atsaukt. +settings.wiki_rename_branch_main_notices_2 = Tas neatgriezeniski pÄrdÄ“vÄ“s %s glabÄtavas vikivietnes iekšējo zaru. EsoÅ¡os atvÄ“rumus bÅ«s nepiecieÅ¡ams atjauninÄt. +settings.units.units = VienÄ«bas +settings.pull_mirror_sync_quota_exceeded = PÄrsniegts ierobežojums, izmaiņas netiks atgÄdÄtas. +settings.new_owner_blocked_doer = Jaunais Ä«paÅ¡nieks ir liedzis Tevi. +settings.enter_repo_name = JÄievada Ä«paÅ¡nieka vÄrds un glabÄtavas nosaukums tieÅ¡i tÄ, kÄ parÄdÄ«ts: +settings.transfer_quota_exceeded = Jaunais Ä«paÅ¡nieks (%s) ir pÄrsniedzis ierobežojumu. GlabÄtava netika nodota. +settings.wiki_globally_editable = Ä»aut jebkuram veikt labojumus vikivietnÄ“ +settings.wiki_rename_branch_main = MainÄ«t vikivietnes zara nosaukumu +settings.units.add_more = IespÄ“jot vÄ“l +settings.units.overview = PÄrskats +settings.confirmation_string = ApstiprinÄjuma virkne +settings.transfer.button = Nodot Ä«paÅ¡umtiesÄ«bas +settings.transfer.modal.title = Nodot Ä«paÅ¡umtiesÄ«bas +settings.mirror_settings.push_mirror.copy_public_key = Ievietot publisko atslÄ“gu starpliktuvÄ“ +pulls.agit_explanation = Izveidots ar AGit darbplÅ«smu. AGit ļauj lÄ«dzalÄ«bniekiem ieteikt izmaiņas ar "git push" bez atzarojuma vai jauna zara izveidoÅ¡anas. +settings.wiki_rename_branch_main_notices_1 = Å o darbÄ«bu NEVAR atsaukt. +release.download_count_few = %s lejupielÄdes/žu +settings.rename_branch_failed_protected = Nevar pÄrdÄ“vÄ“t zaru %s, jo tas ir aizsargÄts zars. +release.type_external_asset = Ä€rÄ“js lÄ«dzeklis +release.hide_archive_links = PaslÄ“pt automÄtiski izveidotos arhÄ«vus +settings.archive.mirrors_unavailable = SpoguļglabÄtavas nav pieejamas arhivÄ“tÄs glabÄtavÄs. +release.type_attachment = Pielikums +settings.enforce_on_admins_desc = GlabÄtavas pÄrvaldÄ«tÄji Å¡o kÄrtulu nevar apiet. +settings.matrix.access_token_helper = Å im nolÅ«kam ir ieteicams izveidot atsevišķu Matrix kontu. Piekļuves pilnvaru var iegÅ«t Element tÄ«mekļa klientÄ (privÄtÄ/inkognito cilnÄ“) > LietotÄja izvÄ“lne (augšējais kreisais stÅ«ris) > Visi iestatÄ«jumi > PalÄ«dzÄ«ba un par > Papildu > Piekļuves pilnvara (tieÅ¡i zem mÄjasservera URL). JÄaizver privÄtÄ/inkognito cilne (atteikÅ¡anÄs padarÄ«tu pilnvaru nederÄ«gu). +settings.ignore_stale_approvals = Neņemt vÄ“rÄ novecojuÅ¡us apstiprinÄjumus +release.system_generated = Å is pielikums ir izveidots automÄtiski. +settings.ignore_stale_approvals_desc = NeskaitÄ«t apstiprinÄjumus, kas tika veikti vecÄkiem iesÅ«tÄ«jumiem (novecojuÅ¡as izskatīšanas), kopÄ“jÄ izmaiņu pieprasÄ«juma apstiprinÄjumu skaitÄ. Neattiecas, ja novecojuÅ¡as izskatīšanas jau ir atmestas. +settings.enforce_on_admins = Uzspiest Å¡o kÄrtulu glabÄtavas pÄrvaldÄ«tÄjiem +release.download_count_one = %s lejupielÄde +release.hide_archive_links_helper = Å ajÄ laidienÄ paslÄ“pt automÄtiski izveidotos pirmkoda arhÄ«vus. PiemÄ“ram, ja tiek augÅ¡upielÄdÄ“ts savs. +diff.git-notes.add = Pievienot piezÄ«mi +diff.git-notes.remove-header = Noņemt piezÄ«mi +diff.git-notes.remove-body = Å Ä« piezÄ«me tiks noņemta. +settings.confirm_wiki_branch_rename = PÄrdÄ“vÄ“t vikivietnes zaru +settings.matrix.room_id_helper = Istabas Id var iegÅ«t Element tÄ«mekļa klientÄ > Istabas iestatÄ«jumi > Papildu > Iekšējais istabas Id. PiemÄ“rs: %s. +settings.mirror_settings.pushed_repository = AizgÄdÄÅ¡anas glabÄtava +error.broken_git_hook = Å Ä·iet, ka šīs glabÄtavas Git aizÄ·eres ir salÅ«zuÅ¡as. LÅ«gums vÄ“rsties dokumentÄcijÄ, lai tÄs salabotu, tad jÄaizgÄdÄ kÄds iesÅ«tÄ«jums, lai atsvaidzinÄtu stÄvokli. +settings.add_collaborator_blocked_them = Nevar pievienot lÄ«dzdalÄ«bnieku, jo viņš/a ir liedzis/a glabÄtavas Ä«paÅ¡nieku. +settings.add_collaborator_blocked_our = Nevar pievienot lÄ«dzdalÄ«bnieku, jo glabÄtavas Ä«paÅ¡nieks viņu ir liedzis. +contributors.contribution_type.filter_label = LÄ«dzdarboÅ¡anÄs veids: +activity.navbar.contributors = LÄ«dzdalÄ«bnieki +issues.review.remove_review_requests = noņēma %[1]s izskatīšanas pieprasÄ«jumus %[2]s +issues.review.add_remove_review_requests = pieprasÄ«ja izskatīšanas no %[1] un noņēma %[2]s izskatīšanas pieprasÄ«jumus %[3]s +issues.author.tooltip.pr = Å is lietotÄjs ir šī izmaiņu pieprasÄ«juma izveidotÄjs. +pulls.edit.already_changed = NeizdevÄs saglabÄt izmaiņu pieprasÄ«juma izmaiņas. IzskatÄs, ka saturu jau ir mainÄ«jis kÄds cits lietotÄjs. LÅ«gums atsvaidzinÄt lapu un mēģinÄt labot vÄ“lreiz, lai izvairÄ«tos no izmaiņu pÄrrakstīšanas +pulls.blocked_by_user = Tu nevari izveidot izmaiņu pieprasÄ«jumu Å¡ajÄ glabÄtavÄ, jo tÄs Ä«paÅ¡nieks ir Tevi liedzis. +issues.all_title = Visi +pulls.commit_ref_at = ` atsaucÄÅ¡ uz Å¡o izmaiņu pieprasÄ«jumu iesÅ«tÄ«jumÄ %[2]s` +issues.num_participants_one = %d dalÄ«bnieks +pulls.title_desc_one = vÄ“las iekļaut %[1]d iesÅ«tÄ«jumu no %[2]s %[3]s +issues.archived_label_description = (ArhivÄ“ts) %s +issues.blocked_by_user = Å ajÄ glabÄtavÄ nevari izveidot pieteikumus, jo tÄs Ä«paÅ¡nieks ir liedzis Tevi. +issues.summary_card_alt = Pieteikuma "%s" kopsavilkuma karte glabÄtavÄ %s +pulls.nothing_to_compare_have_tag = AtlasÄ«tie zari/birkas ir vienÄdi. +pulls.merged_title_desc_one = iekļÄva %[1]d iesÅ«tÄ«jumu no %[2]s %[3]s %[4]s +pulls.reopen_failed.head_branch = Izmaiņu pieprasÄ«jumu nevar atkÄrtoti atvÄ“rt, jo galotnes zars vairs nepastÄv. +pulls.reopen_failed.base_branch = Izmaiņu pieprasÄ«jumu nevar atkÄrtoti atvÄ“rt, jo pamata zars vairs nepastÄv. +pulls.cmd_instruction_merge_warning = BrÄ«dinÄjums: "AutomÄtiski noteikt paÅ¡rocÄ«gu apvienoÅ¡anu" Å¡ajÄ glabÄtavÄ nav iespÄ“jots, pÄ“cÄk bÅ«s nepiecieÅ¡ams atzÄ«mÄ“t Å¡o izmaiņu pieprasÄ«jumu kÄ paÅ¡rocÄ«gi apvienotu. +issues.author.tooltip.issue = Å is lietotÄjs ir šī pieteikuma izveidotÄjs. +issues.review.add_review_requests = pieprasÄ«ja izskatīšanu no %[1]s %[2]s +issues.comment.blocked_by_user = Tu Å¡im pieteikumam nevari pievienot piebildi, jo glabÄtavas Ä«paÅ¡nieks vai pieteikuma izveidotÄjs ir liedzis Tevi. +issues.num_reviews_one = %d izskatīšana +issues.num_reviews_few = %d izskatīšanas +settings.wiki_branch_rename_failure = NeizdevÄs normalizÄ“t glabÄtavas vikivietnes zara nosaukumu. +settings.discord_icon_url.exceeds_max_length = Ikonas URL nedrÄ«kst bÅ«t garÄka par 2048 rakstzÄ«mÄ“m +settings.sourcehut_builds.visibility = Darba redzamÄ«ba +pulls.delete_after_merge.head_branch.is_default = Izdzēšamais galotnes zars ir noklusÄ“juma zars, un to nevar izdzÄ“st. +pulls.delete_after_merge.head_branch.is_protected = Izdzēšamais galotnes zars ir aizsargÄts zars, un to nevar izdzÄ“st. +pulls.delete_after_merge.head_branch.insufficient_branch = Nav atļaujas izdzÄ“st galotnes zaru. +contributors.contribution_type.deletions = Izdzēšanas +activity.published_tag_label = Birka +settings.sourcehut_builds.manifest_path = BÅ«vÄ“juma manifesta ceļš +settings.federation_settings = FederÄcijas iestatÄ«jumi +activity.navbar.pulse = Pulss +settings.federation_not_enabled = Å ajÄ serverÄ« federÄcija nav iespÄ“jota. +settings.event_pull_request_enforcement = PiemÄ“roÅ¡ana +settings.sourcehut_builds.secrets = NoslÄ“pumi +pulls.ready_for_review = Gatavs izskatīšanai? +pulls.made_using_agit = AGit +milestones.filter_sort.name = Nosaukums +wiki.cancel = Atcelt +activity.navbar.code_frequency = Koda biežums +activity.navbar.recent_commits = Neseni iesÅ«tÄ«jumi +activity.published_prerelease_label = Pirmsizlaide +activity.commit = IesÅ«tÄ«jumu darbÄ«bas +contributors.contribution_type.additions = PievienoÅ¡anas +settings.graphql_url = GraphQL URL +wiki.no_search_results = Nekas netika atrasts +wiki.search = MeklÄ“t vikivietnÄ“ +comments.edit.already_changed = NeizdevÄs saglabÄt piebildes izmaiņas. IzskatÄs, ka saturu jau ir mainÄ«jis kÄds cits lietotÄjs. LÅ«gums atsvaidzinÄt lapu un mēģinÄt labot vÄ“lreiz, lai izvairÄ«tos no izmaiņu pÄrrakstīšanas +settings.default_update_style_desc = NoklusÄ“juma atjauninÄÅ¡anas veids izmaiņu pieprasÄ«jumu, kuri atpaliek no pamata zara, atjauninÄÅ¡anai. +settings.mirror_settings.push_mirror.none_ssh = Neviena +settings.wiki_branch_rename_success = GlabÄtavas vikivietnes zara nosaukums tika sekmÄ«gi normalizÄ“ts. +settings.web_hook_name_sourcehut_builds = SourceHut bÅ«vÄ“jumi +pulls.fast_forward_only_merge_pull_request = Tikai pÄrlÄ“kÅ¡ana +settings.federation_apapiurl = Å Ä«s glabÄtavas federÄcijas URL. Tas ir jÄievieto starpliktuvÄ“ un jÄielÄ«mÄ“ citas glabÄtavas federÄcijas iestatÄ«jumos kÄ sekojoÅ¡as glabÄtavas URL. +settings.federation_following_repos = SekojoÅ¡u glabÄtavu URL. AtdalÄ«ti ar ";", bez atstarpes. +settings.add_webhook.invalid_path = Ceļš nedrÄ«kst saturÄ“t daļu, kas ir "." vai "..", vai tukÅ¡a virkne. Tas nevar sÄkties vai beigties ar slÄ«psvÄ«tru. +settings.protect_new_rule = Izveidot jaunu zaru aizsargÄÅ¡anas kÄrtulu +settings.sourcehut_builds.secrets_helper = Dot darbam piekļuvi bÅ«vēšanas noslÄ“pumiem (nepiecieÅ¡ams nodroÅ¡inÄt SECRETS:RO) +release.asset_external_url = Ä€rÄ“jais URL +release.add_external_asset = Pievienot ÄrÄ“ju lÄ«dzekli +release.invalid_external_url = NederÄ«gs ÄrÄ“jais URL: "%s" +settings.sourcehut_builds.access_token_helper = Piekļuves pilnvara, kurai ir nodroÅ¡inÄta JOBS:RW. meta.sr.ht jÄizveido builds.sr.ht pilnvara vai builds.sr.ht pilnvara ar piekļuvi noslÄ“pumiem. +release.asset_name = LÄ«dzekļa nosaukums +pulls.sign_in_require = Pieteikties, lai izveidotu jaunu izmaiņu pieprasÄ«jumu. +new_from_template = Izmantot sagatavi +new_from_template_description = Var atlasÄ«t Å¡ajÄ serverÄ« esoÅ¡u glabÄtavas sagatavi un pielietot tÄs iestatÄ«jumus. +new_advanced = Papildu iestatÄ«jumi +new_advanced_expand = KlikšķinÄt, lai izvÄ“rstu +auto_init_description = SÄkt ar README Git vÄ“sturÄ“, pÄ“c izvÄ“les pievienojot licences un .gitignore datnes. +issues.reaction.add = Pievienot reakciju +issues.reaction.alt_few = %[1]s atsaucÄs ar %[2]s. +issues.reaction.alt_many = %[1]s un vÄ“l %[2]d atsaucÄs ar %[3]s. +issues.reaction.alt_remove = Noņemt no piebildes %[1] reakciju. +issues.reaction.alt_add = Pievienot piebildei %[1] reakcijas. +issues.context.menu = Piebildes izvÄ“lne +summary_card_alt = GlabÄtavas %s apkopojuma kartÄ«te +release.summary_card_alt = Laidiena "%s" apkopojuma kartÄ«te glabÄtavÄ %s +archive.pull.noreview = Å Ä« glabÄtava ir arhivÄ“ta. Nevar izskatÄ«t izmaiņu pieprasÄ«jumus. +editor.commit_email = IesÅ«tÄ«juma e-pasta adrese +commits.view_single_diff = ApskatÄ«t Å¡ajÄ datnÄ“ veiktÄs izmaiņas Å¡ajÄ iesÅ«tÄ«jumÄ +pulls.editable = Labojams +pulls.editable_explanation = Å is izmaiņu pieprasÄ«jums pieļauj labojumus no uzturÄ“tÄjiem. Tu vari tieÅ¡i lÄ«dzdarboties tajÄ. +issues.reopen.blocked_by_user = Tu nevari atkÄrtoti atvÄ“rt Å¡o pieteikumu, jo tÄ izveidotÄjs vai glabÄtavas Ä«paÅ¡nieks ir liedzis Tevi. +pulls.comment.blocked_by_user = Tu Å¡im izmaiņu pieprasÄ«jumam nevari pievienot piebildi, jo tÄ izveidotÄjs vai glabÄtavas Ä«paÅ¡nieks ir liedzis Tevi. +issues.filter_no_results = Nav vienumu +issues.filter_no_results_placeholder = JÄmēģina pielÄgot meklēšanas atlasÄ«tÄji. [graphs] -component_loading=IelÄdÄ“ %s... +component_loading=IelÄdÄ“ %s… component_loading_failed=NevarÄ“ja ielÄdÄ“t %s component_loading_info=Å is var aizņemt kÄdu brÄ«di… component_failed_to_load=AtgadÄ«jÄs neparedzÄ“ta kļūda. +code_frequency.what = koda biežums +recent_commits.what = neseni iesÅ«tÄ«jumi +contributors.what = sniegumi [org] -org_name_holder=OrganizÄcijas nosaukums -org_full_name_holder=OrganizÄcijas pilnais nosaukums -org_name_helper=OrganizÄciju nosaukumiem vÄ“lams bÅ«t Ä«siem un tÄdiem, ko viegli atcerÄ“ties. -create_org=Izveidot organizÄciju -repo_updated=AtjauninÄts %s +org_name_holder=ApvienÄ«bas nosaukums +org_full_name_holder=ApvienÄ«bas pilnais nosaukums +org_name_helper=ApvienÄ«bu nosaukumiem vajadzÄ“tu bÅ«t Ä«siem un viegli iegaumÄ“jamiem. +create_org=Izveidot apvienÄ«bu +repo_updated=AtjauninÄta %s members=DalÄ«bnieki teams=Komandas code=Kods lower_members=dalÄ«bnieki -lower_repositories=repozitoriji +lower_repositories=glabÄtavas create_new_team=Jauna komanda create_team=Izveidot komandu org_desc=Apraksts team_name=Komandas nosaukums team_desc=Apraksts team_name_helper=Komandu nosaukumiem vÄ“lams bÅ«t Ä«siem un tÄdiem, ko viegli atcerÄ“ties. -team_desc_helper=Aprakstiet komandas mÄ“rÄ·i vai lomu. -team_access_desc=Piekļuve repozitorijiem +team_desc_helper=Komandas nolÅ«ka vai lomas apraksts. +team_access_desc=GlabÄtavu piekļuve team_permission_desc=Atļauja -team_unit_desc=Atļaut piekļuvi repozitorija sadaļÄm +team_unit_desc=Atļaut piekļuvi glabÄtavas sadaļÄm team_unit_disabled=(AtspÄ“jots) -form.name_reserved=OrganizÄcijas nosaukums "%s" ir rezervÄ“ts. -form.name_pattern_not_allowed=OrganizÄcijas nosaukums "%s" nav atļauts. -form.create_org_not_allowed=Jums nav tiesÄ«bu veidot jauno organizÄciju. +form.name_reserved=ApvienÄ«bas nosaukums "%s" ir aizņemts. +form.name_pattern_not_allowed="%s" nav ļauts izmantot apvienÄ«bas nosaukumÄ. +form.create_org_not_allowed=Nav ļauts izveidot apvienÄ«bu. settings=IestatÄ«jumi -settings.options=OrganizÄcija -settings.full_name=Pilns vÄrds, uzvÄrds +settings.options=ApvienÄ«ba +settings.full_name=Pilns vÄrds settings.email=E-pasta adrese saziņai -settings.website=MÄjas lapa +settings.website=TÄ«mekļvietne settings.location=AtraÅ¡anÄs vieta settings.permission=TiesÄ«bas -settings.repoadminchangeteam=Repozitorija administrators var pievienot vai noņemt piekļuvi komandÄm +settings.repoadminchangeteam=GlabÄtavas pÄrvaldÄ«tÄjs var pievienot un noņemt komandu piekļuvi settings.visibility=RedzamÄ«ba -settings.visibility.public=Publiska -settings.visibility.limited=Ierobežots (redzams tikai autentificÄ“tiem lietotÄjiem) +settings.visibility.public=AtklÄta +settings.visibility.limited=Ierobežota (redzama tikai lietotÄjiem, kuri ir pieteikuÅ¡ies) settings.visibility.limited_shortname=Ierobežota -settings.visibility.private=PrivÄta (redzama tikai organizÄcijas dalÄ«bniekiem) +settings.visibility.private=PrivÄta (redzama tikai apvienÄ«bas dalÄ«bniekiem) settings.visibility.private_shortname=PrivÄta -settings.update_settings=MainÄ«t iestatÄ«jumus -settings.update_setting_success=OrganizÄcijas iestatÄ«jumi tika saglabÄti. -settings.change_orgname_prompt=PiezÄ«me: organizÄcijas nosaukuma maiņa izmainÄ«s arÄ« organizÄcijas URL un atbrÄ«vos veco nosaukumu. -settings.change_orgname_redirect_prompt=Vecais vÄrds pÄrsÅ«tÄ«s uz jauno, kamÄ“r vien tas nebÅ«s izmantots. -settings.update_avatar_success=OrganizÄcijas attÄ“ls tika saglabÄts. -settings.delete=DzÄ“st organizÄciju -settings.delete_account=DzÄ“st Å¡o organizÄciju -settings.delete_prompt=Å Ä« darbÄ«ba pilnÄ«bÄ dzÄ“sÄ«s Å¡o organizÄciju, kÄ arÄ« tÄ ir NEATGRIEZENISKA! -settings.confirm_delete_account=ApstiprinÄt dzēšanu -settings.delete_org_title=DzÄ“st organizÄciju -settings.delete_org_desc=OrganizÄcija tiks dzÄ“sta neatgriezeniski. Vai turpinÄt? -settings.hooks_desc=Pievienot tÄ«mekļa ÄÄ·us, kas nostrÄdÄs visiem repozitorijiem Å¡ajÄ organizÄcijÄ. +settings.update_settings=AtjauninÄt iestatÄ«jumus +settings.update_setting_success=ApvienÄ«bas iestatÄ«jumi tika atjauninÄti. +settings.change_orgname_prompt=PiezÄ«me: apvienÄ«bas nosaukuma maiņa izmainÄ«s arÄ« apvienÄ«bas URL un atbrÄ«vos veco nosaukumu. +settings.change_orgname_redirect_prompt=Vecais nosaukums pÄrvirzÄ«s, lÄ«dz tas bÅ«s izmantots. +settings.update_avatar_success=ApvienÄ«bas attÄ“ls tika atjauninÄts. +settings.delete=IzdzÄ“st apvienÄ«bu +settings.delete_account=IzdzÄ“st Å¡o apvienÄ«bu +settings.delete_prompt=ApvienÄ«ba tiks neatgriezeniski noņemta. To NEVAR atsaukt. +settings.confirm_delete_account=ApstiprinÄt izdzēšanu +settings.delete_org_title=IzdzÄ“st apvienÄ«bu +settings.delete_org_desc=Å Ä« apvienÄ«ba tiks neatgriezeniski izdzÄ“sta. TurpinÄt? +settings.hooks_desc=Pievienot tÄ«mekļa aizÄ·eres, kas iedarbosies šīs apvienÄ«bas visÄs glabÄtavÄs. -settings.labels_desc=Pievienojiet etiÄ·etes, kas var tikt izmantotas visos šīs organizÄcijas repozitorijos. +settings.labels_desc=Pievienot iezÄ«mes, kas var tikt izmantotas pieteikumos šīs apvienÄ«bas visÄs glabÄtavÄs. -members.membership_visibility=DalÄ«bnieka redzamÄ«ba: +members.membership_visibility=DalÄ«bnieku redzamÄ«ba: members.public=Redzams -members.public_helper=padarÄ«t slÄ“ptu +members.public_helper=PadarÄ«t slÄ“ptu members.private=SlÄ“pts -members.private_helper=padarÄ«t redzemu +members.private_helper=PadarÄ«t redzamu members.member_role=DalÄ«bnieka loma: members.owner=ĪpaÅ¡nieks members.member=DalÄ«bnieks members.remove=Noņemt -members.remove.detail=Noņemt lietotÄju %[1]s no organizÄcijas %[2]s? -members.leave=AtstÄt -members.leave.detail=Pamest organizÄciju %s? -members.invite_desc=Pievienot jaunu dalÄ«bnieku pie %s: +members.remove.detail=Noņemt %[1]s no %[2]s? +members.leave=Pamest +members.leave.detail=Vai tieÅ¡Äm pamest apvienÄ«bu "%s"? +members.invite_desc=Pievienot jaunu dalÄ«bnieku %s: members.invite_now=UzaicinÄt tagad teams.join=Pievienoties -teams.leave=AtstÄt -teams.leave.detail=Pamest organizÄciju %s? -teams.can_create_org_repo=Veidot jaunus repozitorijus -teams.can_create_org_repo_helper=Komandas biedri varÄ“s veidot jaunus repozitorijus Å¡ajÄ organizÄcijÄ. IzveidotÄjam tiks piešķirtas administratora tiesÄ«bas uz jauno repozitoriju. +teams.leave=Pamest +teams.leave.detail=Vai tieÅ¡Äm pamest komandu "%s"? +teams.can_create_org_repo=Izveidot glabÄtavas +teams.can_create_org_repo_helper=DalÄ«bnieki apvienÄ«bÄ var izveidot jaunas glabÄtavas. IzveidotÄjs iegÅ«s jaunÄs glabÄtavas pÄrvaldÄ«tÄja piekļuvi. teams.none_access=Nav piekļuves -teams.none_access_helper=Komandai nebÅ«s tiesÄ«bu skatÄ«ties vai veikt citas darbÄ«bas ar Å¡o vienumu. -teams.general_access=VispÄrÄ“ja piekļuve +teams.none_access_helper="Nav piekļuve" iespÄ“ja iedarbojas tikai privÄtÄs glabÄtavÄs. +teams.general_access=PielÄgota piekļuve teams.general_access_helper=Komandas tiesÄ«bas tiks noteiktas pÄ“c tabulas zemÄk. -teams.read_access=SkatīšanÄs +teams.read_access=LasÄ«t teams.read_access_helper=Komanda varÄ“s skatÄ«ties un klonÄ“t šīs organizÄcijas repozitorijus. -teams.write_access=Rakstīšanas +teams.write_access=RakstÄ«t teams.write_access_helper=Å Ä« komanda varÄ“s lasÄ«t un nosÅ«tÄ«t izmaiņas uz tÄs repozitorijiem. -teams.admin_access=Administratora piekļuve -teams.admin_access_helper=Å Ä« komanda varÄ“s nosÅ«tÄ«t un saņemt izmaiņas no tÄs repozitorijiem, kÄ arÄ« pievienot tiem citus lÄ«dzstrÄdniekus. +teams.admin_access=PÄrvaldÄ«tÄja piekļuve +teams.admin_access_helper=DalÄ«bnieki var atgÄdÄt un aizgÄdÄt izmaiņas uz komandas glabÄtavÄm un pievienot tÄm lÄ«dzdalÄ«bniekus. teams.no_desc=Komandai nav apraksta teams.settings=IestatÄ«jumi -teams.owners_permission_desc=ĪpaÅ¡niekiem ir pilna piekļuve visiem repozitorijiem un ir organizÄcijas administratora tiesÄ«bas. -teams.members=Komandas biedri -teams.update_settings=SaglabÄt iestatÄ«jumus -teams.delete_team=DzÄ“st komandu -teams.add_team_member=Pievienot komandas biedru +teams.owners_permission_desc=ĪpaÅ¡niekiem ir pilna piekļuve visÄm glabÄtavÄm un ir apvienÄ«bas pÄrvaldÄ«tÄja tiesÄ«bas. +teams.members=Komandas dalÄ«bnieki +teams.update_settings=AtjauninÄt iestatÄ«jumus +teams.delete_team=IzdzÄ“st komandu +teams.add_team_member=Pievienot komandas dalÄ«bnieku teams.invite_team_member=`UzaicinÄt komandÄ "%s"` -teams.invite_team_member.list=NeapstiprinÄtie uzaicinÄjumi -teams.delete_team_title=DzÄ“st komandu -teams.delete_team_desc=Dzēšot komandu, tÄs biedri var zaudÄ“t piekļuvi dažiem vai pat visiem repozitorijiem. Vai turpinÄt? +teams.invite_team_member.list=NeapstiprinÄti uzaicinÄjumi +teams.delete_team_title=IzdzÄ“st komandu +teams.delete_team_desc=Komandas izdzēšana tÄs dalÄ«bniekiem atsauc piekļuvi glabÄtavÄm. TurpinÄt? teams.delete_team_success=Komanda tika izdzÄ“sta. -teams.read_permission_desc=Å ai komandai ir lasīšanas tiesÄ«bas: dalÄ«bnieki var skatÄ«ties un klonÄ“t komandas repozitorijus. -teams.write_permission_desc=Å ai komandai ir rakstīšanas tiesÄ«bas: dalÄ«bnieki var lasÄ«t un nosÅ«tÄ«t izmaiņas repozitorijiem. -teams.admin_permission_desc=Å ai komandai ir administratora tiesÄ«bas: dalÄ«bnieki var lasÄ«t, rakstÄ«t un pievienot citus dalÄ«bniekus komandas repozitorijiem. -teams.create_repo_permission_desc=Papildus šī komanda piešķirt Veidot repozitorijus tiesÄ«bas: komandas biedri var veidot jaunus repozitorijus Å¡ajÄ organizÄcijÄ. -teams.repositories=Komandas repozitoriji +teams.read_permission_desc=Å Ä« komanda nodroÅ¡ina lasīšanas piekļuvi: dalÄ«bnieki var apskatÄ«t un klonÄ“t komandas glabÄtavas. +teams.write_permission_desc=Å Ä« komanda nodroÅ¡ina rakstīšanas piekļuvi: dalÄ«bnieki var lasÄ«t un aizgÄdÄt izmaiņas uz komandas glabÄtavÄm. +teams.admin_permission_desc=Å Ä« komanda nodroÅ¡ina pÄrvaldÄ«tÄja piekļuvi: dalÄ«bnieki var lasÄ«t no, aizgÄdÄt izmaiņas uz un pievienot lÄ«dzdalÄ«bniekus komandas glabÄtavÄm. +teams.create_repo_permission_desc=Papildus šī komanda nodroÅ¡ina atļauju Izveidot glabÄtavu: dalÄ«bnieki apvienÄ«bÄ var izveidot jaunas glabÄtavas. +teams.repositories=Komandas glabÄtavas teams.search_repo_placeholder=MeklÄ“t repozitorijÄ… -teams.remove_all_repos_title=Noņemt visus komandas repozitorijus -teams.remove_all_repos_desc=Å Ä« darbÄ«ba noņems visus repozitorijus no komandas. -teams.add_all_repos_title=Pievienot visus repozitorijus -teams.add_all_repos_desc=Å Ä« darbÄ«ba pievienos visus organizÄcijas repozitorijus Å¡ai komandai. -teams.add_nonexistent_repo=Repozitorijs, kuru mēģinat pievienot neeksistÄ“, sÄkumÄ izveidojiet to. +teams.remove_all_repos_title=Noņemt visas komandas glabÄtavas +teams.remove_all_repos_desc=Å Ä« darbÄ«ba noņems visas komandas glabÄtavas. +teams.add_all_repos_title=Pievienot visas glabÄtavas +teams.add_all_repos_desc=Komandai tiks pievienotas visas apvienÄ«bas glabÄtavas. +teams.add_nonexistent_repo=PievienojamÄ glabÄtava nepastÄv, lÅ«gums vispirms to izveidot. teams.add_duplicate_users=LietotÄjs jau ir Å¡ajÄ komandÄ. -teams.repos.none=Å ai komandai nav piekļuves nevienam repozitorijam. -teams.members.none=Å ajÄ komandÄ nav pievienots neviens lietotÄjs. -teams.specific_repositories=Atsevišķi repozitoriji -teams.specific_repositories_helper=Komandas biedriem bÅ«s piekļuve tikai pie norÄdÄ«tÄjiem repozitorijiem. AtzÄ«mÄ“jot Å¡o netiks automÄtiksi noņemti repozitoriji, kas tika pievienoti ar pazÄ«mi Visi repozitoriji. -teams.all_repositories=Visi repozitoriji -teams.all_repositories_helper=Å ai komandai ir piekļuve visiem repozitorijiem. AtzÄ«mÄ“jot Å¡o visi organizÄcijas repozitoriji tiks pievienoti Å¡ai komandai. +teams.repos.none=Å Ä« komanda nevarÄ“ja piekļūt nevienai glabÄtavai. +teams.members.none=Å ajÄ komandÄ nav dalÄ«bnieku. +teams.specific_repositories=Noteiktas glabÄtavas +teams.specific_repositories_helper=DalÄ«bniekiem bÅ«s piekļuve tikai komandai pievienotajÄm glabÄtavÄm. PÄ“c šī atlasīšanas netiks automÄtiski noņemtas glabÄtavas, kas jau tika pievienotas ar Visas glabÄtavas. +teams.all_repositories=Visas glabÄtavas +teams.all_repositories_helper=Komandai ir piekļuve visÄm glabÄtavÄm. Å Ä« atlasīšana komandai pievienos visas esoÅ¡Äs glabÄtavas. teams.all_repositories_read_permission_desc=Å Ä« komanda piešķirt skatīšanÄs tiesÄ«bas visiem repozitorijiem: komandas biedri var skatÄ«ties un klonÄ“t visus organizÄcijas repozitorijus. teams.all_repositories_write_permission_desc=Å Ä« komanda piešķirt laboÅ¡anas tiesÄ«bas visiem repozitorijiem: komandas biedri var skatÄ«ties un nosÅ«tÄ«t izmaiņas visiem organizÄcijas repozitorijiem. teams.all_repositories_admin_permission_desc=Å Ä« komanda piešķirt administratora tiesÄ«bas visiem repozitorijiem: komandas biedri var skatÄ«ties, nosÅ«tÄ«t izmaiņas un mainÄ«t iestatÄ«jumus visiem organizÄcijas repozitorijiem. -teams.invite.title=Tu esi uzaicinÄts pievienoties organizÄcijas %[2]s komandai %[1]s. +teams.invite.title=Tevi uzaicinÄja pievienoties komandai %s apvienÄ«bÄ %s. teams.invite.by=UzaicinÄja %s -teams.invite.description=Nospiediet pogu zemÄk, lai pievienotos komandai. +teams.invite.description=LÅ«gums nospiest zemÄk esoÅ¡o pogu, lai pievienotos komandai. +open_dashboard = AtvÄ“rt pÄrskata paneli +follow_blocked_user = Tu nevari sekot Å¡ai apvienÄ«bai, jo tÄ ir liegusi Tevi. +settings.change_orgname_redirect_prompt.with_cooldown.one = Vecais apvienÄ«bas nosaukums bÅ«s pieejams visiem pÄ“c noilguma, kas ir %[1]d diena. Å ajÄ laikÄ ir iespÄ“jams to atkal sÄkt izmantot. +settings.change_orgname_redirect_prompt.with_cooldown.few = Vecais apvienÄ«bas nosaukums bÅ«s pieejams visiem pÄ“c noilguma, kas ir %[1]d dienas. Å ajÄ laikÄ ir iespÄ“jams to atkal sÄkt izmantot. [admin] -dashboard=Infopanelis +dashboard=PÄrskata panelis self_check=PaÅ¡pÄrbaude identity_access=IdentitÄte un piekļuve users=LietotÄju konti -organizations=OrganizÄcijas -assets=Koda aktÄ«vi -repositories=Repozitoriji -hooks=TÄ«mekļa ÄÄ·i +organizations=ApvienÄ«bas +assets=Koda lÄ«dzekļi +repositories=GlabÄtavas +hooks=TÄ«mekļa aizÄ·eres integrations=IntegrÄcijas authentication=Autentificēšanas avoti -emails=LietotÄja e-pasts +emails=LietotÄju e-pasta adreses config=KonfigurÄcija notices=SistÄ“mas paziņojumi -monitor=UzraudzÄ«ba +monitor=PÄrraudzīšana first_page=PirmÄ last_page=PÄ“dÄ“jÄ total=KopÄ: %d -settings=Administratora iestatÄ«jumi +settings=PÄrvaldīšanas iestatÄ«jumi -dashboard.new_version_hint=Ir pieejama Forgejo versija %s, paÅ¡reizÄ“jÄ versija %s. Papildus informÄcija par jauno versiju ir pieejama mÄjas lapÄ. +dashboard.new_version_hint=Ir pieejama Forgejo %s, paÅ¡laik darbojas %s. VairÄk informÄcijas ir atrodama emuÄrÄ. dashboard.statistic=Kopsavilkums dashboard.operations=Uzturēšanas darbÄ«bas -dashboard.system_status=SistÄ“mas statuss +dashboard.system_status=SistÄ“mas stÄvoklis dashboard.operation_name=DarbÄ«bas nosaukums dashboard.operation_switch=PÄrslÄ“gt dashboard.operation_run=Palaist @@ -2738,342 +3085,342 @@ dashboard.task.unknown=NezinÄms uzdevums: %[1]s dashboard.cron.started=UzsÄkts Cron: %[1]s dashboard.cron.process=Cron: %[1]s dashboard.cron.cancelled=Cron: %[1]s atcelts: %[3]s -dashboard.cron.error=Kļūda Cron: %s: %[3]s +dashboard.cron.error=Cron kļūda: %s: %[3]s dashboard.cron.finished=Cron: %[1]s pabeigts -dashboard.delete_inactive_accounts=DzÄ“st visus neaktivizÄ“tos kontus -dashboard.delete_inactive_accounts.started=Uzdevums visu neaktivizÄ“to kontu dzēšanai uzsÄkts. -dashboard.delete_repo_archives=DzÄ“st visu repozitoriju arhÄ«vus (ZIP, TAR.GZ utt.) -dashboard.delete_repo_archives.started=Uzdevums visu repozitoriju arhÄ«vu dzēšanai uzsÄkts. -dashboard.delete_missing_repos=DzÄ“st visus repozitorijus, kam trÅ«kst Git failu -dashboard.delete_missing_repos.started=Uzdevums visu repozitoriju dzēšanai, kam trÅ«kst git failu, uzsÄkts. -dashboard.delete_generated_repository_avatars=DzÄ“st Ä£enerÄ“tos repozitoriju attÄ“lus -dashboard.sync_repo_branches=SinhronizÄcija ar dabubÄzi izlaida atzarus no git datiem -dashboard.update_mirrors=Atjaunot spoguļus -dashboard.repo_health_check=PÄrbaudÄ«t visu repozitoriju veselÄ«bu -dashboard.check_repo_stats=PÄrbaudÄ«t visu repozitoriju statistiku -dashboard.archive_cleanup=DzÄ“st repozitoriju vecos arhÄ«vus -dashboard.deleted_branches_cleanup=NotÄ«rÄ«t dzÄ“stos atzarus -dashboard.update_migration_poster_id=Atjaunot migrÄcijÄm autoru ID -dashboard.git_gc_repos=Veikt atkritumu uzkopÅ¡anas darbus visiem repozitorijiem -dashboard.resync_all_sshkeys=Atjaunot '.ssh/authorized_keys' failu ar Forgejo SSH atslÄ“gÄm. -dashboard.resync_all_sshprincipals=Atjaunot '.ssh/authorized_principals' failu ar Forgejo SSH sertifikÄtu identitÄtÄ“m. -dashboard.resync_all_hooks=PÄrsinhronizÄ“t pirms-saņemÅ¡anas, atjaunoÅ¡anas un pÄ“c-saņemÅ¡anas ÄÄ·us visiem repozitorijiem. -dashboard.reinit_missing_repos=AtkÄrtoti inicializÄ“t visus pazaudÄ“tos Git repozitorijus par kuriem eksistÄ“ ieraksti +dashboard.delete_inactive_accounts=IzdzÄ“st visus neaktivÄ“tos kontus +dashboard.delete_inactive_accounts.started=Ir uzsÄkts visu neaktivÄ“to kontu izdzēšanas uzdevums. +dashboard.delete_repo_archives=IzdzÄ“st visus glabÄtavu arhÄ«vus (ZIP, TAR.GZ utt.) +dashboard.delete_repo_archives.started=Visu glabÄtavas arhÄ«vu izdzēšanas uzdevums ir uzsÄkts. +dashboard.delete_missing_repos=IzdzÄ“st visas glabÄtavas, kurÄm trÅ«kst Git datņu +dashboard.delete_missing_repos.started=UzsÄkts uzdevums visu glabÄtavu, kurÄm trÅ«kst Git datņu, izdzēšanai. +dashboard.delete_generated_repository_avatars=IzdzÄ“st izveidotos glabÄtavu attÄ“lus +dashboard.sync_repo_branches=Sinhronizēšana datubÄzÄ“s izlaida zarus no Git datiem +dashboard.update_mirrors=AtjauninÄt spoguļglabÄtavas +dashboard.repo_health_check=PÄrbaudÄ«t visu glabÄtavu darbspÄ“ju +dashboard.check_repo_stats=PÄrbaudÄ«t visu glabÄtavas apkopojumu +dashboard.archive_cleanup=IzdzÄ“st vecos glabÄtavu arhÄ«vus +dashboard.deleted_branches_cleanup=NotÄ«rÄ«t izdzÄ“stos zarus +dashboard.update_migration_poster_id=AtjauninÄt pÄrcelÅ¡anas ierosinÄtÄja identifikatorus +dashboard.git_gc_repos=Veikt drazu savÄkÅ¡anu visÄs glabÄtavÄs +dashboard.resync_all_sshkeys=AtjauninÄt datni ".ssh/authorized_keys" ar Forgejo SSH atslÄ“gÄm. +dashboard.resync_all_sshprincipals=AtjauninÄt datni ".ssh/authorized_principals" ar Forgejo SSH identitÄtÄ“m. +dashboard.resync_all_hooks=AtkÄrtoti sinhronizÄ“t pirmssaņemÅ¡anas, atjauninÄÅ¡anas un pÄ“csaņemÅ¡ans aizÄ·eres visÄs glabÄtavÄs +dashboard.reinit_missing_repos=AtkÄrtoti sÄknÄ“t visas trÅ«kstoÅ¡Äs Git glabÄtavas, par kurÄm ir ieraksti dashboard.sync_external_users=SinhronizÄ“t ÄrÄ“jo lietotÄju datus -dashboard.cleanup_hook_task_table=IztÄ«rÄ«t tÄ«mekļa ÄÄ·u vÄ“sturi +dashboard.cleanup_hook_task_table=IztÄ«rÄ«t tabulu hook_task dashboard.cleanup_packages=NotÄ«rÄ«t novecojuÅ¡Äs pakotnes dashboard.cleanup_actions=NotÄ«rÄ«t darbÄ«bu izbeiguÅ¡os žurnÄlus un artefaktus dashboard.server_uptime=Servera darbÄ«bas laiks -dashboard.current_goroutine=IzmantotÄs GorutÄ«nas -dashboard.current_memory_usage=PaÅ¡reiz izmantotÄ atmiņa -dashboard.total_memory_allocated=KopÄ“jÄ piešķirtÄ atmiņa +dashboard.current_goroutine=PaÅ¡reizÄ“jÄs gorutÄ«nas +dashboard.current_memory_usage=PaÅ¡reizÄ“jais atmiņas lietojums +dashboard.total_memory_allocated=KopÄ“jÄ iedalÄ«tÄ atmiņa dashboard.memory_obtained=IegÅ«tÄ atmiņa -dashboard.pointer_lookup_times=RÄdÄ«tÄju meklēšanas reizes -dashboard.memory_allocate_times=Atmiņas piešķirÅ¡anas reizes -dashboard.memory_free_times=Atmiņas atbrÄ«voÅ¡anas reizes -dashboard.current_heap_usage=PaÅ¡reizÄ“jÄ kaudzes izmantoÅ¡ana -dashboard.heap_memory_obtained=IegÅ«tÄ kaudzes atmiņa -dashboard.heap_memory_idle=NeizmantotÄ kaudzes atmiņa -dashboard.heap_memory_in_use=IzmantotÄ kaudzes atmiņa -dashboard.heap_memory_released=AtbrÄ«votÄ kaudzes atmiņa -dashboard.heap_objects=Kaudzes atmiņas objekti -dashboard.bootstrap_stack_usage=Izmantotais sÄknēšanas steka lielums -dashboard.stack_memory_obtained=IegÅ«tÄ steka atmiņa -dashboard.mspan_structures_usage=IzmantotÄs MSpan struktÅ«ras +dashboard.pointer_lookup_times=RÄdÄ«tÄju uzmeklēšanas reizes +dashboard.memory_allocate_times=Atmiņas iedalīšanas +dashboard.memory_free_times=Atmiņas atbrÄ«voÅ¡anas +dashboard.current_heap_usage=PaÅ¡reizÄ“jais grÄ“das lietojums +dashboard.heap_memory_obtained=IegÅ«tÄ grÄ“das atmiņa +dashboard.heap_memory_idle=NeizmantotÄ grÄ“das atmiņa +dashboard.heap_memory_in_use=IzmantotÄ grÄ“das atmiņa +dashboard.heap_memory_released=AtbrÄ«votÄ grÄ“das atmiņa +dashboard.heap_objects=GrÄ“das objekti +dashboard.bootstrap_stack_usage=SÄkumielÄdÄ“tÄja viengala rindas lietojums +dashboard.stack_memory_obtained=IegÅ«tÄ viengala rindas atmiņa +dashboard.mspan_structures_usage=MSpan struktÅ«ru lietojums dashboard.mspan_structures_obtained=IegÅ«tÄs MSpan struktÅ«ras -dashboard.mcache_structures_usage=IzmantotÄs MCache struktÅ«ras +dashboard.mcache_structures_usage=MCache struktÅ«ru lietojums dashboard.mcache_structures_obtained=IegÅ«tÄs MCache struktÅ«ras -dashboard.profiling_bucket_hash_table_obtained=IegÅ«tÄ profilēšanas kausa jaucÄ“jtabula +dashboard.profiling_bucket_hash_table_obtained=IegÅ«tÄ profilēšanas groza jaucÄ“jtabula dashboard.gc_metadata_obtained=IegÅ«tie GC metadati -dashboard.other_system_allocation_obtained=IegÅ«tÄs citas sistÄ“mas sadales -dashboard.next_gc_recycle=NÄkoÅ¡Ä GC atkritne +dashboard.other_system_allocation_obtained=Citas iegÅ«tÄs sistÄ“mas sadales +dashboard.next_gc_recycle=NÄkamÄ GC atkritne dashboard.last_gc_time=Laiks kopÅ¡ pÄ“dÄ“jÄs GC dashboard.total_gc_time=KopÄ“jais GC izpildes laiks -dashboard.total_gc_pause=KopÄ“jais GC izpildes laiks -dashboard.last_gc_pause=PedÄ“jÄs GC izpildes laiks +dashboard.total_gc_pause=KopÄ“jais GC pÄrtraukums +dashboard.last_gc_pause=PedÄ“jais GC pÄrtraukums dashboard.gc_times=GC reizes -dashboard.delete_old_actions=DzÄ“st visas darbÄ«bas no datu bÄzes -dashboard.delete_old_actions.started=UzsÄkta visu novecojuÅ¡o darbÄ«bu dzēšana no datu bÄzes. +dashboard.delete_old_actions=IzdzÄ“st visas novecojuÅ¡Äs darbÄ«bas no datubÄzes +dashboard.delete_old_actions.started=UzsÄkta visu novecojuÅ¡o darbÄ«bu izdzēšana no datubÄzes. dashboard.update_checker=AtjauninÄjumu pÄrbaudÄ«tÄjs dashboard.delete_old_system_notices=DzÄ“st vecos sistÄ“mas paziņojumus no datubÄzes dashboard.gc_lfs=Veikt atkritumu uzkopÅ¡anas darbus LFS meta objektiem -dashboard.stop_zombie_tasks=ApturÄ“t zombija uzdevumus -dashboard.stop_endless_tasks=ApturÄ“t nepÄrtrauktus uzdevumus -dashboard.cancel_abandoned_jobs=Atcelt pamestus darbus -dashboard.start_schedule_tasks=SÄkt plÄnotos uzdevumus -dashboard.sync_branch.started=SÄkta atzaru sinhronizÄcija -dashboard.rebuild_issue_indexer=PÄrbÅ«vÄ“t problÄ“mu indeksu +dashboard.stop_zombie_tasks=ApturÄ“t darbÄ«bu zombijuzdevumus +dashboard.stop_endless_tasks=ApturÄ“t bezgalÄ«gus darbÄ«bu uzdevumus +dashboard.cancel_abandoned_jobs=Atcelt pamestus darbÄ«bu darbus +dashboard.start_schedule_tasks=UzsÄkt paredzÄ“tos darbÄ«bu uzdevumus +dashboard.sync_branch.started=UzsÄkta zaru sinhronizēšana +dashboard.rebuild_issue_indexer=PÄrbÅ«vÄ“t pieteikumu indeksÄ“tÄju -users.user_manage_panel=LietotÄju kontu pÄrvaldÄ«ba +users.user_manage_panel=PÄrvaldÄ«t lietotÄju kontus users.new_account=Izveidot lietotÄja kontu users.name=LietotÄjvÄrds -users.full_name=VÄrds, uzvÄrds -users.activated=AktivizÄ“ts -users.admin=Administrators +users.full_name=Pilns vÄrds +users.activated=AktivÄ“ts +users.admin=PÄrvaldÄ«tÄjs users.restricted=Ierobežots users.reserved=Aizņemts -users.bot=Bots +users.bot=RobotprogrammatÅ«ra users.remote=AttÄls users.2fa=2FA -users.repos=Repozitoriji +users.repos=GlabÄtavas users.created=Izveidots users.last_login=PÄ“dÄ“jÄ pieteikÅ¡anÄs -users.never_login=PieteikÅ¡anÄs nekad nav veikta -users.send_register_notify=NosÅ«tÄ«t lietotÄjam reÄ£istrÄcijas paziņojumu +users.never_login=PieteikÅ¡anÄs nekad nav notikusi +users.send_register_notify=Paziņot par reÄ£istrÄciju e-pastÄ users.new_success=LietotÄja konts "%s" tika izveidots. users.edit=Labot -users.auth_source=Autentificēšanas avots +users.auth_source=AutentificēšanÄs avots users.local=IebÅ«vÄ“tÄ -users.auth_login_name=AutentifikÄcijas pieteikÅ¡anÄs vÄrds -users.password_helper=AtstÄjiet paroli tukÅ¡u, ja nevÄ“laties mainÄ«t. -users.update_profile_success=LietotÄja konts tika atjaunots. +users.auth_login_name=AutentificēšanÄs pieteikÅ¡anÄs vÄrds +users.password_helper=AtstÄt paroli tukÅ¡u, lai paturÄ“tu to neizmainÄ«tu. +users.update_profile_success=LietotÄja konts tika atjauninÄts. users.edit_account=Labot lietotÄja kontu -users.max_repo_creation=MaksimÄlais repozitoriju skaits -users.max_repo_creation_desc=(Ievadiet -1 lai izmantotu noklusÄ“to globÄlo ierobežojumu) -users.is_activated=LietotÄja konts ir aktivizÄ“ts -users.prohibit_login=AtspÄ“jota pieteikÅ¡anÄs -users.is_admin=Administratora tiesÄ«bas -users.is_restricted=Ir ierobežots -users.allow_git_hook=Atļaut veidot git ÄÄ·us -users.allow_git_hook_tooltip=Git ÄÄ·i tiek izpildÄ«ti ar OS lietotÄju zem kura ir izpildÄ«ts Forgejo serviss un tiem ir tÄda paÅ¡a lÄ«meņa piekļuve serverim. Å Ä« rezultÄtÄ, lietotÄjiem ar speciÄlajÄm Git ÄÄ·u tiesÄ«bÄm ir iespÄ“ja piekļūt un mainÄ«t visus Forgejo repozitorijus, kÄ arÄ« datu bÄzi, ko izmanto Forgejo. TÄpat Å¡ie lietotÄji var iegÅ«t Forgejo administratora tiesÄ«bas. -users.allow_import_local=Atļauts importÄ“t lokÄlus repozitorijus -users.allow_create_organization=Atļauts veidot organizÄcijas -users.update_profile=MainÄ«t lietotÄja kontu -users.delete_account=DzÄ“st lietotÄja kontu +users.max_repo_creation=LielÄkais pieļaujamais glabÄtavu skaits +users.max_repo_creation_desc=(JÄievada -1, lai izmantotu vispÄrÄ“jo noklusÄ“juma ierobežojumu) +users.is_activated=AktivÄ“ts konts +users.prohibit_login=ApturÄ“ta pieteikÅ¡anÄs +users.is_admin=PÄrvaldÄ«tÄja konts +users.is_restricted=Ierobežots konts +users.allow_git_hook=Var izveidot Git aizÄ·eres +users.allow_git_hook_tooltip=Git aizÄ·eres tiek izpildÄ«tas ar OS lietotÄju, ar kuru tiek palaists Forgejo, un tÄm ir tÄda paÅ¡a lÄ«meņa piekļuve sistÄ“mai. IznÄkumÄ lietotÄji ar Å¡o Ä«paÅ¡o Git aizÄ·eru tiesÄ«bu var piekļūt un mainÄ«t visas Forgejo glabÄtavas, kÄ arÄ« Forgejo izmantoto datu bÄzi. TÄtad tie var arÄ« iegÅ«t Forgejo pÄrvaldÄ«tÄja tiesÄ«bas. +users.allow_import_local=Var ievietot vietÄ“jas glabÄtavas +users.allow_create_organization=Var izveidot apvienÄ«bas +users.update_profile=AtjauninÄt lietotÄja kontu +users.delete_account=IzdzÄ“st lietotÄja kontu users.cannot_delete_self=Nevar izdzÄ“st sevi -users.still_own_repo=LietotÄjam pieder repozitoriji, tos sÄkumÄ ir nepiecieÅ¡ams izdzÄ“st vai mainÄ«t to Ä«paÅ¡nieku. -users.still_has_org=Å is lietotÄjs ir vienas vai vairÄku organizÄciju biedrs, lietotÄju sÄkumÄ ir nepiecieÅ¡ams pamest šīs organizÄcijas vai viņu no tÄm ir jÄizdzēš. -users.purge=AttÄ«rÄ«t lietotu -users.purge_help=Piespiedu dzÄ“st lietotÄju un visus tÄ repozitorijus, organizÄcijas un pakotnes. ArÄ« visi lietotÄja komentÄri tiks dzÄ“sti. +users.still_own_repo=Å im lietotÄjam joprojÄm pieder viena vai vairÄkas glabÄtavas. TÄs vispirms jÄizdzēš vai jÄnodod. +users.still_has_org=Å is lietotÄjs ir apvienÄ«bas dalÄ«bnieks. Vispirms lietotÄjs ir jÄnoņem no visÄm apvienÄ«bÄm. +users.purge=AtbrÄ«voties no lietotÄja +users.purge_help=Veikt lietotÄja un visu tam piederoÅ¡o glabÄtavu, apvienÄ«bu un pakotņu uzspiestu izdzēšanu. Tiks izdzÄ“stas visas piebildes un lietotÄja izveidotie pieteikumi. users.still_own_packages=Å im lietotÄjam pieder viena vai vairÄkas pakotnes, tÄs nepiecieÅ¡ams izdzÄ“st. -users.deletion_success=LietotÄja konts veiksmÄ«gi izdzÄ“sts. -users.reset_2fa=Noņemt 2FA -users.list_status_filter.menu_text=Filtrs +users.deletion_success=LietotÄja konts tika izdzÄ“sts. +users.reset_2fa=AtiestatÄ«t 2FA +users.list_status_filter.menu_text=AtlasÄ«t users.list_status_filter.reset=AtiestatÄ«t users.list_status_filter.is_active=AktÄ«vs users.list_status_filter.not_active=NeaktÄ«vs -users.list_status_filter.is_admin=Admin -users.list_status_filter.not_admin=Nav administrators +users.list_status_filter.is_admin=PÄrvaldÄ«tÄjs +users.list_status_filter.not_admin=Nav pÄrvaldÄ«tÄjs users.list_status_filter.is_restricted=Ierobežots users.list_status_filter.not_restricted=Nav ierobežots -users.list_status_filter.is_prohibit_login=Nav atļauta autorizēšanÄs -users.list_status_filter.not_prohibit_login=Atļaut autorizÄciju -users.list_status_filter.is_2fa_enabled=2FA iespÄ“jots -users.list_status_filter.not_2fa_enabled=2FA nav iespÄ“jots +users.list_status_filter.is_prohibit_login=Neļaut pieteikÅ¡anos +users.list_status_filter.not_prohibit_login=Atļaut pieteikÅ¡anos +users.list_status_filter.is_2fa_enabled=2FA iespÄ“jota +users.list_status_filter.not_2fa_enabled=2FA atspÄ“jota users.details=LietotÄja informÄcija -emails.email_manage_panel=LietotÄju e-pastu pÄrvaldÄ«ba -emails.primary=PrimÄrais -emails.activated=AktivizÄ“ts -emails.filter_sort.email=E-pasts -emails.filter_sort.email_reverse=E-pasta adrese (pretÄ“ji alfabÄ“tiski) +emails.email_manage_panel=PÄrvaldÄ«t lietotÄju e-pasta adreses +emails.primary=GalvenÄ +emails.activated=AktivÄ“ta +emails.filter_sort.email=E-pasta adrese +emails.filter_sort.email_reverse=E-pasta adrese (apvÄ“rsti) emails.filter_sort.name=LietotÄjvÄrds -emails.filter_sort.name_reverse=LietotÄja vÄrds (pretÄ“ji alfabÄ“tiski) -emails.updated=E-pasts atjaunots -emails.not_updated=NeizdevÄs atjaunot pieprasÄ«to e-pasta adresi: %v +emails.filter_sort.name_reverse=LietotÄja vÄrds (apvÄ“rsti) +emails.updated=E-pasta adrese atjauninÄta +emails.not_updated=NeizdevÄs atjauninÄt pieprasÄ«to e-pasta adresi: %v emails.duplicate_active=E-pasta adrese jau ir aktÄ«va citam lietotÄjam. -emails.change_email_header=Atjaunot e-pasta rekvizÄ«tus -emails.change_email_text=Vai patieÅ¡Äm vÄ“laties atjaunot Å¡o e-pasta adresi? +emails.change_email_header=AtjauninÄt e-pasta Ä«pašības +emails.change_email_text=Vai tieÅ¡Äm atjauninÄt Å¡o e-pasta adresi? -orgs.org_manage_panel=OrganizÄciju pÄrvaldÄ«ba +orgs.org_manage_panel=PÄrvaldÄ«t apvienÄ«bas orgs.name=Nosaukums orgs.teams=Komandas orgs.members=DalÄ«bnieki -orgs.new_orga=Jauna organizÄcija +orgs.new_orga=Jauna apvienÄ«ba -repos.repo_manage_panel=Repozitoriju pÄrvaldÄ«ba -repos.unadopted=NepÄrņemtie repozitoriji -repos.unadopted.no_more=Netika atrasts neviens nepÄrņemtais repozitorijs +repos.repo_manage_panel=PÄrvaldÄ«t glabÄtavas +repos.unadopted=NepieņemtÄs glabÄtavas +repos.unadopted.no_more=Nav atrasta neviena nepieņemta glabÄtava. repos.owner=ĪpaÅ¡nieks repos.name=Nosaukums -repos.private=PrivÄts +repos.private=PrivÄta repos.watches=VÄ“roÅ¡ana repos.stars=Zvaigznes repos.forks=AtdalÄ«tie -repos.issues=ProblÄ“mas +repos.issues=Pieteikumi repos.size=IzmÄ“rs -repos.lfs_size=LFS izmÄ“rs +repos.lfs_size=LFS lielums -packages.package_manage_panel=Pakotņu pÄrvaldÄ«ba -packages.total_size=KopÄ“jais izmÄ“rs: %s -packages.unreferenced_size=IzmÄ“rs bez atsauces: %s +packages.package_manage_panel=PÄrvaldÄ«t pakotnes +packages.total_size=KopÄ“jais lielums: %s +packages.unreferenced_size=Lielums bez atsauces: %s packages.cleanup=NotÄ«rÄ«t novecojuÅ¡os datus -packages.cleanup.success=NovecojuÅ¡i dati veiksmÄ«gi notÄ«rÄ«ti +packages.cleanup.success=IzbeiguÅ¡ies dati sekmÄ«gi notÄ«rÄ«ti packages.owner=ĪpaÅ¡nieks packages.creator=IzveidotÄjs packages.name=Nosaukums packages.version=Versija packages.type=Veids -packages.repository=Repozitorijs +packages.repository=GlabÄtava packages.size=IzmÄ“rs -packages.published=PublicÄ“ts +packages.published=Laista klajÄ -defaulthooks=NoklusÄ“tie tÄ«mekļa ÄÄ·i -defaulthooks.desc=TÄ«mekļa ÄÄ·i automÄtiski nosÅ«ta HTTP POST pieprasÄ«jumus serverim, kad iestÄjas noteikti Gitea notikumi. Å eit pievienotie tÄ«mekļa ÄÄ·i ir noklusÄ“juma, un tie tiks pievienoti visiem jaunajiem repozitorijiem. VairÄk ir lasÄms tÄ«mekļa ÄÄ·u dokumentÄcijÄ. -defaulthooks.add_webhook=Pievienot noklusÄ“to tÄ«mekļa ÄÄ·i -defaulthooks.update_webhook=MainÄ«t noklusÄ“to tÄ«mekļa ÄÄ·i +defaulthooks=NoklusÄ“juma tÄ«mekļa aizÄ·eres +defaulthooks.desc=TÄ«mekļa aizÄ·eres automÄtiski nosÅ«ta HTTP POST pieprasÄ«jumus serverim, kad iestÄjas noteikti Forgejo notikumi. Å eit esoÅ¡Äs tÄ«mekļa aizÄ·eres ir noklusÄ“juma, un tÄs tiks ievietotas visÄs jaunajÄs glabÄtavÄs. VairÄk ir lasÄms norÄdÄ“s par tÄ«mekļa aizÄ·erÄ“m. +defaulthooks.add_webhook=Pievienot noklusÄ“juma tÄ«mekļa aizÄ·eri +defaulthooks.update_webhook=AtjauninÄt noklusÄ“juma tÄ«mekļa aizÄ·eri -systemhooks=SistÄ“mas tÄ«mekļa ÄÄ·i -systemhooks.desc=TÄ«mekļa ÄÄ·i automÄtiski nosÅ«ta HTTP POST pieprasÄ«jumus serverim, kad iestÄjas noteikti Gitea notikumi. Å eit pievienotie tÄ«mekļa ÄÄ·i tiks izsaukti visiem sistÄ“mas repozitorijiem, tÄdēļ lÅ«gums apsvÄ“rt to iespÄ“jamo ietekmi uz veiktspÄ“ju. VairÄk ir lasÄms tÄ«mekļa ÄÄ·u dokumentÄcijÄ. -systemhooks.add_webhook=Pievienot sistÄ“mas tÄ«mekļa ÄÄ·i -systemhooks.update_webhook=MainÄ«t sistÄ“mas tÄ«mekļa ÄÄ·i +systemhooks=SistÄ“mas tÄ«mekļa aizÄ·eres +systemhooks.desc=TÄ«mekļa aizÄ·eres automÄtiski nosÅ«ta HTTP POST pieprasÄ«jumus serverim, kad iestÄjas noteikti Forgejo notikumi. Å eit izveidotÄs tÄ«mekļa aizÄ·eres iedarbosies visÄs sistÄ“mas glabÄtavÄs, tÄdēļ lÅ«gums apsvÄ“rt jebkuru iespÄ“jamo ietekmi uz veiktspÄ“ju. VairÄk ir lasÄms norÄdÄ“s par tÄ«mekļa aizÄ·erÄ“m. +systemhooks.add_webhook=Pievienot sistÄ“mas tÄ«mekļa aizÄ·eri +systemhooks.update_webhook=AtjauninÄt sistÄ“mas tÄ«mekļa aizÄ·eri -auths.auth_manage_panel=AutentifikÄcijas avotu pÄrvaldÄ«ba -auths.new=Pievienot autentifikÄcijas avotu +auths.auth_manage_panel=PÄrvaldÄ«t autentificēšanÄs avotus +auths.new=Pievienot autentificēšanas avotu auths.name=Nosaukums auths.type=Veids auths.enabled=IespÄ“jots auths.syncenabled=IespÄ“jot lietotÄju sinhronizÄciju auths.updated=AtjauninÄta -auths.auth_type=AutentifikÄcijas tips -auths.auth_name=AutentifikÄcijas nosaukums +auths.auth_type=Autentificēšanas veids +auths.auth_name=Autentificēšanas nosaukums auths.security_protocol=Drošības protokols auths.domain=DomÄ“ns auths.host=Resursdators auths.port=Ports auths.bind_dn=Saistīšanas DN auths.bind_password=Saistīšanas parole -auths.user_base=LietotÄja pamatnosacÄ«jumi +auths.user_base=LietotÄju meklēšanas pamatnosacÄ«jumi auths.user_dn=LietotÄja DN auths.attribute_username=LietotÄjvÄrda atribÅ«ts -auths.attribute_username_placeholder=AtstÄjiet tukÅ¡u, ja vÄ“laties, lai tiek izmantots Forgejo ievadÄ«tais lietotÄjvÄrds. +auths.attribute_username_placeholder=AtstÄt tukÅ¡u, lai izmantotu Forgejo ievadÄ«to lietotÄjvÄrdu. auths.attribute_name=VÄrda atribÅ«ts auths.attribute_surname=UzvÄrda atribÅ«ts auths.attribute_mail=E-pasta atribÅ«ts auths.attribute_ssh_public_key=PubliskÄs SSH atslÄ“gas atribÅ«ts auths.attribute_avatar=Profila attÄ“la atribÅ«ts auths.attributes_in_bind=NolasÄ«t atribÅ«tus no saistīšanas DN konteksta -auths.allow_deactivate_all=Atļaut tukÅ¡am datu izgūšanas rezultÄtam deaktivizÄ“t visus lietotÄjus -auths.use_paged_search=Izmantot, dalÄ«to pa lapÄm, meklēšanu -auths.search_page_size=Lapas izmÄ“rs -auths.filter=LietotÄju filts -auths.admin_filter=Administratoru filtrs -auths.restricted_filter=Ierobežoto lietotÄju filtrs -auths.restricted_filter_helper=AtstÄjiet tukÅ¡u, lai nevienam lietotajam neuzstÄdÄ«t ierobežots pazÄ«mi. Izmantojiet zvaigznÄ«ti ('*'), lai uzstÄdÄ«tu visiem lietotÄjiem, kas neatbilst administratora filtram. -auths.verify_group_membership=PÄrbaudÄ«t piederÄ«bu LDAP grupai (atstÄjiet filtru tukÅ¡u, lai neizmantotu) -auths.group_search_base=Grupas pamatnosacÄ«jumi +auths.allow_deactivate_all=Ä»aut tukÅ¡am meklēšanas iznÄkumam deaktivÄ“t visus lietotÄjus +auths.use_paged_search=Izmantot meklēšanu ar lapotÄju +auths.search_page_size=Lapas lielums +auths.filter=LietotÄju atlase +auths.admin_filter=PÄrvaldÄ«tÄju atlase +auths.restricted_filter=Ierobežoto lietotÄju atlase +auths.restricted_filter_helper=AtstÄt tukÅ¡u, lai nenorÄdÄ«tu nevienu lietotÄju kÄ ierobežotu. ZvaigznÄ«te ('*') ir izmantojama, lai norÄdÄ«tu visus lietotÄjus, kas neatbilst pÄrvaldÄ«tÄju atlasei, kÄ ierobežotus. +auths.verify_group_membership=PÄrbaudÄ«t piederÄ«bu LDAP kopai (atstÄt atlasi tukÅ¡u, lai izlaistu) +auths.group_search_base=Grupas meklēšanas pamata DN auths.group_attribute_list_users=Grupas atribÅ«ts, kas satur sarakstu ar lietotÄjiem -auths.user_attribute_in_group=Grupas atribÅ«ts, kas nosaka lietotÄju -auths.map_group_to_team=SasaistÄ«t LDAP grupas ar organizÄcijas komandÄm (atstÄjiet tukÅ¡u, lai to nedarÄ«tu) +auths.user_attribute_in_group=LietotÄja atribÅ«ts, kas ir uzskaitÄ«ts grupÄ +auths.map_group_to_team=SasaistÄ«t LDAP kopas ar apvienÄ«bas komandÄm (atstÄt lauku tukÅ¡u, lai izlaistu) auths.map_group_to_team_removal=Noņemt lietotÄjus no sinhronizÄ“tajÄm komandÄm, ja lietotÄjs nav piesaistÄ«ts attiecÄ«gajai LDAP grupai auths.enable_ldap_groups=IespÄ“jot LDAP grupas auths.ms_ad_sa=MS AD meklēšanas atribÅ«ti -auths.smtp_auth=SMTP autentifikÄcijas tips +auths.smtp_auth=SMTP autentificēšanas veids auths.smtphost=SMTP resursdators auths.smtpport=SMTP ports auths.allowed_domains=Atļautie domÄ“ni -auths.allowed_domains_helper=AtstÄjiet tukÅ¡u, lai atļautu visus domÄ“nus. Lai norÄdÄ«tu vairÄkus domÄ“nus, tos var atdalÄ«t ar komatu (','). +auths.allowed_domains_helper=AtstÄt tukÅ¡u, lai atļautu visus domÄ“nus. VairÄki domÄ“ni ir atdalÄmi ar komatu (","). auths.skip_tls_verify=Izlaist TLS pÄrbaudi -auths.force_smtps=Piespiedu SMTPS izmantoÅ¡ana -auths.force_smtps_helper=SMTPS vienmÄ“r tiks izmantots, ja ports ir 465. UzstÄdiet Å¡o, ja nepiecieÅ¡ams izmantot SMTPS ar citiem portiem. (NeatzÄ«mÄ“jot tiks izmantots STARTTLS, ja serveris to atbalsta.) -auths.helo_hostname=HELO resursa nosaukums -auths.helo_hostname_helper=Resursa nosaukums, ko sÅ«tÄ«t ar HELO. AtstÄjiet tukÅ¡u, lai izmantotu servera resursa nosaukumu. +auths.force_smtps=Uzspiest SMTPS izmantoÅ¡ana +auths.force_smtps_helper=Portam 465 vienmÄ“r tiek izmantots SMTPS. IestatÄ«t Å¡o, lai piespiestu izmantot SMTPS citiem portiem. (PretÄ“jÄ gadÄ«jumÄ portiem tiks izmantots STARTTLS, ja saimniekdators to nodroÅ¡ina.) +auths.helo_hostname=HELO resursdatora nosaukums +auths.helo_hostname_helper=Saimniekdatora nosaukums, ko sÅ«tÄ«t ar HELO. AtstÄt tukÅ¡u, lai izmantotu paÅ¡reizÄ“jo saimniekdatora nosaukumu. auths.disable_helo=AtspÄ“jot HELO -auths.pam_service_name=PAM servisa nosaukums -auths.pam_email_domain=PAM e-pasta domÄ“ns (neobligÄts) -auths.oauth2_provider=OAuth2 pakalpojuma sniedzÄ“js +auths.pam_service_name=PAM pakalpojuma nosaukums +auths.pam_email_domain=PAM e-pasta domÄ“na vÄrds (izvÄ“les) +auths.oauth2_provider=OAuth2 nodroÅ¡inÄtÄjs auths.oauth2_icon_url=Ikonas URL auths.oauth2_clientID=Klienta ID (atslÄ“ga) auths.oauth2_clientSecret=Klienta noslÄ“pums auths.openIdConnectAutoDiscoveryURL=OpenID Connect automÄtiskÄs atklÄÅ¡anas URL -auths.oauth2_use_custom_url=NoklusÄ“to URL vietÄ izmantot pielÄgotos URL +auths.oauth2_use_custom_url=Izmantot pielÄgotus URL noklusÄ“juma URL vietÄ auths.oauth2_tokenURL=Pilnvaras URL -auths.oauth2_authURL=AutorizÄcijas URL +auths.oauth2_authURL=Pilnvarot URL auths.oauth2_profileURL=Profila URL auths.oauth2_emailURL=E-pasta adreses URL -auths.skip_local_two_fa=Izlaist vietÄ“jo divu faktoru autorizÄciju -auths.skip_local_two_fa_helper=AtstÄjot neatzÄ«mÄ“tu, nozÄ«mÄ“, ka lokÄlajiem lietotÄjiem, kam ir uzstÄdÄ«ta divu faktoru autorizÄcija, bÅ«s nepiecieÅ¡ams iziet tÄs pÄrbaudi, lai autorizÄ“tos +auths.skip_local_two_fa=Izlaist vietÄ“jo divupakÄpju pieteikÅ¡anos +auths.skip_local_two_fa_helper=AtstÄt neiestatÄ«tu nozÄ«mÄ“, ka vietÄ“jiem lietotÄjiem, kuriem ir iestatÄ«ta divpakÄpju pieteikÅ¡anÄs, tÄ bÅ«s jÄizmanto, lai pieteiktos auths.oauth2_tenant=Nomnieks -auths.oauth2_scopes=Papildus tvÄ“rumi +auths.oauth2_scopes=Papildu tvÄ“rumi auths.oauth2_required_claim_name=NepiecieÅ¡amÄs prasÄ«bas nosaukums -auths.oauth2_required_claim_name_helper=UzstÄdiet Å¡o nosaukumu, lai ierobežotu, kas var autorizÄ“ties, izmantojot, Å¡o avotu, ar norÄdÄ«to prasÄ«bas nosaukumu un vertÄ«bu +auths.oauth2_required_claim_name_helper=Å is nosaukums ir iestatÄms, lai ierobežotu pieteikÅ¡anos no šī avota lietotÄjiem, kuriem ir prasÄ«ba ar Å¡Ädu nosaukumu auths.oauth2_required_claim_value=NepiecieÅ¡amÄs prasÄ«bas vÄ“rtÄ«ba -auths.oauth2_required_claim_value_helper=UzstÄdiet Å¡o vÄ“rtÄ«bu, lai ierobežotu, kas var autorizÄ“ties, izmantojot, Å¡o avotu, ar norÄdÄ«to prasÄ«bas nosaukumu un vertÄ«bu -auths.oauth2_group_claim_name=PrasÄ«bas nosaukums, kas nodroÅ¡ina grupu nosaukumus Å¡im avotam. (NeobligÄts) -auths.oauth2_admin_group=Grupas prasÄ«bas vÄ“rtÄ«ba administratoriem. (NeobligÄta - nepiecieÅ¡ams prasÄ«bas nosaukums augstÄk) -auths.oauth2_restricted_group=Grupas prasÄ«bas vÄ“rtÄ«ba ierobežotajiem lietotÄjiem. (NeobligÄta - nepiecieÅ¡ams prasÄ«bas nosaukums augstÄk) -auths.oauth2_map_group_to_team=SasaistÄ«t prasÄ«bas grupas ar organizÄcijas komandÄm. (NeobligÄts - nepiecieÅ¡ams prasÄ«bas nosaukums augstÄk) -auths.oauth2_map_group_to_team_removal=Noņemt lietotÄjus no sinhronizÄ“tajÄm komandÄm, ja lietotÄjs nav piesaistÄ«ts attiecÄ«gajai grupai. +auths.oauth2_required_claim_value_helper=Å Ä« vÄ“rtÄ«ba ir iestatÄma, lai ierobežotu pieteikÅ¡anos no šī avota lietotÄjiem, kuriem ir prasÄ«ba ar Å¡Ädu nosaukumu un vÄ“rtÄ«bu +auths.oauth2_group_claim_name=PrasÄ«bas nosaukums, kas Å¡im avotam nodroÅ¡ina grupu nosaukumus. (PÄ“c izvÄ“les) +auths.oauth2_admin_group=Kopas prasÄ«bas vÄ“rtÄ«ba pÄrvaldÄ«tÄjiem. (IzvÄ“les - nepiecieÅ¡ams augstÄk esoÅ¡ais prasÄ«bas nosaukums) +auths.oauth2_restricted_group=Grupas prasÄ«bas vÄ“rtÄ«ba ierobežotajiem lietotÄjiem. (IzvÄ“les - nepiecieÅ¡ams augstÄk esoÅ¡ais prasÄ«bas nosaukums) +auths.oauth2_map_group_to_team=SasaistÄ«t pieprasÄ«tÄs kopas ar apvienÄ«bas komandÄm. (IzvÄ“les - nepiecieÅ¡ams augstÄk esoÅ¡ais prasÄ«bas nosaukums) +auths.oauth2_map_group_to_team_removal=Noņemt lietotÄjus no sinhronizÄ“tajÄm komandÄm, ja lietotÄjs nav attiecÄ«gajÄ grupai. auths.enable_auto_register=IespÄ“jot automÄtisko reÄ£istrÄciju auths.sspi_auto_create_users=AutomÄtiski izveidot lietotÄjus -auths.sspi_auto_create_users_helper=Ä»auj SSPI autentifikÄcijas metodei automÄtiski izveidot jaunus kontus lietotÄjiem, kas autorizÄ“jas pirmo reizi -auths.sspi_auto_activate_users=AutomÄtiski aktivizÄ“t lietotÄjus -auths.sspi_auto_activate_users_helper=Ä»auj SSPI autentifikÄcijas metodei automÄtiski aktivizÄ“t jaunos lietotÄjus +auths.sspi_auto_create_users_helper=Ä»auj SSPI autentificēšanÄs veidam automÄtiski izveidot jaunus kontus lietotÄjiem, kas piesakÄs pirmo reizi +auths.sspi_auto_activate_users=AutomÄtiski aktivÄ“t lietotÄjus +auths.sspi_auto_activate_users_helper=Ä»auj SSPI autentificēšanas viedam automÄtiski aktivÄ“t jaunus lietotÄjus auths.sspi_strip_domain_names=Noņemt domÄ“na vÄrdus no lietotÄju vÄrdiem auths.sspi_strip_domain_names_helper=Ja atzÄ«mÄ“ts, domÄ“na vÄrdi tiks noņemti no lietotÄja vÄrdiem, piemÄ“ram, "DOMÄ’NS\lietotÄjs" un "lietotÄjs@domÄ“ns.lv" abi kļūs par tikai "lietotÄjs". auths.sspi_separator_replacement=AtdalÄ«tÄjs, ko izmantot \, / vai @ vietÄ -auths.sspi_separator_replacement_helper=Simbols, ko izmantot, kÄ atdalÄ«tÄju, lai atdalÄ«tu lietotÄja vÄrdu no domÄ“na, piemÄ“ram "DOMÄ’NS\lietotÄjs", un lietotÄja identitÄÅ¡u nosaukumos, piemÄ“ram, lietotÄjs@domÄ“ns.lv. -auths.sspi_default_language=NoklusÄ“tÄ lietotÄja valoda -auths.sspi_default_language_helper=NoklusÄ“tÄ valoda, ko uzstÄdÄ«t automÄtiski izveidotajiem lietotÄjiem, kas izmanto SSPI autentifikÄcijas veidu. AtstÄjiet tukÅ¡u, ja vÄ“laties, lai valoda tiktu noteikta automÄtiski. +auths.sspi_separator_replacement_helper=RakstzÄ«me, ko izmantot, lai aizstÄtu atdalÄ«tÄjus zemÄka lÄ«meņa pieteikÅ¡anÄs vÄrdos (piem., "\" vÄ“rtÄ«bÄ "DOMÄ’NS\lietotÄjs") un lietotÄja identitÄÅ¡u nosaukumos (piemÄ“ram, "@" vÄ“rtÄ«bÄ "lietotajs@example.org"). +auths.sspi_default_language=LietotÄju noklusÄ“juma valoda +auths.sspi_default_language_helper=NoklusÄ“juma valoda lietotÄjiem, kurus automÄtiski izveido SSPI autentificēšanÄs veids. AtstÄt tukÅ¡u, ja ir vÄ“lams, lai valoda tiktu noteikta automÄtiski. auths.tips=Padomi -auths.tips.oauth2.general=OAuth2 autentifikÄcija -auths.tips.oauth2.general.tip=Kad tiek reÄ£istrÄ“ta jauna OAuth2 autentifikÄcija, atzvanīšanas/pÄrvirzīšanas URL vajadzÄ“tu bÅ«t: -auths.tip.oauth2_provider=OAuth2 pakalpojuma sniedzÄ“js -auths.tip.bitbucket=ReÄ£istrÄ“jiet jaunu OAuth klientu adresÄ“ %s -auths.tip.nextcloud=`ReÄ£istrÄ“jiet jaunu OAuth klientu jÅ«su instances sadÄÄ¼Ä "Settings -> Security -> OAuth 2.0 client"` -auths.tip.dropbox=Izveidojiet jaunu aplikÄciju adresÄ“ %s -auths.tip.facebook=`ReÄ£istrÄ“jiet jaunu aplikÄciju adresÄ“ %s un pievienojiet produktu "Facebook Login"` -auths.tip.github=ReÄ£istrÄ“jiet jaunu aplikÄciju adresÄ“ %s +auths.tips.oauth2.general=OAuth2 autentificēšanÄs +auths.tips.oauth2.general.tip=Kad tiek reÄ£istrÄ“ta jauna OAuth2 autentificēšana, atzvanīšanas/pÄrvirzīšanas URL vajadzÄ“tu bÅ«t: +auths.tip.oauth2_provider=OAuth2 nodroÅ¡inÄtÄjs +auths.tip.bitbucket=JÄizveido jauns OAuth patÄ“rÄ“tÄjs %s un jÄpievieno atļauja "Account" - "Read" +auths.tip.nextcloud=ReÄ£istrÄ“t jaunu OAuth patÄ“rÄ“tÄju savÄ serverÄ« var izvÄ“lnÄ“ "IestatÄ«jumi -> Drošība -> OAuth 2.0 klients" +auths.tip.dropbox=JÄizveido jauna lietotne %s +auths.tip.facebook=JÄizveido jauna lietotne %s un jÄpievieno produkts "Facebook Login" +auths.tip.github=JÄizveido jauna OAuth lietotne %s auths.tip.gitlab=ReÄ£istrÄ“jiet jaunu aplikÄciju adresÄ“ https://gitlab.com/profile/applications -auths.tip.google_plus=IegÅ«stiet OAuth2 klienta pilnvaru no Google API konsoles adresÄ“ %s -auths.tip.openid_connect=Izmantojiet OpenID pieslÄ“gÅ¡anÄs atklÄÅ¡anas URL (/.well-known/openid-configuration), lai norÄdÄ«tu galapunktus -auths.tip.twitter=Dodieties uz adresi %s, izveidojiet lietotni un pÄrliecinieties, ka ir atzÄ«mÄ“ts “Allow this application to be used to Sign in with Twitter†-auths.tip.discord=ReÄ£istrÄ“jiet jaunu aplikÄciju adresÄ“ %s -auths.tip.gitea=Pievienot jaunu OAuth2 lietojumprogrammu. DokumentÄcija ir pieejama %s -auths.tip.yandex=`Izveidojiet jaunu lietotni adresÄ“ %s. IzvÄ“lieties sekojoÅ¡as tiesÄ«bas "Yandex.Passport API" sadaļÄ: "Access to email address", "Access to user avatar" un "Access to username, first name and surname, gender"` -auths.tip.mastodon=NorÄdiet pielÄgotu mastodon instances URL, ar kuru vÄ“laties autorizÄ“ties (vai izmantojiet noklusÄ“to) -auths.edit=Labot autentifikÄcijas avotu -auths.activated=AutentifikÄcijas avots ir atkivizÄ“ts -auths.new_success=Jauna autentifikÄcija "%s" tika pievienota. -auths.update_success=AutentifikÄcijas avots tika atjaunots. -auths.update=Atjaunot autentifikÄcijas avotu -auths.delete=DzÄ“st autentifikÄcijas avotu -auths.delete_auth_title=DzÄ“st autentifikÄcijas avotu -auths.delete_auth_desc=Izdzēšot autentifikÄcijas avotu, tÄ lietotÄjiem nebÅ«s iespÄ“jams pieteikties. Vai turpinÄt? +auths.tip.google_plus=OAuth2 klienta piekļuves dati ir iegÅ«stami Google API konsolÄ“ %s +auths.tip.openid_connect=JÄizmanto OpenID savienoÅ¡anÄs atklÄÅ¡anas URL (/.well-known/openid-configuration), lai norÄdÄ«tu galapunktus +auths.tip.twitter=JÄdodas uz %s, jÄizveido lietotne un jÄnodroÅ¡ina, ka iespÄ“ja "Allow this application to be used to Sign in with Twitter" ir iespÄ“jota +auths.tip.discord=JÄizveido jauna lietotne %s +auths.tip.gitea=Pievienot jaunu OAuth2 lietotni. NorÄdes ir atrodamas %s +auths.tip.yandex=%s jÄizveido jauna lietotne. SadaÄ¼Ä "Yandex.Passport API" jÄatlasa šīs atļaujas: "Access to email address", "Access to user avatar" un "Access to username, first name and surname, gender" +auths.tip.mastodon=JÄievada pielÄgota Mastodon servera URL, ar kuru ir vÄ“lēšanÄs autentificÄ“ties (vai jÄizmanto noklusÄ“juma) +auths.edit=Labot autentificēšanas avotu +auths.activated=Å is autentificēšanas avots ir atkivÄ“ts +auths.new_success=AutentificēšanÄs "%s" tika pievienota. +auths.update_success=AutentificēšanÄs avots tika atjauninÄts. +auths.update=AtjauninÄt autentificēšanÄs avotu +auths.delete=IzdzÄ“st autentificēšanas avotu +auths.delete_auth_title=IzdzÄ“st autentificēšanas avotu +auths.delete_auth_desc=AutentificēšanÄs avota izdzēšana liedz lietotÄjiem to izmantot, lai pieteiktos. TurpinÄt? auths.still_in_used=Å o autentificēšanÄs avotu joprojÄm izmanto viens vai vairÄki lietotÄji, tos nepiecieÅ¡ams izdzÄ“st vai pÄrvietot uz citu autentificēšanÄs avotu. -auths.deletion_success=AutentifikÄcijas avots tika atjaunots. -auths.login_source_exist=AutentifikÄcijas avots ar nosaukumu "%s" jau eksistÄ“. -auths.login_source_of_type_exist=AutentifikÄcijas avots ar Å¡Ädu veidu jau eksistÄ“. -auths.unable_to_initialize_openid=NevarÄ“ja inicializÄ“t OpenID Connect sliedzÄ“ju: %s -auths.invalid_openIdConnectAutoDiscoveryURL=Kļūdains automÄtiskÄs atklÄÅ¡anas URL (jÄbÅ«t korektam URL, kas sÄkas ar http:// vai https://) +auths.deletion_success=AutentificēšanÄs avots tika izdzÄ“sts. +auths.login_source_exist=Jau pastÄv autentificēšanÄs avots "%s". +auths.login_source_of_type_exist=Jau pastÄv Å¡Äda veida autentificēšanÄs avots. +auths.unable_to_initialize_openid=NevarÄ“ja sÄknÄ“t OpenID Connect sniedzÄ“ju: %s +auths.invalid_openIdConnectAutoDiscoveryURL=NederÄ«gs automÄtiskÄs atklÄÅ¡anas URL (tam jÄbÅ«t derÄ«gam URL, kas sÄkas ar http:// vai https://) config.server_config=Servera konfigurÄcija -config.app_name=Vietnes nosaukums +config.app_name=Servera nosaukums config.app_ver=Forgejo versija -config.app_url=Forgejo pamata URL -config.custom_conf=KonfigurÄcijas faila ceļš -config.custom_file_root_path=PielÄgoto failu pamata ceļš -config.domain=Servera domÄ“ns +config.app_url=Pamata URL +config.custom_conf=KonfigurÄcijas datnes ceļš +config.custom_file_root_path=PielÄgoto datņu pamata ceļš +config.domain=Servera domÄ“na vÄrds config.offline_mode=Bezsaistes režīms -config.disable_router_log=AtspÄ“jot marÅ¡rutÄ“tÄja žurnalizēšanu -config.run_user=Izpildes lietotÄjs -config.run_mode=Izpildes režīms +config.disable_router_log=AtspÄ“jot marÅ¡rutÄ“tÄja žurnÄlu +config.run_user=LietotÄjs, ar kuru palaist +config.run_mode=PalaiÅ¡anas veids config.git_version=Git versija config.app_data_path=Lietotnes datu ceļš -config.repo_root_path=Repozitoriju glabÄÅ¡anas vieta -config.lfs_root_path=LFS saknes ceļš -config.log_file_root_path=Žurnalizēšanas ceļš +config.repo_root_path=GlabÄtavu atraÅ¡anÄs vieta +config.lfs_root_path=LFS pamatmapes ceļš +config.log_file_root_path=ŽurnÄlu atraÅ¡anÄs vieta config.script_type=Skripta veids -config.reverse_auth_user=ReversÄ lietotÄja autentifikÄcija +config.reverse_auth_user=ApvÄ“rstÄ starpniekservera autentificēšanÄs lietotÄjs config.ssh_config=SSH konfigurÄcija config.ssh_enabled=IespÄ“jots config.ssh_start_builtin_server=Izmantot iebÅ«vÄ“to serveri -config.ssh_domain=SSH servera domÄ“ns +config.ssh_domain=SSH servera domÄ“na vÄrds config.ssh_port=Ports config.ssh_listen_port=KlausīšanÄs ports -config.ssh_root_path=Saknes ceļš +config.ssh_root_path=AtraÅ¡anÄs vieta config.ssh_key_test_path=AtslÄ“gu pÄrbaudes ceļš -config.ssh_keygen_path=Keygen ('ssh-keygen') ceļš -config.ssh_minimum_key_size_check=MinimÄlÄ atslÄ“gas lieluma pÄrbaude -config.ssh_minimum_key_sizes=MinimÄlais atslÄ“gas lielums +config.ssh_keygen_path=Keygen ("ssh-keygen") atraÅ¡anÄs vieta +config.ssh_minimum_key_size_check=MazÄkÄ pieļaujamÄ atslÄ“gas lieluma pÄrbaude +config.ssh_minimum_key_sizes=MazÄkie pieļaujamie atslÄ“gu lielumi config.lfs_config=LFS konfigurÄcija config.lfs_enabled=IespÄ“jots -config.lfs_content_path=LFS satura ceļš -config.lfs_http_auth_expiry=LFS HTTP autorizÄcijas beigÅ¡anÄs +config.lfs_content_path=LFS satura atraÅ¡anÄs vieta +config.lfs_http_auth_expiry=LFS HTTP pilnvaroÅ¡anas derÄ«guma laiks -config.db_config=Datu bÄzes konfigurÄcija +config.db_config=DatubÄzes konfigurÄcija config.db_type=Veids config.db_host=Resursdators config.db_name=Nosaukums @@ -3083,29 +3430,29 @@ config.db_ssl_mode=SSL config.db_path=Ceļš config.service_config=Pakalpojuma konfigurÄcija -config.register_email_confirm=ReÄ£istrÄ“joties pieprasÄ«t apstiprinÄt e-pasta adresi -config.disable_register=AtspÄ“jot lietotÄju reÄ£istrÄciju -config.allow_only_internal_registration=Atļaut reÄ£istrÄciju tikai no Forgejo -config.allow_only_external_registration=Atļaut reÄ£istrÄ“ties tikai ar ÄrÄ“jiem servisiem -config.enable_openid_signup=IespÄ“jot reÄ£istrÄciju, izmantojot OpenID +config.register_email_confirm=PieprasÄ«t e-pasta adreses apstiprinÄÅ¡anu, lai reÄ£istrÄ“tos +config.disable_register=AtspÄ“jot paÅ¡reÄ£istrēšanos +config.allow_only_internal_registration=Atļaut reÄ£istrēšanos tikai Forgejo +config.allow_only_external_registration=Atļaut reÄ£istrēšanos tikai caur ÄrÄ“jiem pakalpojumiem +config.enable_openid_signup=IespÄ“jot paÅ¡reÄ£istrēšanos ar OpenID config.enable_openid_signin=IespÄ“jot pieteikÅ¡anos ar OpenID config.show_registration_button=RÄdÄ«t reÄ£istrēšanÄs pogu -config.require_sign_in_view=PieprasÄ«t pieteikÅ¡anos, lai aplÅ«kotu lapas +config.require_sign_in_view=PieprasÄ«t pieteikÅ¡anos, lai apskatÄ«tu saturu config.mail_notify=IespÄ“jot e-pasta paziņojumus config.enable_captcha=IespÄ“jot drošības kodu -config.active_code_lives=AktÄ«vÄ koda ilgums -config.reset_password_code_lives=Konta atjaunoÅ¡anas koda beigÅ¡anÄs laiks +config.active_code_lives=Aktivēšanas koda derÄ«guma laiks +config.reset_password_code_lives=Atkopes koda derÄ«guma laiks config.default_keep_email_private=PÄ“c noklusÄ“juma slÄ“pt e-pasta adreses -config.default_allow_create_organization=PÄ“c noklusÄ“juma ļaut veidot organizÄcijas +config.default_allow_create_organization=PÄ“c noklusÄ“juma ļaut apvienÄ«bu izveidoÅ¡anu config.enable_timetracking=IespÄ“jot laika uzskaiti config.default_enable_timetracking=PÄ“c noklusÄ“juma iespÄ“jot laika uzskaiti -config.default_allow_only_contributors_to_track_time=Atļaut tikai dalÄ«bniekiem uzskaitÄ«t laiku -config.no_reply_address=NeatbildÄ“t e-pasta adreses domÄ“ns -config.default_visibility_organization=NoklusÄ“tÄ redzamÄ«ba jaunÄm organizÄcijÄm -config.default_enable_dependencies=PÄ“c noklusÄ“juma iespÄ“jot problÄ“mu atkarÄ«bas +config.default_allow_only_contributors_to_track_time=Atļaut uzskaitÄ«t laiku tikai lÄ«dzdalÄ«bniekiem +config.no_reply_address=SlÄ“pjamo e-pasta adreÅ¡u domÄ“na vÄrds +config.default_visibility_organization=NoklusÄ“juma redzamÄ«ba jaunÄm apvienÄ«bÄm +config.default_enable_dependencies=PÄ“c noklusÄ“juma iespÄ“jot pieteikumu atkarÄ«bas -config.webhook_config=TÄ«kla ÄÄ·u konfigurÄcija -config.queue_length=Rindas garums +config.webhook_config=TÄ«mekļa aizÄ·eru konfigurÄcija +config.queue_length=Rindsaraksta garums config.deliver_timeout=PiegÄdes noildze config.skip_tls_verify=Izlaist TLS pÄrbaudi @@ -3114,59 +3461,59 @@ config.mailer_enabled=IespÄ“jota config.mailer_enable_helo=IespÄ“jot HELO config.mailer_name=Nosaukums config.mailer_protocol=Protokols -config.mailer_smtp_addr=SMTP adrese +config.mailer_smtp_addr=SMTP saimniekdators config.mailer_smtp_port=SMTP ports config.mailer_user=LietotÄjs config.mailer_use_sendmail=Izmantot Sendmail -config.mailer_sendmail_path=Ceļš lÄ«dz sendmail programmai -config.mailer_sendmail_args=Papildus Sendmail komandrindas argumenti +config.mailer_sendmail_path=Sendmail ceļš +config.mailer_sendmail_args=Papildu Sendmail argumenti config.mailer_sendmail_timeout=Sendmail noildze config.mailer_use_dummy=TukÅ¡s config.test_email_placeholder=E-pasts (piemÄ“ram, test@example.com) -config.send_test_mail=NosÅ«tÄ«t pÄrbaudes e-pastu +config.send_test_mail=NosÅ«tÄ«t pÄrbaudes e-pasta ziņojumu config.send_test_mail_submit=SÅ«tÄ«t -config.test_mail_failed=NeizdevÄs nosÅ«tÄ«t pÄrbaudes e-pastu uz "%s": %v -config.test_mail_sent=PÄrbaudes e-pasts tika nosÅ«tÄ«ts uz "%s". +config.test_mail_failed=NeizdevÄs nosÅ«tÄ«t pÄrbaudes e-pasta ziņojumu uz "%s": %v +config.test_mail_sent=PÄrbaudes e-pasta ziņojums tika nosÅ«tÄ«ts uz "%s". config.oauth_config=OAuth konfigurÄcija config.oauth_enabled=IespÄ“jots config.cache_config=KeÅ¡atmiņas konfigurÄcija config.cache_adapter=KeÅ¡atmiņas adapteris -config.cache_interval=KeÅ¡atmiņas intervÄls -config.cache_conn=KeÅ¡atmiņas pieslÄ“guma parametri +config.cache_interval=KeÅ¡atmiņas starplaiks +config.cache_conn=KeÅ¡atmiņas savienojums config.cache_item_ttl=KeÅ¡atmiņas vienuma TTL config.session_config=Sesijas konfigurÄcja config.session_provider=Sesijas nodroÅ¡inÄtÄjs -config.provider_config=Pakalpojumu sniedzÄ“ja konfigurÄcija +config.provider_config=NodroÅ¡inÄtÄja konfigurÄcija config.cookie_name=SÄ«kdatnes nosaukums -config.gc_interval_time=GC laika intervÄls +config.gc_interval_time=GC starplaiks config.session_life_time=Sesijas ilgums config.https_only=Tikai HTTPS config.cookie_life_time=SÄ«kdatņu glabÄÅ¡anas ilgums -config.picture_config=AttÄ“lu un profila bilžu konfigurÄcija -config.picture_service=LokÄli attÄ“li +config.picture_config=AttÄ“lu un profila attÄ“lu konfigurÄcija +config.picture_service=AttÄ“lu pakalpojums config.disable_gravatar=AtspÄ“jot Gravatar -config.enable_federated_avatar=IespÄ“jot apvienotÄs profila bildes +config.enable_federated_avatar=IespÄ“jot vienotos profila attÄ“lus config.git_config=Git konfigurÄcija config.git_disable_diff_highlight=AtspÄ“jot salÄ«dzinÄÅ¡anas sintakses iekrÄsoÅ¡anu -config.git_max_diff_lines=MaksimÄlais salÄ«dzinÄmo rindu skaits vienam failam -config.git_max_diff_line_characters=MaksimÄlais salÄ«dzinÄmo simbolu skaits vienai rindai -config.git_max_diff_files=MaksimÄlais salÄ«dzinÄmo failu skaits, ko attÄ“lot +config.git_max_diff_lines=LielÄkais salÄ«dzinÄmo rindu skaits datnÄ“ +config.git_max_diff_line_characters=LielÄkais rindas salÄ«dzinÄmo rakstzÄ«mju skaits +config.git_max_diff_files=LielÄkais parÄdÄmo salÄ«dzinÄmo datņu skaits config.git_gc_args=GC argumenti -config.git_migrate_timeout=MigrÄcijas noilgums -config.git_mirror_timeout=Spoguļa atjaunoÅ¡anas noilgums -config.git_clone_timeout=Klonēšanas darbÄ«bas noilgums -config.git_pull_timeout=Izmaiņu saņemÅ¡anas darbÄ«bas noilgums -config.git_gc_timeout=GC darbÄ«bas noilgums +config.git_migrate_timeout=PÄrcelÅ¡anas noildze +config.git_mirror_timeout=SpoguļglabÄtavas atjauninÄÅ¡anas noildze +config.git_clone_timeout=Klonēšanas darbÄ«bas noildze +config.git_pull_timeout=AtgÄdÄÅ¡anas darbÄ«bas noildze +config.git_gc_timeout=GC darbÄ«bas noildze -config.log_config=Žurnalizēšanas konfigurÄcija +config.log_config=ŽurnÄla konfigurÄcija config.logger_name_fmt=ŽurnalizÄ“tÄjs: %s config.disabled_logger=AtspÄ“jots -config.access_log_mode=Piekļuves žurnalizēšanas veids +config.access_log_mode=Piekļuves žurnalēšanas veids config.access_log_template=Piekļuves žurnÄla sagatave config.xorm_log_sql=SQL žurnalizēšana @@ -3174,94 +3521,123 @@ config.set_setting_failed=`NeizdevÄs uzstÄdÄ«t iestatÄ«jumu "%s"` monitor.stats=Statistika -monitor.cron=Cron uzdevumi +monitor.cron=AtkÄrtojamie uzdevumi monitor.name=Nosaukums monitor.schedule=Grafiks -monitor.next=NÄkoÅ¡Äs izpildes laiks +monitor.next=NÄkamÄ reize monitor.previous=PÄ“dÄ“jÄs izpildes laiks monitor.execute_times=Izpildes monitor.process=DarbojoÅ¡ies procesi -monitor.stacktrace=Steka izsekojamÄ«ba +monitor.stacktrace=Steka trasÄ“jums monitor.processes_count=%d procesi monitor.download_diagnosis_report=LejupielÄdÄ“t diagnostikas atskaiti monitor.desc=Apraksts monitor.start=SÄkuma laiks monitor.execute_time=Izpildes laiks -monitor.last_execution_result=RezultÄts +monitor.last_execution_result=IznÄkums monitor.process.cancel=Atcelt procesu monitor.process.cancel_desc=Procesa atcelÅ¡ana var radÄ«t datu zaudÄ“jumus monitor.process.cancel_notices=Atcelt: %s? monitor.process.children=ApakÅ¡procesi -monitor.queues=Rindas -monitor.queue=Rinda: %s +monitor.queues=Rindsaraksti +monitor.queue=Rindsaraksts: %s monitor.queue.name=Nosaukums monitor.queue.type=Veids monitor.queue.exemplar=EksemplÄra veids monitor.queue.numberworkers=StrÄdņu skaits monitor.queue.activeworkers=DarbojoÅ¡ies strÄdņi -monitor.queue.maxnumberworkers=MaksimÄlais strÄdņu skaits -monitor.queue.numberinqueue=Skaits rindÄ +monitor.queue.maxnumberworkers=LielÄkais pieļaujamais strÄdņu skaits +monitor.queue.numberinqueue=Skaits rindsarakstÄ monitor.queue.review_add=PÄrskatÄ«t/pievienot strÄdņus monitor.queue.settings.title=PÅ«la iestatÄ«jumi -monitor.queue.settings.desc=PÅ«ls dinamiski tiek palielinÄts atkarÄ«bÄ no bloÄ·Ä“tiem darbiem rindÄ. +monitor.queue.settings.desc=PÅ«li dinamiski palielinÄs atkarÄ«bÄ no to strÄdņu rindu aizturēšanas. monitor.queue.settings.maxnumberworkers=MaksimÄlais strÄdņu skaits monitor.queue.settings.maxnumberworkers.placeholder=PaÅ¡alaik %[1]d -monitor.queue.settings.maxnumberworkers.error=MaksimÄlajam strÄdņu skaitam ir jÄbÅ«t skaitlim -monitor.queue.settings.submit=SaglabÄt iestatÄ«jumus -monitor.queue.settings.changed=IestatÄ«jumi saglabÄti +monitor.queue.settings.maxnumberworkers.error=LielÄkajam pieļaujamajam strÄdņu skaitam ir jÄbÅ«t skaitlim +monitor.queue.settings.submit=AtjauninÄt iestatÄ«jumus +monitor.queue.settings.changed=IestatÄ«jumi atjauninÄti monitor.queue.settings.remove_all_items=Noņemt visus -monitor.queue.settings.remove_all_items_done=Visi ieraksti rindÄ tika noņemti. +monitor.queue.settings.remove_all_items_done=Visi rindsaraksta vienumi tika noņemti. notices.system_notice_list=SistÄ“mas paziņojumi -notices.view_detail_header=SkatÄ«t paziņojuma detaļas +notices.view_detail_header=ApskatÄ«t paziņojuma informÄciju notices.operations=DarbÄ«bas -notices.select_all=IezÄ«mÄ“t visu -notices.deselect_all=Atcelt visa iezÄ«mēšanu -notices.inverse_selection=ApgriezeniskÄ iezÄ«mēšana -notices.delete_selected=DzÄ“st iezÄ«mÄ“to -notices.delete_all=DzÄ“st visus paziņojumus +notices.select_all=AtlasÄ«t visus +notices.deselect_all=Atcelt visa atlasīšanu +notices.inverse_selection=ApvÄ“rst atlasÄ«to +notices.delete_selected=IzdzÄ“st atlasÄ«tos +notices.delete_all=IzdzÄ“st visus paziņojumus notices.type=Veids -notices.type_1=Repozitorijs +notices.type_1=GlabÄtava notices.type_2=Uzdevums notices.desc=Apraksts notices.op=Op. -notices.delete_success=SistÄ“mas paziņojumi ir dzÄ“sti. +notices.delete_success=SistÄ“mas paziņojumi tika dzÄ“sti. -self_check.no_problem_found=PaÅ¡laik nav atrasta neviena problÄ“ma. +self_check.no_problem_found=VÄ“l nav atrasts neviens sarežģījums. +config_summary = Kopsavilkums +config_settings = IestatÄ«jumi +config.cache_test_slow = KeÅ¡atmiņas pÄrbaude sekmÄ«ga, bet atbilde ir lÄ“na: %s. +config.cache_test_succeeded = KeÅ¡atmiņas pÄrbaude sekmÄ«ga, atbilde tika saņemta pÄ“c %s. +self_check.database_collation_case_insensitive = DatubÄzÄ“ tiek izmantota salÄ«dzinÄÅ¡ana %s, kas ir nejutÄ«ga salÄ«dzinÄÅ¡ana. Lai gan Forgejo var ar to darboties, var gadÄ«ties reti gadÄ«jumi, kuros viss varÄ“tu nenotikt kÄ paredzÄ“ts. +self_check.database_inconsistent_collation_columns = DatubÄzÄ“ tiek izmantota salÄ«dzinÄÅ¡ana %s, bet Å¡ajÄs ailÄ“s tiek izmantotas neatbilstoÅ¡as salÄ«dzinÄÅ¡anas. Tas var radÄ«t neparedzÄ“tus sarežģījumus. +auths.tip.gitlab_new = Jauna lietotne ir reÄ£istrÄ“jama %s +config.cache_test = PÄrbaudÄ«t keÅ¡atmiņu +config.cache_test_failed = NeizdevÄs iegÅ«t keÅ¡atmiņas paraugu: %v. +config.open_with_editor_app_help = "AtvÄ“rt ar" redaktori klonēšanas izvÄ“lnei. Ja ir atstÄts tukÅ¡s, tiks izmantots noklusÄ“jums. IzvÄ“rst, lai redzÄ“tu noklusÄ“jumu. +self_check.database_collation_mismatch = SagaidÄ«t, ka datubÄzÄ“ tiek izmantota salÄ«dzinÄÅ¡ana: %s +self_check.database_fix_mysql = MySQL/MariaDB lietotÄji var izmantot komandu "forgejo doctor convert", lai novÄ“rstu salÄ«dzinÄÅ¡anas sarežģījumus, vai arÄ« tos var paÅ¡rocÄ«gi novÄ“rst ar "ALTER ... COLLATE ..." vaicÄjumiem. +config.app_slogan = Servera sauklis +config.allow_dots_in_usernames = Ä»aut lietotÄjiem izmantot punktus savÄ lietotÄjvÄrdÄ. NeietekmÄ“ esoÅ¡os kontus. +users.restricted.description = Ä»aut mijiedarbÄ«bu tikai ar glabÄtavÄm un apvienÄ«bÄm, kurÄs Å¡is lietotÄjs ir pievienots kÄ lÄ«dzdalÄ«bnieks. Tas neļauj piekļūt šī servera atklÄtajÄm glabÄtavÄm. +dashboard.sync_tag.started = UzsÄkta birku sinhronizēšana +users.organization_creation.description = Ä»aut jaunu apvienÄ«bu izveidoÅ¡anu. +users.block.description = Liegt šī lietotÄja mijiedarbÄ«bu ar Å¡o serveri caur tÄ kontu un neļaut pieteikÅ¡anos. +users.admin.description = NodroÅ¡inÄt Å¡im lietotÄjam pilnu piekļuvi visÄm pÄrvaldīšanas iespÄ“jÄm ar tÄ«mekļa saskarni un API. +users.local_import.description = Ä»aut glabÄtavu ievietoÅ¡anu no servera vietÄ“jÄs datņu sistÄ“mas. TÄ var bÅ«t drošības nepilnÄ«ba. +emails.delete = IzdzÄ“st e-pasta adresi +emails.delete_desc = Vai tieÅ¡Äm izdzÄ“st Å¡o e-pasta adresi? +emails.deletion_success = E-pasta adrese tika izdzÄ“sta. +emails.delete_primary_email_error = Nevar izdzÄ“st galveno e-pasta adresi. +auths.tips.gmail_settings = Gmail iestatÄ«jumi: +users.activated.description = E-pasta adreses apliecinÄÅ¡anas pabeigÅ¡ana. NeaktivÄ“ta konta Ä«paÅ¡nieks nevarÄ“s pieteikties, kamÄ“r e-pasta adreses apliecinÄÅ¡ana nebÅ«s pabeigta. +auths.default_domain_name = NoklusÄ“juma domÄ“na vÄrds, kas tiek izmantots e-pasta adresÄ“s +dashboard.sync_repo_tags = DatubÄzÄ“ sinhronizÄ“t birkas no Git datiem +monitor.duration = Ilgums (s) [action] -create_repo=izveidoja repozitoriju %s -rename_repo=pÄrsauca repozitoriju no %[1]s uz %[3]s -commit_repo=iesÅ«tÄ«ja izmaiņas %[3]s repozitorijÄ %[4]s -create_issue=`atvÄ“ra problÄ“mu %[3]s#%[2]s` -close_issue=`aizvÄ“ra problÄ“mu %[3]s#%[2]s` -reopen_issue=`atkÄrtoti atvÄ“ra problÄ“mu %[3]s#%[2]s` +create_repo=izveidoja glabÄtavu %s +rename_repo=pÄrdÄ“vÄ“ja glabÄtavu %[1]s par %[3]s +commit_repo=aizgÄdÄja izmaiņas uz %[3]s glabÄtavÄ %[4]s +create_issue=`atvÄ“ra pieteikumu %[3]s#%[2]s` +close_issue=`aizvÄ“ra pieteikumu %[3]s#%[2]s` +reopen_issue=`atkÄrtoti atvÄ“ra pieteikumu %[3]s#%[2]s` create_pull_request=`izveidoja izmaiņu pieprasÄ«jumu %[3]s#%[2]s` close_pull_request=`aizvÄ“ra izmaiņu pieprasÄ«jumu %[3]s#%[2]s` reopen_pull_request=`atkÄrtoti atvÄ“ra izmaiņu pieprasÄ«jumu %[3]s#%[2]s` -comment_issue=`pievienoja komentÄru problÄ“mai %[3]s#%[2]s` -comment_pull=`pievienoja komentÄru izmaiņu pieprasÄ«jumam %[3]s#%[2]s` -merge_pull_request=`sapludinÄja izmaiņu pieprasÄ«jumu %[3]s#%[2]s` -auto_merge_pull_request=`automÄtiski sapludinÄja izmaiņu pieprasÄ«jumu %[3]s#%[2]s` -transfer_repo=mainÄ«ja repozitorija %s Ä«paÅ¡nieku uz %s -push_tag=iesÅ«tÄ«ja tagu %[3]s repozitorijÄ %[4]s -delete_tag=izdzÄ“sa tagu %[2]s no %[3]s -delete_branch=izdzÄ“sa atzaru %[2]s no %[3]s +comment_issue=`pievienoja piebildi pieteikumam %[3]s#%[2]s` +comment_pull=`pievienoja piebildi izmaiņu pieprasÄ«jumam %[3]s#%[2]s` +merge_pull_request=`iekļÄva izmaiņu pieprasÄ«jumu %[3]s#%[2]s` +auto_merge_pull_request=`automÄtiski iekļÄva izmaiņu pieprasÄ«jumu %[3]s#%[2]s` +transfer_repo=glabÄtavu %s nodeva %s +push_tag=aizgÄdÄja birku %[3]s uz %[4]s +delete_tag=izdzÄ“sa birku %[2]s no %[3]s +delete_branch=izdzÄ“sa zaru %[2]s no %[3]s compare_branch=SalÄ«dzinÄt -compare_commits=SalÄ«dzinÄt %d revÄ«zijas -compare_commits_general=SalÄ«dzinÄt revÄ«zijas -mirror_sync_push=ar spoguli sinhronizÄ“tas revÄ«zijas %[3]s uz repozitoriju %[4]s -mirror_sync_create=ar spoguli sinhronizÄ“ta jauna atsauce %[3]s uz repozitoriju %[4]s -mirror_sync_delete=ar spoguli sinhronizÄ“ta un izdzÄ“sta atsauce %[2]s repozitorijam %[3]s -approve_pull_request=`apstiprinÄja izmaiņu pieprasÄ«jumu %[3]s#%[2]s` +compare_commits=SalÄ«dzinÄt %d iesÅ«tÄ«jumus +compare_commits_general=SalÄ«dzinÄt iesÅ«tÄ«jumus +mirror_sync_push=sinhronizÄ“ja iesÅ«tÄ«jumus uz %[3]s %[4]s no spoguļglabÄtavas +mirror_sync_create=sinhronizÄ“ja jaunu atsauci %[3]s uz %[4]s no spoguļglabÄtavas +mirror_sync_delete=sinhronizÄ“ja un izdzÄ“sa atsauci %[2]s %[3]s no spoguļglabÄtavas +approve_pull_request=`apstiprinÄja %[3]s#%[2]s` reject_pull_request=`ieteica izmaiņas izmaiņu pieprasÄ«jumam %[3]s#%[2]s` -publish_release=`izveidoja versiju "%[4]s" repozitorijÄ %[3]s` -review_dismissed=`noraidÄ«ja lietotÄja %[4]s recenziju izmaiņu pieprasÄ«jumam %[3]s#%[2]s` +publish_release=`izdeva laidienu %[4]s %[3]s` +review_dismissed=`atmeta izskatīšanu no %[4]s %[3]s#%[2]s` review_dismissed_reason=Iemesls: -create_branch=izveidoja atzaru %[3]s repozitorijÄ %[4]s +create_branch=izveidoja zaru %[3]s glabÄtavÄ %[4]s starred_repo=pievienoja izlasÄ“ %[2]s -watched_repo=sÄka sekot %[2]s +watched_repo=sÄka vÄ“rot %[2]s [tool] now=tagad @@ -3275,7 +3651,7 @@ future=nÄkotnÄ“ 1y=1 gada seconds=%d sekundÄ“m minutes=%d minÅ«tÄ“m -hours=%d stundÄm +hours=%d stundÄs days=%d dienas weeks=%d nedēļÄm months=%d mÄ“neÅ¡iem @@ -3284,226 +3660,254 @@ raw_seconds=sekundes raw_minutes=minÅ«tes [dropzone] -default_message=Ievelciet failus vai nospiediet Å¡eit, lai augÅ¡upielÄdÄ“tu. -invalid_input_type=Å Ädus failus nav iespÄ“jams augÅ¡upielÄdÄ“t. -file_too_big=Faila izmÄ“rs ({{filesize}} MB) pÄrsniedz maksimÄli atļauto izmÄ“ru ({{maxFilesize}} MB). -remove_file=Noņemt failu +default_message=Ievilkt datnes vai klikšķinÄt Å¡eit, lai augÅ¡upielÄdÄ“tu. +invalid_input_type=Å Ä« veida datnes nevar augÅ¡upielÄdÄ“t. +file_too_big=Datnes izmÄ“rs ({{filesize}} MB) pÄrsniedz pieļaujamo izmÄ“ru ({{maxFilesize}} MB). +remove_file=Noņemt datni [notification] notifications=Paziņojumi unread=NeizlasÄ«tie read=IzlasÄ«tie -no_unread=Nav nelasÄ«tu paziņojumu. +no_unread=Nav neizlasÄ«tu paziņojumu. no_read=Nav izlasÄ«tu paziņojumu. pin=Piespraust paziņojumu mark_as_read=AtzÄ«mÄ“t kÄ izlasÄ«tu -mark_as_unread=AtzÄ«mÄ“t kÄ nelasÄ«tu +mark_as_unread=AtzÄ«mÄ“t kÄ neizlasÄ«tu mark_all_as_read=AtzÄ«mÄ“t visus kÄ izlasÄ«tus subscriptions=Abonementi watching=SkatÄs no_subscriptions=Nav abonementu [gpg] -default_key=ParakstÄ«ts ar noklusÄ“to atslÄ“gu +default_key=ParakstÄ«ts ar noklusÄ“juma atslÄ“gu error.extract_sign=NeizdevÄs izgÅ«t parakstu -error.generate_hash=NeizdevÄs uzÄ£enerÄ“t revÄ«zijas jaucÄ“jkodu -error.no_committer_account=RevÄ«zijas autora e-pasta adrese nav piesaistÄ«ta nevienam kontam -error.no_gpg_keys_found=Å im parakstam datu bÄzÄ“ netika atrasta zinÄma atslÄ“ga -error.not_signed_commit=Nav parakstÄ«ta revÄ«zija -error.failed_retrieval_gpg_keys=NeizdevÄs saņemt nevienu atslÄ“gu, kas ir piesaistÄ«ta revÄ«zijas autora kontam -error.probable_bad_signature=BRĪDINÄ€JUMS! Lai arÄ« datu bÄzÄ“ eksistÄ“ atslÄ“ga ar Å¡Ädu identifikatoru, nav iespÄ“jams verificÄ“t Å¡o revÄ«ziju! Å Ä« revÄ«zija ir ļoti AIZDOMĪGA. -error.probable_bad_default_signature=BRĪDINÄ€JUMS! Lai arÄ« Å¡ai atslÄ“gai ir noklusÄ“tÄs atslÄ“gas identifikators, ar to nav iespÄ“jams verificÄ“t Å¡o revÄ«ziju! Å Ä« revÄ«zija ir ļoti AIZDOMĪGA. +error.generate_hash=NeizdevÄs izveidot iesÅ«tÄ«juma jaucÄ“jkodu +error.no_committer_account=IesÅ«tÄ«tÄja e-pasta adrese nav piesaistÄ«ta nevienam kontam +error.no_gpg_keys_found=Å im parakstam datubÄzÄ“ netika atrasta zinÄma atslÄ“ga +error.not_signed_commit=Nav parakstÄ«ts iesÅ«tÄ«jums +error.failed_retrieval_gpg_keys=NeizdevÄs iegÅ«t nevienu iesÅ«tÄ«tÄja kontam piesaistÄ«tu atslÄ“gu +error.probable_bad_signature=UZMANĪBU! Lai arÄ« datubÄzÄ“ ir atslÄ“ga ar Å¡Ädu identifikatoru, tÄ neapliecina Å¡o iesÅ«tÄ«jumu. Å is iesÅ«tÄ«jums ir AIZDOMĪGS. +error.probable_bad_default_signature=UZMANĪBU! Lai arÄ« noklusÄ“juma atslÄ“gai ir Å¡is identifikators, tas neapliecina Å¡o iesÅ«tÄ«jumu. Å is iesÅ«tÄ«jums ir AIZDOMĪGS. [units] unit=VienÄ«ba -error.no_unit_allowed_repo=Jums nav tiesÄ«bu aplÅ«kot nevienu šī repozitorija sadaļu. -error.unit_not_allowed=Jums nav tiesÄ«bu piekļūt Å¡ai repozitorija sadaļai. +error.no_unit_allowed_repo=Nav ļauts piekļūt nevienai šīs glabÄtavas sadaļai. +error.unit_not_allowed=Nav ļauts piekļūt Å¡ai glabÄtavas sadaļai. [packages] title=Pakotnes -desc=PÄrvaldÄ«t repozitorija pakotnes. +desc=PÄrvaldÄ«t glabÄtavas pakotnes. empty=PaÅ¡laik Å¡eit nav nevienas pakotnes. -empty.documentation=Papildus informÄcija par pakotņu reÄ£istru pieejama dokumentÄcijÄ. -empty.repo=NeparÄdÄs augÅ¡upielÄdÄ“ta pakotne? ApmeklÄ“jiet pakotņu iestatÄ«jumus, lai sasaistÄ«tu ar repozitoriju. -registry.documentation=VairÄk informÄcija par %s reÄ£istru ir pieejama dokumentÄcijÄ. +empty.documentation=Papildu informÄcija par pakotņu reÄ£istru ir pieejama dokumentÄcijÄ. +empty.repo=Å eit netiek parÄdÄ«ta augÅ¡upielÄdÄ“ta pakotne? JÄdodas uz pakotņu iestatÄ«jumiem un jÄsasaista tÄ ar Å¡o glabÄtavu. +registry.documentation=VairÄk informÄcijas par %s reÄ£istru ir dokumentÄcijÄ. filter.type=Veids filter.type.all=Visas filter.no_result=PÄ“c norÄdÄ«tajiem kritÄ“rijiem nekas netika atrasts. -filter.container.tagged=Ar atzÄ«mi -filter.container.untagged=Bez atzÄ«mes -published_by=PublicÄ“ja %[3]s %[1]s -published_by_in=PublicÄ“ja %[3]s %[1]s repozitorijÄ %[5]s -installation=InstalÄcija +filter.container.tagged=Ar birku +filter.container.untagged=Bez birkas +published_by=Laida klajÄ %[3]s %[1]s +published_by_in=%[3]s laida klajÄ %[1]s %[5]s +installation=UzstÄdīšana about=Par Å¡o pakotni requirements=PrasÄ«bas dependencies=AtkarÄ«bas keywords=AtslÄ“gvÄrdi details=Papildu informÄcija details.author=Autors -details.project_site=Projekta lapa -details.repository_site=Repozitorija vietne -details.documentation_site=DokumentÄcijas lapa +details.project_site=Projekta tÄ«mekļvietne +details.repository_site=GlabÄtavas tÄ«mekļvietne +details.documentation_site=DokumentÄcijas tÄ«mekļvietne details.license=Licence assets=Resursi versions=Versijas versions.view_all=ParÄdÄ«t visas dependency.id=ID dependency.version=Versija -alpine.registry=Iestaties Å¡o reÄ£istru pievienojot tÄ URL /etc/apk/repositories failÄ: -alpine.registry.key=LejupielÄdÄ“jiet reÄ£istra publisko RSA atslÄ“gu direktorijÄ /etc/apk/keys/, lai pÄrbaudÄ«tu indeksa parakstu: -alpine.registry.info=IzvÄ“lieties $branch un $repository no saraksta zemÄk. +alpine.registry=IestatÄ«t Å¡o reÄ£istru ar URL pievienoÅ¡anu datnÄ“ /etc/apk/repositories: +alpine.registry.key=ReÄ£istra publiskÄ RSA atslÄ“ga jÄlejupielÄdÄ“ mapÄ“ /etc/apk/keys/, lai apliecinÄtu indeksa parakstu: +alpine.registry.info=No zemÄk esoÅ¡Ä saraksta jÄizvÄ“las $branch un $repository. alpine.install=Lai uzstÄdÄ«tu pakotni, ir jÄizpilda šī komanda: -alpine.repository=Repozitorija informÄcija -alpine.repository.branches=Atzari -alpine.repository.repositories=Repozitoriji +alpine.repository=GlabÄtavas informÄcija +alpine.repository.branches=Zari +alpine.repository.repositories=GlabÄtavas alpine.repository.architectures=ArhitektÅ«ras -cargo.registry=UzstÄdiet Å¡o reÄ£istru Cargo konfigurÄcijas failÄ, piemÄ“ram, ~/.cargo/config.toml: -cargo.install=Lai instalÄ“tu Cargo pakotni, izpildiet sekojoÅ¡u komandu: -chef.registry=UzstÄdiet Å¡o reÄ£istru failÄ ~/.chef/config.rb: +cargo.registry=IestatÄ«t Å¡o reÄ£istru Cargo konfigurÄcijas datnÄ“ (piemÄ“ram, ~/.cargo/config.toml): +cargo.install=Lai uzstÄdÄ«tu pakotni ar Cargo, jÄizpilda šī komanda: +chef.registry=IestatÄ«t Å¡o reÄ£istru datnÄ“ ~/.chef/config.rb: chef.install=Lai uzstÄdÄ«tu pakotni, ir jÄizpilda šī komanda: -composer.registry=Pievienojiet Å¡o reÄ£istru savÄ ~/.composer/config.json failÄ: -composer.install=Lai instalÄ“tu Composer pakotni, izpildiet sekojoÅ¡u komandu: +composer.registry=IestatÄ«t Å¡o reÄ£istru datnÄ“ ~/.composer/config.json: +composer.install=Lai uzstÄdÄ«t pakotni ar Composer, jÄizpilda šī komanda: composer.dependencies=AtkarÄ«bas composer.dependencies.development=IzstrÄdes atkarÄ«bas -conan.details.repository=Repozitorijs -conan.registry=KonfigurÄ“jiet Å¡o reÄ£istru no komandrindas: -conan.install=Lai instalÄ“tu Conan pakotni, izpildiet sekojoÅ¡u komandu: -conda.registry=UzstÄdiet Å¡o reÄ£istru kÄ Conda repozitoriju failÄ .condarc: -conda.install=Lai instalÄ“tu Conda pakotni, izpildiet sekojoÅ¡u komandu: -container.details.type=AttÄ“la formÄts +conan.details.repository=GlabÄtava +conan.registry=Å is reÄ£istra uzstÄdīšana komandrindÄ: +conan.install=Lai uzstÄdÄ«tu pakotni ar Conan, jÄizpilda šī komanda: +conda.registry=Izveidot Å¡o reÄ£istru kÄ Conda glabÄtavu datnÄ“ .condarc: +conda.install=Lai uzstÄdÄ«tu pakotni ar Conda, jÄizpilda šī komanda: +container.details.type=AttÄ“la veids container.details.platform=Platforma -container.pull=AtgÄdÄjiet Å¡o attÄ“lu no komandrindas: -container.digest=Īssavilkums: +container.pull=AtgÄdÄt attÄ“lu komandrindÄ: +container.digest=Īssavilkums container.multi_arch=OS / arhitektÅ«ra container.layers=AttÄ“la slÄņi -container.labels=EtiÄ·etes +container.labels=IezÄ«mes container.labels.key=AtslÄ“ga container.labels.value=VÄ“rtÄ«ba -cran.registry=Iestaties Å¡o reÄ£istru savÄ Rprofile.site failÄ: +cran.registry=IestatÄ«t Å¡o reÄ£istru datnÄ“ Rprofile.site: cran.install=Lai uzstÄdÄ«tu pakotni, ir jÄizpilda šī komanda: -debian.registry=KonfigurÄ“jiet Å¡o reÄ£istru no komandrindas: -debian.registry.info=IzvÄ“lieties $distribution un $component no saraksta zemÄk. +debian.registry=Å is reÄ£istra uzstÄdīšana komandrindÄ: +debian.registry.info=No zemÄk esoÅ¡Ä saraksta jÄizvÄ“las $distribution un $component. debian.install=Lai uzstÄdÄ«tu pakotni, ir jÄizpilda šī komanda: -debian.repository=Repozitorija informÄcija +debian.repository=GlabÄtavas informÄcija debian.repository.distributions=DistribÅ«cijas debian.repository.components=Komponentes debian.repository.architectures=ArhitektÅ«ras generic.download=LejupielÄdÄ“t pakotni, izmantojot, komandrindu: -go.install=InstalÄ“t pakotni no komandrindas: -helm.registry=KonfigurÄ“jiet Å¡o reÄ£istru no komandrindas: -helm.install=Lai instalÄ“tu pakotni, nepiecieÅ¡ams izpildÄ«t sekojoÅ¡u komandu: -maven.registry=KonfigurÄ“jiet Å¡o reÄ£istru sava projekta pom.xml failÄ: -maven.install=Lai izmantotu pakotni, sadaÄ¼Ä dependencies failÄ pom.xml ievietojiet sekojoÅ¡as rindas: -maven.install2=Izpildiet no komandrindas: -maven.download=Izpildiet no komandrindas, lai lejupielÄdÄ“tu Å¡o atkarÄ«bu: -nuget.registry=KonfigurÄ“jiet Å¡o reÄ£istru no komandrindas: -nuget.install=Lai instalÄ“tu NuGet pakotni, izpildiet sekojoÅ¡u komandu: +go.install=UzstÄdÄ«t pakotni komandrindÄ: +helm.registry=Å Ä« reÄ£istra uzstÄdīšana komandrindÄ: +helm.install=Lai uzstÄdÄ«tu pakotni, ir jÄizpilda šī komanda: +maven.registry=IestatÄ«t Å¡o reÄ£istru sava projekta datnÄ“ pom.xml: +maven.install=Lai izmantotu pakotni, datnes pom.xml sadaÄ¼Ä dependencies jÄievieto šīs rindas: +maven.install2=JÄizpilda komandrindÄ: +maven.download=JÄizpilda komandrindÄ, lai lejupielÄdÄ“tu Å¡o atkarÄ«bu: +nuget.registry=Å Ä« reÄ£istra uzstÄdīšana komandrindÄ: +nuget.install=Lai uzstÄdÄ«tu pakotni ar NuGet, jÄizpilda šī komanda: nuget.dependency.framework=MÄ“rÄ·a ietvars -npm.registry=KonfigurÄ“jiet Å¡o reÄ£istru sava projekta .npmrc failÄ: -npm.install=Lai instalÄ“tu npm pakotni, izpildiet sekojoÅ¡u komandu: -npm.install2=vai pievienojiet failÄ package.json sekojoÅ¡as rindas: +npm.registry=IestatÄ«t Å¡o reÄ£istru sava projekta datnÄ“ .npmrc: +npm.install=Lai uzstÄdÄ«tu pakotni ar npm, jÄizpilda šī komanda: +npm.install2=vai datnÄ“ package.json jÄpievieno: npm.dependencies=AtkarÄ«bas npm.dependencies.development=IzstrÄdes atkarÄ«bas -npm.dependencies.peer=NetieÅ¡Äs atkarÄ«bas -npm.dependencies.optional=NeobligÄtÄs atkarÄ«bas -npm.details.tag=Tags -pub.install=Lai instalÄ“tu Dart pakotni, izpildiet sekojoÅ¡u komandu: +npm.dependencies.peer=LÄ«dzatkarÄ«bas +npm.dependencies.optional=IzvÄ“les atkarÄ«bas +npm.details.tag=Birka +pub.install=Lai uzstÄdÄ«tu pakotni ar Dart, jÄizpilda šī komanda: pypi.requires=NepiecieÅ¡ams Python -pypi.install=Lai instalÄ“tu pip pakotni, izpildiet sekojoÅ¡u komandu: -rpm.registry=KonfigurÄ“jiet Å¡o reÄ£istru no komandrindas: +pypi.install=Lai uzstÄdÄ«tu pakotni ar pip, jÄizpilda šī komanda: +rpm.registry=Å Ä« reÄ£istra uzstÄdīšana komandrindÄ: rpm.distros.redhat=uz RedHat balstÄ«tÄs operÄ“tÄjsistÄ“mÄs rpm.distros.suse=uz SUSE balstÄ«tÄs operÄ“tÄjsistÄ“mÄs rpm.install=Lai uzstÄdÄ«tu pakotni, ir jÄizpilda šī komanda: -rpm.repository=Repozitorija informÄcija +rpm.repository=GlabÄtavas informÄcija rpm.repository.architectures=ArhitektÅ«ras -rubygems.install=Lai instalÄ“tu gem pakotni, izpildiet sekojoÅ¡u komandu: -rubygems.install2=vai pievienojiet Gemfile: +rubygems.install=Lai uzstÄdÄ«tu pakotni ar gem, jÄizpilda šī komanda: +rubygems.install2=vai jÄpievieno tas Gemfile: rubygems.dependencies.runtime=Izpildlaika atkarÄ«bas rubygems.dependencies.development=IzstrÄdes atkarÄ«bas rubygems.required.ruby=NepiecieÅ¡amÄ Ruby versija rubygems.required.rubygems=NepiecieÅ¡amÄ RubyGem versija -swift.registry=KonfigurÄ“jiet Å¡o reÄ£istru no komandrindas: -swift.install=Pievienojiet pakotni savÄ Package.swift failÄ: -swift.install2=un izpildiet sekojoÅ¡u komandu: -vagrant.install=Lai pievienotu Vagrant kasti, izpildiet sekojoÅ¡u komandu: -settings.link=PiesaistÄ«t pakotni Å¡im repozitorijam -settings.link.description=Sasaistot pakotni ar repozitoriju, tÄ tiks attÄ“lota repozitorija pakotņu sarakstÄ. -settings.link.select=NorÄdiet repozitoriju -settings.link.button=Atjaunot repozitorija saiti -settings.link.success=Repozitorija saite tika veiksmÄ«gi atjaunota. -settings.link.error=NeizdevÄs atjaunot repozitorija saiti. -settings.delete=DzÄ“st pakotni +swift.registry=Å Ä« reÄ£istra uzstÄdīšana komandrindÄ: +swift.install=Pakotne jÄpievieno datnÄ“ Package.swift: +swift.install2=vai jÄpievieno tÄ Gemfile: +vagrant.install=Lai pievienotu Vagrant kasti, jÄizpilda šī komanda: +settings.link=PiesaistÄ«t Å¡o pakotni glabÄtavai +settings.link.description=Ja pakotne tiek sasaistÄ«ta ar glabÄtavu, tÄ tiek attÄ“lota glabÄtavas pakotņu sarakstÄ. +settings.link.select=AtlasÄ«t glabÄtavu +settings.link.button=AtjauninÄt glabÄtavas saiti +settings.link.success=GlabÄtavas saite tika sekmÄ«gi atjauninÄta. +settings.link.error=NeizdevÄs atjauninÄt glabÄtavas saiti. +settings.delete=IzdzÄ“st pakotni settings.delete.description=Pakotne tiks neatgriezeniski izdzÄ“sta. -settings.delete.notice=Tiks dzÄ“sts %s (%s). Å Ä« darbÄ«ba ir neatgriezeniska. Vai vÄ“laties turpinÄt? +settings.delete.notice=Tiks izdzÄ“sta pakotne %s (%s). Å Ä« darbÄ«ba ir neatgriezeniska. TieÅ¡Äm turpinÄt? settings.delete.success=Pakotne tika izdzÄ“sta. settings.delete.error=NeizdevÄs izdzÄ“st pakotni. owner.settings.cargo.title=Cargo reÄ£istra inkdess -owner.settings.cargo.initialize=InicializÄ“t indeksu -owner.settings.cargo.initialize.description=Ir nepiecieÅ¡ams Ä«paÅ¡s indeksa Git repozitorijs, lai izmantotu Cargo reÄ£istru. Å Ä«s iespÄ“jas izmantoÅ¡ana (atkÄrtoti) izveidos repozitoriju un automÄtiski to iestatÄ«s. -owner.settings.cargo.initialize.error=NeizdevÄs inicializÄ“t Cargo indeksu: %v -owner.settings.cargo.initialize.success=Cargo indekss tika veiksmÄ«gi inicializÄ“ts. +owner.settings.cargo.initialize=SÄknÄ“t indeksu +owner.settings.cargo.initialize.description=Ir nepiecieÅ¡ams Ä«paÅ¡a indeksa Git glabÄtava, lai izmantotu Cargo reÄ£istru. Å Ä«s iespÄ“jas izmantoÅ¡ana (atkÄrtoti) izveidos glabÄtavu un automÄtiski to iestatÄ«s. +owner.settings.cargo.initialize.error=NeizdevÄs sÄknÄ“t Cargo indeksu: %v +owner.settings.cargo.initialize.success=Cargo indekss tika sekmÄ«gi izveidots. owner.settings.cargo.rebuild=PÄrbÅ«vÄ“t indeksu owner.settings.cargo.rebuild.description=PÄrbÅ«vēšana var bÅ«t noderÄ«ga, ja indekss nav sinhronizÄ“ts ar saglabÄtajÄm Cargo pakotnÄ“m. owner.settings.cargo.rebuild.error=NeizdevÄs pÄrbÅ«vÄ“t Cargo indeksu: %v -owner.settings.cargo.rebuild.success=Cargo indekss tika veiksmÄ«gi pÄrbÅ«vÄ“ts. -owner.settings.cleanuprules.title=PÄrvaldÄ«t notÄ«rīšanas noteikumus -owner.settings.cleanuprules.add=Pievienot notÄ«rīšanas noteikumu -owner.settings.cleanuprules.edit=Labot notÄ«rīšanas noteikumu -owner.settings.cleanuprules.none=Nav pievienoti tÄ«rīšanas noteikumi. SÄ«kÄku informÄciju iespÄ“jams iegÅ«t dokumentÄcijÄ. -owner.settings.cleanuprules.preview=NotÄ«rīšÄnas noteikuma priekÅ¡skatÄ«jums -owner.settings.cleanuprules.preview.overview=Ir ieplÄnota %d paku dzēšana. -owner.settings.cleanuprules.preview.none=NotÄ«rīšanas noteikumam neatbilst neviena pakotne. +owner.settings.cargo.rebuild.success=Cargo indekss tika sekmÄ«gi pÄrbÅ«vÄ“ts. +owner.settings.cleanuprules.title=NotÄ«rīšanas kÄrtulas +owner.settings.cleanuprules.add=Pievienot notÄ«rīšanas kÄrtulu +owner.settings.cleanuprules.edit=Labot notÄ«rīšanas kÄrtulu +owner.settings.cleanuprules.none=VÄ“l nav pieejama neviena tÄ«rīšanas kÄrtula. +owner.settings.cleanuprules.preview=AttÄ«rīšanas kÄrtulas priekÅ¡skatÄ«jums +owner.settings.cleanuprules.preview.overview=Ir paredzÄ“ta %d pakotņu noņemÅ¡ana. +owner.settings.cleanuprules.preview.none=AttÄ«rīšanas kÄrtulai neatbilst neviena pakotne. owner.settings.cleanuprules.enabled=IespÄ“jots -owner.settings.cleanuprules.pattern_full_match=Piešķirt Å¡ablonu visam pakotnes nosaukumam -owner.settings.cleanuprules.keep.title=Versijas, kas atbilst Å¡iem noteikumiem tiks saglabÄtas, pat ja tÄs atbilst noņemÅ¡anas noteikumiem zemÄk. -owner.settings.cleanuprules.keep.count=SaglabÄt jaunÄko versiju +owner.settings.cleanuprules.pattern_full_match=Pielietot paraugu visam pakotnes nosaukumam +owner.settings.cleanuprules.keep.title=Versijas, kas atbilst šīm kÄrtulÄm, tiks paturÄ“tas, pat ja tÄs atbildÄ«s zemÄk esoÅ¡ajai noņemÅ¡anas kÄrtulai. +owner.settings.cleanuprules.keep.count=PaturÄ“t visjaunÄko owner.settings.cleanuprules.keep.count.1=1 versija katrai pakotnei owner.settings.cleanuprules.keep.count.n=%d versijas katrai pakotnei owner.settings.cleanuprules.keep.pattern=PaturÄ“t versijas, kas atbilst owner.settings.cleanuprules.keep.pattern.container=Versija latest vienmÄ“r tiks paturÄ“ta konteineru pakotnÄ“m. -owner.settings.cleanuprules.remove.title=Versijas, kas atbilst Å¡iem noteikumiem tiks noņemtas, ja vien neatbilst arÄ« noteikumiem augstÄk, lai tÄs paturÄ“tu. +owner.settings.cleanuprules.remove.title=Versijas, kas atbilst šīm kÄrtulÄm, tiks noņemtas, ja vien augstÄk esoÅ¡Ä kÄrtula nenosaka, ka tÄs ir jÄpatur. owner.settings.cleanuprules.remove.days=Noņemt versijas vecÄkas kÄ owner.settings.cleanuprules.remove.pattern=Noņemt versijas, kas atbilst -owner.settings.cleanuprules.success.update=NotÄ«rīšanas noteikumi tika atjaunoti. -owner.settings.cleanuprules.success.delete=NotÄ«rīšanas noteikumi tika izdzÄ“sti. +owner.settings.cleanuprules.success.update=NotÄ«rīšanas kÄrtula tika atjauninÄta. +owner.settings.cleanuprules.success.delete=NotÄ«rīšanas kÄrtula tika izdzÄ“sta. owner.settings.chef.title=Chef reÄ£istrs -owner.settings.chef.keypair=Ä¢enerÄ“t atslÄ“gu pÄri +owner.settings.chef.keypair=Izveidot atslÄ“gu pÄri owner.settings.chef.keypair.description=AtslÄ“gu pÄris ir nepiecieÅ¡ams, lai autentificÄ“tos Chef reÄ£istrÄ. Ja iepriekÅ¡ ir izveidots atslÄ“gu pÄris, jauna pÄra izveidoÅ¡ana veco atslÄ“gu pÄri padarÄ«s nederÄ«gu. +arch.version.properties = Versijas Ä«pašības +arch.pacman.helper.gpg = JÄpievieno uzticēšanÄs sertifikÄts pacman: +arch.pacman.repo.multi = %s ir tÄda pati versija dažÄdÄs distribÅ«cijÄs. +arch.pacman.repo.multi.item = %s konfigurÄcija +arch.pacman.sync = JÄsinhronizÄ“ pakotne ar pacman: +arch.version.description = Apraksts +arch.version.provides = NodroÅ¡ina +arch.pacman.conf = /etc/pacman.conf jÄpievieno serveris ar atbilstoÅ¡u distribÅ«ciju un arhitektÅ«ru: +arch.version.groups = Kopa +arch.version.replaces = Aizvieto +arch.version.checkdepends = PÄrbaudÄ«t atkarÄ«bas +arch.version.conflicts = NesaderÄ«bas +npm.dependencies.bundle = IekļautÄs atkarÄ«bas +container.images.title = AttÄ“li +arch.version.optdepends = IzvÄ“les atkarÄ«bas +arch.version.makedepends = Izveidot atkarÄ«bas +arch.version.backup = Rezerves kopija +arch.version.depends = AtkarÄ«bas +rpm.repository.multiple_groups = Å Ä« pakotne ir pieejama vairÄkÄs kopÄs. +owner.settings.cargo.rebuild.no_index = Nevar pÄrbÅ«vÄ“t, nav sÄknÄ“ts neviens indekss. +search_in_external_registry = MeklÄ“t %s +alt.registry = Å Ä« reÄ£istra uzstÄdīšana komandrindÄ: +alt.registry.install = Lai uzstÄdÄ«tu pakotni, jÄizpilda šī komanda: +alt.install = UzstÄdÄ«t pakotni +alt.setup = Pievienot glabÄtavu savienoto glabÄtavu sarakstÄ ("_arch_" vietÄ jÄizvÄ“las nepiecieÅ¡amÄ arhitektÅ«ra): +alt.repository = InformÄcija par glabÄtavu +alt.repository.architectures = ArhitektÅ«ras +alt.repository.multiple_groups = Å Ä« pakotne ir pieejama vairÄkÄs kopÄs. [secrets] secrets=NoslÄ“pumi -description=NoslÄ“pumi tiks padoti atsevišķÄm darbÄ«bÄm un citÄdi nevar tikt nolasÄ«ti. +description=NoslÄ“pumi tiks padoti noteiktÄm darbÄ«bÄm, un citÄdÄk tos nevar nolasÄ«t. none=PagaidÄm nav neviena noslÄ“puma. creation=Pievienot noslÄ“pumu -creation.name_placeholder=reÄ£istr-nejÅ«tÄ«gs, tikai burti, cipari un apakÅ¡svÄ«tras, nevar sÄkties ar GITEA_ vai GITHUB_ -creation.value_placeholder=Ievadiet jebkÄdu saturu. Atstarpes sÄkumÄ un beigÄ tiks noņemtas. +creation.name_placeholder=reÄ£istrnejutÄ«gs, tikai burti, cipari un apakÅ¡svÄ«tras, nevar sÄkties ar GITEA_ vai GITHUB_ +creation.value_placeholder=JÄievada jebkÄds saturs. Atstarpes sÄkumÄ un beigÄs tiks izlaistas. creation.success=NoslÄ“pums "%s" tika pievienots. creation.failed=NeizdevÄs pievienot noslÄ“pumu. -deletion=DzÄ“st noslÄ“pumu -deletion.description=NoslÄ“puma dzēšana ir neatgriezeniska. Vai turpinÄt? -deletion.success=NoslÄ“pums tika izdzÄ“sts. -deletion.failed=NeizdevÄs dzÄ“st noslÄ“pumu. -management=NoslÄ“pumu pÄrvaldÄ«ba +deletion=Noņemt noslÄ“pumu +deletion.description=NoslÄ“puma izdzēšana ir neatgriezeniska un nav atsaucama. TurpinÄt? +deletion.success=NoslÄ“pums tika noņemts. +deletion.failed=NeizdevÄs noņemt noslÄ“pumu. +management=PÄrvaldÄ«t noslÄ“pumus [actions] actions=DarbÄ«bas -unit.desc=PÄrvaldÄ«t darbÄ«bas +unit.desc=IebÅ«vÄ“to CI/CD cauruļvadu pÄrvaldīšana ar Forgejo Actions. status.unknown=NezinÄms status.waiting=Gaida status.running=IzpildÄs -status.success=Pabeigts -status.failure=NeveiksmÄ«gs +status.success=SekmÄ«gi +status.failure=NesekmÄ«gi status.cancelled=Atcelts status.skipped=Izlaists -status.blocked=BloÄ·Ä“ts +status.blocked=AizturÄ“ts runners=IzpildÄ«tÄji -runners.runner_manage_panel=IzpildÄ«tÄju pÄrvaldÄ«ba -runners.new=Pievienot jaunu izpildÄ«tÄju +runners.runner_manage_panel=PÄrvaldÄ«t izpildÄ«tÄjus +runners.new=Izveidot jaunu izpildÄ«tÄju runners.new_notice=KÄ uzstÄdÄ«t izpildÄ«tÄju -runners.status=Statuss +runners.status=StÄvoklis runners.id=ID runners.name=Nosaukums runners.owner_type=Veids @@ -3513,58 +3917,58 @@ runners.last_online=PÄ“dÄ“jo reizi tieÅ¡saistÄ“ runners.runner_title=IzpildÄ«tÄjs runners.task_list=PÄ“dÄ“jÄs darbÄ«bas, kas izpildÄ«tas runners.task_list.no_tasks=VÄ“l nav uzdevumu. -runners.task_list.run=IzpildÄ«t -runners.task_list.status=Statuss -runners.task_list.repository=Repozitorijs -runners.task_list.commit=RevÄ«zija +runners.task_list.run=IzpildÄ«jums +runners.task_list.status=StÄvoklis +runners.task_list.repository=GlabÄtava +runners.task_list.commit=IesÅ«tÄ«jums runners.task_list.done_at=Beigu laiks runners.edit_runner=Labot izpildÄ«tÄju -runners.update_runner=Atjaunot izpildÄ«tÄju -runners.update_runner_success=IzpildÄ«tÄjs veiksmÄ«gi atjaunots -runners.update_runner_failed=NeizdevÄs atjaunot izpildÄ«tÄju +runners.update_runner=AtjauninÄt izmaiņas +runners.update_runner_success=IzpildÄ«tÄjs sekmÄ«gi atjauninÄts +runners.update_runner_failed=NeizdevÄs atjauninÄt izpildÄ«tÄju runners.delete_runner=DzÄ“st izpildÄ«tÄju -runners.delete_runner_success=IzpildÄ«tÄjs veiksmÄ«gi izdzÄ“sts +runners.delete_runner_success=IzpildÄ«tÄjs sekmÄ«gi izdzÄ“sts runners.delete_runner_failed=NeizdevÄs izdzÄ“st izpildÄ«tÄju runners.delete_runner_header=ApstiprinÄt izpildÄ«tÄja izdzēšanu -runners.delete_runner_notice=Ja Å¡is izpildÄ«tÄjs veic kÄdus uzdevumus, tad tie tiks apturÄ“ti un atzÄ«mÄ“ti kÄ neizdevuÅ¡ies. Tas var sabojÄt bÅ«vēšanas darbaplÅ«smas. +runners.delete_runner_notice=Ja Å¡is izpildÄ«tÄjs veic kÄdus uzdevumus, tad tie tiks apturÄ“ti un atzÄ«mÄ“ti kÄ neizdevuÅ¡ies. Tas var sabojÄt bÅ«vēšanas darbplÅ«smas. runners.none=Nav pieejami izpildÄ«tÄji runners.status.unspecified=NezinÄms runners.status.idle=DÄ«kstÄvÄ“ -runners.status.active=AktÄ«vs +runners.status.active=Darbojas runners.status.offline=BezsaistÄ“ runners.version=Versija runners.reset_registration_token=AtiestatÄ«t reÄ£istrÄcijas pilnvaru -runners.reset_registration_token_success=IzpildÄ«tÄja reÄ£istrÄcijas pilnvara tika veiksmÄ«gi atiestatÄ«ta +runners.reset_registration_token_success=IzpildÄ«tÄja reÄ£istrÄcijas pilnvara tika sekmÄ«gi atiestatÄ«ta -runs.all_workflows=Visas darbaplÅ«smas -runs.commit=RevÄ«zija +runs.all_workflows=Visas darbplÅ«smas +runs.commit=IesÅ«tÄ«jumu runs.scheduled=IeplÄnots -runs.pushed_by=iesÅ«tÄ«ja -runs.invalid_workflow_helper=DarbaplÅ«smas konfigurÄcijas fails ir kļūdains. PÄrbaudiet konfiugrÄcijas failu: %s -runs.no_matching_online_runner_helper=Nav pieejami izpildÄ«tÄji, kas atbilstu Å¡ai iezÄ«mei: %s -runs.actor=Aktors -runs.status=Statuss -runs.actors_no_select=Visi aktori +runs.pushed_by=aizgÄdÄja +runs.invalid_workflow_helper=DarbplÅ«smas konfigurÄcijas datne ir nederÄ«ga. LÅ«gums pÄrbaudÄ«t konfigurÄcijas datni: %s +runs.no_matching_online_runner_helper=Nav tieÅ¡saistÄ“ esoÅ¡u izpildÄ«tÄju, kas atbilstu iezÄ«mei: %s +runs.actor=IzraisÄ«tÄjs +runs.status=StÄvoklis +runs.actors_no_select=Visi izraisÄ«tÄji runs.status_no_select=Visi stÄvokļi runs.no_results=Netika atrasts nekas atbilstoÅ¡s. runs.no_workflows=VÄ“l nav nevienas darbplÅ«smas. runs.no_runs=DarbplÅ«smai vÄ“l nav nevienas izpildes. -runs.empty_commit_message=(tukÅ¡s revÄ«zijas ziņojums) +runs.empty_commit_message=(tukÅ¡s iesÅ«tÄ«juma ziņojums) workflow.disable=AtspÄ“jot darbplÅ«smu -workflow.disable_success=DarbplÅ«sma '%s' ir veiksmÄ«gi atspÄ“jota. +workflow.disable_success=DarbplÅ«sma "%s" ir sekmÄ«gi atspÄ“jota. workflow.enable=IespÄ“jot darbplÅ«smu -workflow.enable_success=DarbplÅ«sma '%s' ir veiksmÄ«gi iespÄ“jota. +workflow.enable_success=DarbplÅ«sma "%s" ir sekmÄ«gi iespÄ“jota. workflow.disabled=DarbplÅ«sma ir atspÄ“jota. -need_approval_desc=NepiecieÅ¡ams apstiprinÄjums, lai izpildÄ«tu izmaiņu pieprasÄ«jumu darbaplÅ«smas no atdalÄ«tiem repozitorijiem. +need_approval_desc=NepiecieÅ¡ams apstiprinÄjums, lai izpildÄ«tu darbplÅ«smas izmaiņu pieprasÄ«jumos no atzarojumiem. variables=MainÄ«gie -variables.management=MainÄ«go pÄrvaldÄ«ba +variables.management=PÄrvaldÄ«t mainÄ«gos variables.creation=Pievienot mainÄ«go variables.none=VÄ“l nav neviena mainÄ«gÄ. variables.deletion=Noņemt mainÄ«go -variables.deletion.description=MainÄ«gÄ noņemÅ¡ana ir neatgriezeniska un nav atsaucama. Vai turpinÄt? +variables.deletion.description=MainÄ«gÄ noņemÅ¡ana ir neatgriezeniska un nav atsaucama. TurpinÄt? variables.description=MainÄ«gie tiks padoti noteiktÄm darbÄ«bÄm, un citÄdÄk tos nevar nolasÄ«t. variables.id_not_exist=MainÄ«gais ar identifikatoru %d nepastÄv. variables.edit=Labot mainÄ«go @@ -3574,18 +3978,100 @@ variables.creation.failed=NeizdevÄs pievienot mainÄ«go. variables.creation.success=MainÄ«gais "%s" tika pievienots. variables.update.failed=NeizdevÄs labot mainÄ«go. variables.update.success=MainÄ«gais tika labots. +workflow.dispatch.invalid_input_type = NederÄ«gs ievades mainÄ«gÄ veids "%s". +workflow.dispatch.run = IzpildÄ«t darbplÅ«smu +workflow.dispatch.success = DarbplÅ«smas izpildīšana tika sekmÄ«gi pieprasÄ«ta. +workflow.dispatch.use_from = Izmantot darbplÅ«smu no +runs.workflow = DarbplÅ«sma +runs.no_job_without_needs = DarbplÅ«smÄ ir jÄbÅ«t vismaz vienam darbam bez atkarÄ«bÄm. +workflow.dispatch.input_required = NepiecieÅ¡ama vÄ“rtÄ«ba ievades mainÄ«gajam "%s". +runs.expire_log_message = ŽurnÄli tika iztÄ«rÄ«ti, jo tie bija pÄrÄk veci. +runs.no_workflows.help_no_write_access = Lai uzzinÄtu par Forgejo Acties, jÄieskatÄs dokumentÄcijÄ. +runs.no_job = DarbplÅ«smÄ ir jÄbÅ«t vismaz vienam darbam +runs.no_workflows.help_write_access = Nav skaidrs, kÄ sÄkt izmantot Forgejo Actions? JÄieskatÄs ÄtrajÄ ievadÄ lietotÄja dokumentÄcijÄ, lai uzrakstÄ«tu savu pirmo darbplÅ«smu, tad jÄiestata Forgejo izpildÄ«tÄjs, lai izpildÄ«tu savus darbus. +workflow.dispatch.warn_input_limit = AttÄ“lo tikai pirmos %d ievades mainÄ«gos. +workflow.dispatch.trigger_found = Å ai darbplÅ«smai ir workflow_dispatch notikuma izraisÄ«tÄjs. +variables.not_found = NeizdevÄs atrast mainÄ«go. [projects] -type-1.display_name=IndividuÄlais projekts -type-2.display_name=Repozitorija projekts -type-3.display_name=OrganizÄcijas projekts +type-1.display_name=Atsevišķs projekts +type-2.display_name=GlabÄtavas projekts +type-3.display_name=ApvienÄ«bas projekts +deleted.display_name = IzdzÄ“sts projekts [git.filemode] changed_filemode=%[1]s → %[2]s -; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … -directory=Direktorija -normal_file=Parasts fails -executable_file=IzpildÄmais fails +directory=Mape +normal_file=Parasta datne +executable_file=IzpildÄma datne symbolic_link=Simboliska saite submodule=ApakÅ¡modulis + + +[search] +commit_kind = MeklÄ“t iesÅ«tÄ«jumus… +search = MeklÄ“t… +type_tooltip = Meklēšanas veids +fuzzy = Aptuveni +fuzzy_tooltip = Iekļaut arÄ« vienumus, kas meklēšanas vaicÄjumam atbilst aptuveni +union = VispÄrÄ“ji +union_tooltip = Iekļaut vienumus, kas atbilst jebkuram no ar atstarpi atdalÄ«tajiem atslÄ“gvÄrdiem +exact = TieÅ¡i +exact_tooltip = Iekļaut tikai vienumus, kas tieÅ¡i atbilst vaicÄjumam +regexp = RegulÄrÄ izteiksme +regexp_tooltip = ApstrÄdÄt vaicÄjumu kÄ regulÄro izteiksmi +repo_kind = MeklÄ“t glabÄtavas… +code_search_unavailable = Koda meklēšana paÅ¡laik nav pieejama. LÅ«gums sazinÄties ar vietnes pÄrvaldÄ«tÄju. +project_kind = MeklÄ“t projektus… +runner_kind = MeklÄ“t izpildÄ«tÄjus… +no_results = Nekas netika atrasts. +milestone_kind = MeklÄ“t atskaites punktus... +package_kind = MeklÄ“t pakotnes… +org_kind = MeklÄ“t apvienÄ«bas… +user_kind = MeklÄ“t lietotÄjus… +team_kind = MeklÄ“t komandas… +code_kind = MeklÄ“t kodu… +code_search_by_git_grep = PaÅ¡reizÄ“jo koda meklēšanas iznÄkumu nodroÅ¡ina "git grep". IznÄkums varÄ“tu bÅ«t labÄks, ja vietnes pÄrvaldÄ«tÄjs iespÄ“jo glabÄtavas indeksÄ“tÄju. +keyword_search_unavailable = Meklēšana pÄ“c atslÄ“gvÄrda paÅ¡reiz nav pieejama. LÅ«gums sazinÄties ar vietnes pÄrvaldÄ«tÄju. +issue_kind = MeklÄ“t pieteikumus… +pull_kind = MeklÄ“t izmaiņu pieprasÄ«jumus… +branch_kind = MeklÄ“t zarus… + +[repo.permissions] +actions.write = RakstÄ«t: paÅ¡rocÄ«gi izsaukt, pÄrsÄktnÄ“t, atcelt vai apstiprinÄt ierindotos CI/CD cauruļvadus. +ext_wiki = Piekļūt ÄrÄ“jas vikivietnes saitei. Atļaujas tiek pÄrvaldÄ«tas ÄrÄ“ji. +ext_issues = Piekļūt ÄrÄ“ja pieteikumu izsekotÄja saitei. Atļaujas tiek pÄrvaldÄ«tas ÄrÄ“ji. +packages.write = RakstÄ«t: pievienot un izdzÄ“st glabÄtavai piesaistÄ«tÄs pakotnes. +actions.read = LasÄ«t: skatÄ«t iekļautos CI/CD cauruļvadus un to žurnÄlus. +code.write = RakstÄ«t: aizgÄdÄta izmaiņas uz glabÄtavu, izveidot zarus un birkas. +pulls.write = RakstÄ«t: aizvÄ“rt izmaiņu pieprasÄ«jumus un pÄÅ—valdÄ«t tÄdus metadatus kÄ iezÄ«mes, atskaites punktus, atbildÄ«gos, beigu datumus un atkarÄ«bas. +pulls.read = LasÄ«t: lasīšana un izveidot izmaiņu pieprasÄ«jumus. +code.read = LasÄ«t: piekļūt glabÄtavas kodam un klonÄ“t to. +issues.read = LasÄ«t: lasÄ«t un izveidot pieteikumus un piebildes. +issues.write = RakstÄ«t: aizvÄ“rt pieteikums un pÄrvaldÄ«t tÄdus metadatus kÄ iezÄ«mes, atskaites punktus, atbildÄ«gos, beigu datumus un atkarÄ«bas. +wiki.read = LasÄ«t: lasÄ«t iebÅ«vÄ“to vikivietni un tÄs vÄ“sturi. +projects.write = RakstÄ«t: izveidot projektus un slejas un labot tÄs. +packages.read = LasÄ«t: apskatÄ«t un lejupielÄdÄ“t glabÄtavai piesaistÄ«tÄs pakotnes. +releases.read = LasÄ«t: apskatÄ«t un lejupielÄdÄ“t laidienus. +releases.write = RakstÄ«t: laist klajÄ, labot un izdzÄ“st laidienus un to lÄ«dzekļus. +wiki.write = RakstÄ«t: izveidot, atjauninÄt un izdzÄ“st iebÅ«vÄ“tÄs vikivietnes lapas. +projects.read = LasÄ«t: piekļūt glabÄtavas projektu dēļiem. + + +[munits.data] +mib = MiB +pib = PiB +gib = GiB +tib = TiB +kib = KiB +eib = EiB +b = B + +[markup] +filepreview.line = %[1]d. rinda %[2]s +filepreview.lines = %[1]d. lÄ«dz %[2]d. rinda %[3]s +filepreview.truncated = PriekÅ¡skatÄ«jums tika saÄ«sinÄts + +[translation_meta] +test = Å Ä« ir pÄrbaudes virkne. TÄ netiek attÄ“lota Forgejo saskarnÄ“, bet tiek izmantota pÄrbaudes nolÅ«kiem. DroÅ¡i var ievadÄ«t "ok", lai ietaupÄ«tu laiku (vai kÄdu jautru faktu pÄ“c izvÄ“les), lai sasniegtu to saldo 100% pabeigÅ¡anas atzÄ«mi. diff --git a/options/locale/locale_ml-IN.ini b/options/locale/locale_ml-IN.ini index a15fd5a9dc..fcc9888d8e 100644 --- a/options/locale/locale_ml-IN.ini +++ b/options/locale/locale_ml-IN.ini @@ -248,7 +248,6 @@ authorization_failed=അംഗീകാരം നലàµâ€à´•àµà´¨àµà´¨à´¤à´¿ authorization_failed_desc=അസാധàµà´µà´¾à´¯ ഒരൠഅഭàµà´¯àµ¼à´¤àµà´¥à´¨ à´•à´£àµà´Ÿàµ†à´¤àµà´¤à´¿à´¯à´¤à´¿à´¨à´¾àµ½ à´žà´™àµà´™àµ¾ അംഗീകാരം പരാജയപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿. ദയവായി നിങàµà´™àµ¾ അംഗീകരികàµà´•ാൻ à´¶àµà´°à´®à´¿à´šàµà´š à´…à´ªàµà´²à´¿à´•àµà´•േഷനàµà´±àµ† പരിപാലകനàµà´®à´¾à´¯à´¿ ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´•. [mail] - activate_account=നിങàµà´™à´³àµà´Ÿàµ† à´…à´•àµà´•ൗണàµà´Ÿàµ സജീവമാകàµà´•àµà´• activate_email=ഇമെയിലàµâ€ വിലാസം à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´¯àµà´•àµà´•àµà´• @@ -674,7 +673,8 @@ editor.filename_help=ഒരൠഡയറകàµâ€Œà´Ÿà´±à´¿à´¯àµà´Ÿàµ† പേര editor.or=അഥവാ editor.cancel_lower=റദàµà´¦à´¾à´•àµà´•àµà´• editor.commit_changes=മാറàµà´±à´™àµà´™àµ¾ വരàµà´¤àµà´¤àµà´• -editor.add_tmpl='<ഫയലàµâ€>' ചേർകàµà´•àµà´• +editor.add_tmpl='<%s>' ചേർകàµà´•àµà´• +editor.add_tmpl.filename = ഫയലàµâ€ editor.add=%s ചേരàµâ€à´•àµà´•àµà´• editor.update=%s à´ªàµà´¤àµà´•àµà´•àµà´• editor.delete=%s നീകàµà´•à´‚ ചെയàµà´¯àµà´• @@ -723,12 +723,6 @@ issues.dependency.add_error_dep_not_same_repo=à´°à´£àµà´Ÿàµ à´ªàµà´°à´¶àµà´¨ -; %[2]s
      %[3]s
      - - - - - milestones.filter_sort.most_issues=മികàµà´• ഇഷàµà´¯àµ‚à´•à´³àµà´‚ milestones.filter_sort.least_issues=à´•àµà´±à´žàµà´ž ഇഷàµà´¯àµ‚കളെങàµà´•à´¿à´²àµà´‚ @@ -753,18 +747,7 @@ settings.event_issues=ഇഷàµà´¯àµ‚à´•à´³àµâ€ [org] - - - - - - [admin] - - - - - repos.issues=ഇഷàµà´¯àµ‚à´•à´³àµâ€ @@ -802,4 +785,3 @@ repos.issues=ഇഷàµà´¯àµ‚à´•à´³àµâ€ [units] [packages] - diff --git a/options/locale/locale_nb_NO.ini b/options/locale/locale_nb_NO.ini index aae4ae788f..2c8b5cfc64 100644 --- a/options/locale/locale_nb_NO.ini +++ b/options/locale/locale_nb_NO.ini @@ -1,8 +1,5 @@ - - - [common] -enable_javascript = Denne nettsiden behøver JavaScript. +enable_javascript = Denne nettsiden krever JavaScript. toc = Innholdsfortegnelse licenses = Lisenser return_to_forgejo = Tilbake til Forgejo @@ -23,4 +20,136 @@ language = SprÃ¥k notifications = Varslinger create_new = Opprett… user_profile_and_more = Profil og innstillinger… -signed_in_as = Logget inn som \ No newline at end of file +signed_in_as = Logget inn som +confirm_delete_selected = Bekreft sletting av alle valgte elementer? +dashboard = Dashbord +download_logs = Last ned logger +copy_hash = Kopier hash +more_items = Flere elementer +passcode = Adgangskode +webauthn_insert_key = Skriv inn din sikkerhetsnøkkel +webauthn_use_twofa = Bruk tofaktorkode fra din mobil +organization = Organisasjon +mirror = Speil +new_mirror = Ny speiling +repository = Repositorium +new_project = Nytt prosjekt +new_project_column = Ny kolonne +webauthn_error = Klarte ikke lese sikkerhetsnøkkelen. +webauthn_unsupported_browser = Nettleseren din støtter ikke WebAuthn. +webauthn_error_unknown = En ukjent feil oppstod. Vennligst prøv igjen. +webauthn_error_insecure = WebAuhn støtter kun sikre forbindelser. For testing over HTTP kan du bruke verten "localhost" eller "127.0.0.1" +admin_panel = Nettsideadministrasjon +settings = Innstillinger +your_profile = Profil +your_starred = Stjernemerket +your_settings = Innstillinger +new_repo.title = Nytt repositorium +new_migrate.title = Ny migrasjon +new_org.title = Ny organisasjon +new_repo.link = Nytt repositorium +new_migrate.link = Ny migrasjon +new_org.link = Ny organisasjon +all = Alle +sources = Kilder +mirrors = Speilinger +activities = Aktiviteter +rss_feed = RSS feed +retry = Prøv igjen +rerun = Kjør pÃ¥ nytt +rerun_all = Kjør alle jobber pÃ¥ nytt +save = Lagre +cancel = Avbryt +forks = Forks +milestones = Milepæler +ok = OK +test = Test +loading = Laster inn… +error = Feil +go_back = GÃ¥ tilbake +never = Aldri +invalid_data = Ugyldig data: %v +unknown = Ukjent +pin = Pin +artifacts = Artefakter +archived = Arkivert +concept_system_global = Global +add = Legg til +add_all = Legg til alle +remove = Fjern +remove_all = Fjern alle +remove_label_str = Fjern element "%s" +edit = Rediger +view = Vis +enabled = Aktivert +disabled = Deaktivert +locked = LÃ¥st +copy = Kopier +copy_generic = Kopier til utklippstavlen +copy_url = Kopier URL +copy_content = Kopier innhold +copy_success = Kopiert! +copy_error = Kopiering mislyktes +copy_type_unsupported = Denne filtypen kan ikke kopieres +write = Skriv +preview = ForhÃ¥ndsvis +concept_user_individual = Individuell +concept_code_repository = Repositorium +concept_user_organization = Organisasjon +show_timestamps = Vis tidsstempler +show_log_seconds = Vis sekunder +show_full_screen = Vis fullskjerm +name = Navn +value = Verdi +filter = Filter +filter.clear = Tøm filtre +filter.is_archived = Arkivert +filter.not_archived = Ikke arkivert +filter.is_mirror = Speilinger +filter.not_mirror = Ikke speilinger +filter.is_template = Maler +filter.not_template = Ikke maler +filter.public = Offentlig +filter.private = Privat +explore = Utforsk +active_stopwatch = Aktiv tidsregistrering +home = Hjem +help = Hjelp +logo = Logo +sign_in = Logg inn +sign_in_with_provider = Logg inn med %s +sign_in_or = eller +sign_out = Logg ut +sign_up = Opprett konto +confirm_delete_artifact = Er du sikker pÃ¥ at du vil slette artefakten "%s" ? +webauthn_sign_in = Trykk pÃ¥ knappen pÃ¥ sikkerhetsnøkkelen din. Dersom nøkkelen din ikke har en knapp, sett den inn pÃ¥ nytt. +copy_path = Kopier sti +webauthn_error_unable_to_process = Tjeneren kunne ikke behandle forespørselen din. +webauthn_error_empty = Du mÃ¥ gi nøkkelen et navn. +toggle_menu = Ã…pne/lukke meny +twofa_scratch = To-faktor skrapekode +webauthn_press_button = Vennligst trykk pÃ¥ knappen pÃ¥ sikkerhetsnøkkelen… +webauthn_error_duplicated = Sikkerhetsnøkkelen er ikke tillatt for denne forespørselen. Vennligst sørg for at nøkkelen ikke allerede er registrert. +webauthn_error_timeout = Et tidsavbrudd oppsto før nøkkelen din kunne leses. Vennligst last inn siden pÃ¥ nytt og prøv igjen. +new_fork = Ny fork av repository +collaborative = Samarbeidende + +[search] +search = Søk... +type_tooltip = Søketype +fuzzy = Fuzzy +union = Union +regexp = RegExp +exact = Nøyaktig + +[auth] +verify = Bekreft +sign_up_button = Opprett konto nÃ¥. +change_unconfirmed_email_error = Kan ikke endre e-postadresse: %v +login_userpass = Logg inn +oauth_signup_tab = Registrer ny konto +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 diff --git a/options/locale/locale_nds.ini b/options/locale/locale_nds.ini new file mode 100644 index 0000000000..698f1330d6 --- /dev/null +++ b/options/locale/locale_nds.ini @@ -0,0 +1,3809 @@ +[common] +home = Heimaad +explore = Utförsken +help = Hülp +sign_in = Anmellen +sign_in_with_provider = Mit %s anmellen +sign_in_or = of +sign_out = Ofmellen +sign_up = Registreren +link_account = Konto verbinnen +version = Versioon +powered_by = Dreven mit %s +page = Sied +template = Vörlaag +language = Spraak +notifications = Narichtens +tracked_time_summary = Tosamenfaten vun erfaat Tied na de Filters in de Gefall-List +create_new = Neei … +user_profile_and_more = Profil un Instellens … +signed_in_as = Anmellt as +enable_javascript = Deese Internett-Sied bruukt JavaScript. +toc = Inhollsverteeknis +return_to_forgejo = Torügg to Forgejo +toggle_menu = Menü umschalten +more_items = Mehr Dingen +username = Brukernaam +access_token = Togang-Teken +captcha = CAPTCHA +twofa = Twee-Faktooren-Anmellen +twofa_scratch = Twee-Faktooren-Eenmaalpasswoord +webauthn_insert_key = Steek dienen Sekerheids-Slötel in +webauthn_press_button = Bidde drück de Knoop up dienem Sekerheids-Slötel … +webauthn_use_twofa = Bruuk eene Twee-Faktooren-Tahl vun dienem Telefoon +webauthn_error = Kunn dienen Sekerheids-Slötel nich lesen. +webauthn_unsupported_browser = Dien Browser unnerstütt stedenwies WebAuthn nich. +webauthn_error_unknown = Een unbekannter Fehler is uptreden. Bidde versöök dat noch eenmaal. +passcode = Pass-Tahl +webauthn_error_empty = Du muttst de Slötel eenen Naam geven. +repository = Repositorium +organization = Vereenigung +new_fork = Neje Repositoriums-Gabel +dashboard = Kontor +logo = Logo +active_stopwatch = Aktive Tied-Erfatens +password = Passwoord +register = Registreren +licenses = Lizenzen +email = E-Mail-Adress +re_type = Passwoord utwiesen +webauthn_error_unable_to_process = De Server kunn diene Anfraag nich verarbeiden. +new_mirror = Nejer Spegel +webauthn_sign_in = Drück de Knoop up dienem Sekerheids-Slötel. Wenn dien Slötel keenen Knoop hett, steek ’t ut un weer in. +webauthn_error_insecure = WebAuthn unnerstütt blots seker Verbinnens. Wenn du över HTTP testen willst, kannst du de Quell »localhost« of »127.0.0.1« bruken +webauthn_error_duplicated = De Sekerheids-Slötel is för deese Anfraag nich verlöövt. Bidde wees wiss, dat de Slötel nich al vermarkt is. +webauthn_error_timeout = Tied överweggahn ehr dien Slötel lesen worden kunn. Bidde laad deese Sied neei un versöök dat noch eenmaal. +mirror = Spegel +new_project = Nejes Projekt +new_project_column = Neje Rieg +admin_panel = Sied-Administreren +settings = Instellens +your_profile = Profil +your_starred = Steern sett +your_settings = Instellens +new_repo.title = Nejes Repositorium +new_org.title = Neje Vereenigung +new_repo.link = Nejes Repositorium +all = All +mirrors = Spegels +forks = Gabels +activities = Doon +pull_requests = Haalvörslagen +issues = Gefallens +milestones = Markstenen +ok = Jau +cancel = Ofbreken +rerun = Weer lopen laten +rerun_all = All Upgavens weer lopen laten +save = Sekern +add_all = All hentofögen +remove = Wegdoon +remove_all = All wegdoon +remove_label_str = Ding »%s« wegdoon +edit = Bewarken +view = Wiesen +test = Testen +enabled = Anknipst +disabled = Utknipst +locked = Tosloten +copy = Koperen +copy_generic = To Tüskenavlaag koperen +copy_url = URL koperen +copy_hash = Prüfsumm koperen +copy_content = Inholl koperen +copy_branch = Twiegnaam koperen +copy_success = Kopeert! +copy_error = Koperen fehlslagen +write = Schrieven +preview = Utkiek +loading = Lädt … +error = Fehler +error404 = De Sied, wat du söchst, gifft dat of nich, of se is lösket worden of du hest nich de Rechten, se antokieken. +error413 = Du hest diene Quote överweggahn. +go_back = Torügg gahn +invalid_data = Ungültiger Weert: %v +never = Nie +unknown = Unbekannt +rss_feed = RSS-Schuuv +pin = Faststeken +unpin = Lösssteken +artifacts = Objekten +confirm_delete_artifact = Willst du dat Objekt »%s« würrelk lösken? +archived = Archiveert +concept_user_individual = Enkelt +concept_code_repository = Repositorium +show_log_seconds = Sekünnen wiesen +show_full_screen = Hele Billschirm wiesen +download_logs = Utgaav runnerladen +name = Naam +value = Weert +filter = Filter +filter.is_archived = Archiveert +filter.not_archived = Nich archiveert +filter.is_fork = Gabels +filter.not_fork = Nich Gabels +filter.not_mirror = Nich Spegels +filter.is_template = Vörlagen +filter.not_template = Nich Vörlagen +filter.public = Publik +filter.private = Privaat +new_migrate.link = Nejer Umtreck +concept_system_global = Överall +new_migrate.title = Nejer Umtreck +retry = Weer versöken +sources = Quellen +show_timestamps = Tiedstempels wiesen +confirm_delete_selected = Willst du all de utköört Dingen lösken? +collaborative = Mitnanner arbeiden +add = Hentofögen +copy_type_unsupported = Deese Aard vun Datei kann nich kopeert worden +new_org.link = Neje Vereenigung +concept_user_organization = Vereenigung +filter.clear = Filters leegmaken +filter.is_mirror = Spegels +copy_path = Padd koperen + +[search] +search = Söken … +type_tooltip = Söök-Aard +fuzzy = um de Slag +fuzzy_tooltip = Ok Resultaten wiesen, wat dicht to de Söökwoorden passen +union = Passt +union_tooltip = Resultaten wiesen, wat to eets of anner vun de mit Leegtekens trennt Söökwoorden passen +exact = akkeraat +exact_tooltip = Blots Resultaten wiesen, wat akkeraat to de Söökwoord passen +regexp = RegEx +regexp_tooltip = De Söökwoord as Regel-Utdruck behanneln +repo_kind = In Repos söken … +user_kind = In Brukers söken … +org_kind = In Vereenigungen söken … +team_kind = In Klottjen söken … +project_kind = In Projekten söken … +commit_kind = In Kommitterens söken … +runner_kind = In Lopers söken … +no_results = Nix funnen, wat passt. +milestone_kind = In Markstenen söken … +pull_kind = In Haalvörslagens söken … +code_search_unavailable = Quelltext-Söök is stedenwies nich verföögbaar. Bidde kuntakteer de Sied-Chef. +branch_kind = In Twiegen söken … +code_kind = In Quelltext söken … +package_kind = In Paketen söken … +issue_kind = In Gefallens söken … +keyword_search_unavailable = Woorden-Söök is stedenwies nich verföögbaar. Bidde kuntakteer de Sied-Chef. +code_search_by_git_grep = Stedenwies Quelltext-Söök-Resultaten worden vun »git grep« paraatstellt. Wenn de Sied-Chef de Quelltext-Indizerer anknipst, kann dat betere Resultaten geven. + +[aria] +navbar = Navigerens-Balken +footer = Footbalken +footer.software = Över deeses Programm +footer.links = Verwiesens + +[heatmap] +number_of_contributions_in_the_last_12_months = %s Bidragens in de lesten 12 Maanten +contributions_zero = Keene Bidragens +contributions_format = {contributions} am {day}. {month} {year} +contributions_one = Bidrag +less = Minner +more = Mehr +contributions_few = Bidragens + +[editor] +buttons.bold.tooltip = Fetten Text hentofögen +buttons.italic.tooltip = Schüünen Text hentofögen +buttons.quote.tooltip = Text ziteren +buttons.code.tooltip = Quelltext hentofögen +buttons.link.tooltip = Verwies hentofögen +buttons.list.unordered.tooltip = Punkierte List hentofögen +buttons.list.task.tooltip = List vun Upgavens hentofögen +buttons.mention.tooltip = Eenen Bruker of eene Klottje nömen +buttons.ref.tooltip = Een Gefall of Haalvörslag nömen +buttons.switch_to_legacy.tooltip = In Stee daarvun de olle Bewarker bruken +buttons.disable_monospace_font = Fastbreden-Schrift utknipsen +buttons.indent.tooltip = Dingen um een Stand inschuven +buttons.unindent.tooltip = Dingen um een Stand utschuven +buttons.heading.tooltip = Överschrift hentofögen +buttons.list.ordered.tooltip = Nummereerte List hentofögen +buttons.enable_monospace_font = Fastbreden-Schrift anknipsen +buttons.new_table.tooltip = Tabell hentofögen +table_modal.header = Tabell hentofögen +table_modal.placeholder.header = Kopprieg +table_modal.placeholder.content = Inholl +table_modal.label.rows = Riegen +table_modal.label.columns = Striepen +link_modal.url = Url +link_modal.description = Beschrieven +link_modal.header = Föög eenen Verwies hento +link_modal.paste_reminder = Wenk: Wenn in diener Tüskenavlaag eene URL is, kannst du se stracks in de Bewarker infögen, um eenen Verwies to maken. + +[filter] +string.desc = Z – A +string.asc = A – Z + +[error] +not_found = Dat Enn kunn nich funnen worden. +network_error = Nettwark-Fehler +server_internal = Binnerer Server-Fehler +occurred = Een Fehler is uptreden +report_message = Wenn du glöövst, dat dat een Fehler mit Forgejo is, dann söök bidde up Codeberg na Gefallens of maak falls nödig een nejes Gefall op. + +[startpage] +app_desc = Een sülvst-hostet Git-Deenst sünner Pien +install = Licht to installeren +lightweight = Lichtgewichtig +lightweight_desc = Forgejo hett minne Minnstanförderns un kann sülvst up eenem billigen Raspberry Pi lopen. Spaar diener Maschien Stroom! +platform_desc = Forgejo löppt nawieselk up frejen Bedrievssysteemen as Linux un FreeBSD, un ok up verschedenen CPU-Architekturen. Köör ut, welke du am leevsten hest! +license = Quellopen +platform = Över all Plattformen +license_desc = Gah un haal di Forgejo! Maak bi uns mit, um dat Projekt noch beter to maken. Wees nich schüchtern, een Bidrager to wesen! +install_desc = Du kannst dat Programm eenfach up diener Plattfoorm utföhren, dat mit Docker verdeel, of dat as Paket halen. + +[home] +uname_holder = Brukernaam of E-Mail-Adress +switch_dashboard_context = Kontor-Umgeven wesseln +my_repos = Repositoriums +my_orgs = Vereenigungen +view_home = %s wiesen +filter_by_team_repositories = Na Klottjen-Repositoriums filtern +feed_of = Schuuv vun »%s« +show_archived = Archiveert +show_only_unarchived = Wiest blots nich archiveert +show_private = Privaat +show_only_private = Wiest blots privaat +show_only_public = Wiest blots publik +show_only_archived = Wiest blots archiveert +issues.in_your_repos = In dienen Repositoriums +filter = Anner Filters +show_both_archived_unarchived = Wiest archiveert un nicht archiveert +show_both_private_public = Wiest publik un privaat + +[explore] +repos = Repositoriums +users = Brukers +stars_one = %d Steern +stars_few = %d Steerns +forks_one = %d Gabel +forks_few = %d Gabels +go_to = Gah to +code = Quelltext +code_last_indexed_at = Tolest indizeert %s +relevant_repositories_tooltip = Repositoriums, wat Gabels sünd of wat keene Themen, keen Bill un keen Beschrieven hebben, sünd versteekt. +relevant_repositories = Blots Repositoriums vun Belang worden wiest; wies Resultaten sünner Filter. +organizations = Vereenigungen + +[auth] +create_new_account = Konto vermarken +disable_register_prompt = Registreren is utknipst. Bidde kuntakteer de Sied-Chef. +disable_register_mail = E-Mail-Utwiesen för ’t Registreren is utknipst. +manual_activation_only = Kuntakteer de Sied-Chef, um dat Aktiveren oftosluten. +remember_me = Deeses Gereed marken +forgot_password = Passwoord vergeten? +hint_register = Bruukst du een Konto? Registreer di nu. +sign_up_button = Registreer di nu. +sign_up_successful = Dien Konto is anleggt worden. Willkomen! +must_change_password = Verneei dien Passwoord +active_your_account = Aktiveer dien Konto +account_activated = Konto is aktiveert worden +prohibit_login = Konto is sperrt +resent_limit_prompt = Du hest körtens eerst eene Aktiverens-E-Mail anfordert. Bidde wacht 3 Menüten un versöök dat dann weer. +change_unconfirmed_email_summary = Änner de E-Mail-Adress, waar de Aktiverens-E-Mail hen schickt wordt. +send_reset_mail = Torügghalens-E-Mail schicken +reset_password = Konto torügghalen +invalid_code = Diene Utwies-Tahl is ungültig of avlopen. +invalid_password = Dien Passwoord passt nich to de Passwoord, wat bruukt worden is, um dat Konto intorichten. +reset_password_helper = Konto torügghalen +reset_password_wrong_user = Du büst as %s anmellt, aver de Konto-Torügghalens-Verwies is för %s dacht +allow_password_change = Verlangen, dat de Bruker sien Passwoord ännert (anraadt) +change_unconfirmed_email = Wenn du bi’m Registreren de falske E-Mail-Adress angeven hest, kannst du se ünnern ännern, un de Utwies-Naricht word in Stee daarvun to de neje Adress schickt. +forgot_password_title = Passwoord vergeten +hint_login = Hest du al een Konto? Nu anmellen! +change_unconfirmed_email_error = Kann de E-Mail-Adress nich ännern: %v +prohibit_login_desc = Dien Konto is daartegen sperrt worden, mit de Instanz to warken. Kuntakteer de Instanz-Chef, um weer Togang to kriegen. +resend_mail = Klick hier, um de Aktiverens-E-Mail neei to schicken +invalid_code_forgot_password = Diene Utwies-Tahl is ungültig of avlopen. Klick hier, um eene neje Sitzung to begünnen. +verify = Utwiesen +scratch_code = Eenmaalpasswoord +use_scratch_code = Een Eenmaalpasswoord bruken +login_userpass = Anmellen +oauth_signup_submit = Konto ofsluten +oauth_signin_tab = Mit eenem bestahn Konto verbinnen +oauth_signin_submit = Konto verbinnen +openid_connect_submit = Verbinnen +authorize_application = Programm verlöven +authorize_application_created_by = Deeses Programm is vun %s maakt worden. +authorize_title = »%s« verlöven, up dien Konto totogriepen? +authorization_failed = Verlööv fehlslagen +back_to_sign_in = Torügg tum Anmellen +openid_register_title = Nejes Konto maken +password_pwned_err = Kunn Anfraag to HaveIBeenPwned nich ofsluten +password_too_short = Passwoord kann nich körter as %d Bookstavens wesen. +email_domain_blacklisted = Du kannst di nich mit deener E-Mail-Adress registreren. +authorize_redirect_notice = Du worst na %s umleit, wenn du deeses Programm verlöövst. +oauth.signin.error.access_denied = De Anmell-Anfraag is oflehnt worden. +last_admin = Du kannst de leste Chef nich wegdoon. Dat mutt tominnst eenen Chef geven. +unauthorized_credentials = Anmell-Informatioon is falsk of avlopen. Bidde versöök de Örder noch eenmaal of kiek för mehr Informatioonen %s an +twofa_scratch_token_incorrect = Dien Eenmaalpasswoord is falsk. +sign_in_openid = Mit OpenID wiedermaken +oauth_signup_tab = Nejes Konto vermarken +oauth_signup_title = Nejes Konto ofsluten +oauth_signin_title = Mell di an, um dat Konto-Verbinnen to verlöven +openid_connect_title = Mit eenem bestahn Konto verbinnen +confirmation_mail_sent_prompt = Eene neje Utwiesens-E-Mail is an %s schickt worden. Um dat Registreren oftosluten, kiek bidde in dienen E-Mail-Ingang un folg de Verwies daarin in de anner %s. Wenn de E-Mail falsk is, kannst du di anmellen un eene neje Utwiesens-E-Mail an eene anner E-Mail-Adress verlangen. +reset_password_mail_sent_prompt = Eene neje Utwiesens-E-Mail is an %s schickt worden. Um dat Konto-Torügghalen oftosluten, kiek bidde in dienen E-Mail-Ingang un folg de Verwies daarin in de anner %s. +has_unconfirmed_mail = Moin %s, du hest eene nich utwiesen E-Mail-Adress (%s). Wenn du keene Utwiesens-E-Mail kregen hest of eene neje bruukst, klick bidde up de Knoop unnern. +non_local_account = Frömde Brukers könen hör Passwoord nich dör de Forgejo-Internett-Brukerschnittstee vernejen. +openid_register_desc = De utköört OpenID-URI is unbekannt. Verbinn dat hier mit eenem nejen Konto. +disable_forgot_password_mail = Konto-Torügghalen is utknipst, denn keene E-Mail is inricht. Bidde kuntakteer dienen Sied-Chef. +authorize_application_description = Wenn du de Togang verlöövst, kann dat all diene Konto-Informatioon lesen un schrieven, ok privaate Repos un Vereenigungen. +authorization_failed_desc = Dat Anmellen is fehlslagen, denn wi hebben eene ungültig Anfraag funnen. Bidde kuntakteer de Chef vun de Programm, wat du anmellen willst. +twofa_scratch_used = Du hest dien Eenmaalpasswoord bruukt. Du büst to de Twee-Faktooren-Instellens-Sied umleit worden, waar du 2FA utknipsen of een nejes Eenmaalpasswoord maken kannst. +oauth.signin.error.temporarily_unavailable = Anmellen fehlslagen, denn de Anmell-Server is jüüst nich verföögbaar. Bidde versöök dat naher noch eenmaal. +twofa_passcode_incorrect = Diene Pass-Tahl is falsk. Wenn du diene Gereedskupp nich finnen kannst, bruuk tum Anmellen dien Eenmaalpasswoord. +disable_forgot_password_mail_admin = Konto-Torügghalen is blots verföögbaar, wenn E-Mail inricht is. Bidde richt E-Mail in, um Konto-Torügghalen antoknipsen. +oauth.signin.error = Bi’m Verarbeiden vun de Anmellens-Anfraag is een Fehler uptreden. Wenn de Fehler wieder uptreddt, kuntakteer bidde de Sied-Chef. +openid_connect_desc = De utköört OpenID-URI is unbekannt. Verbinn dat hier mit eenem nejen Konto. +openid_signin_desc = Giff diene OpenID-URI in. To’n Bispööl: alice.openid.example.org of https://openid.example.org/alice. +password_pwned = Dat Passwoord, wat du utköört hest, is up eener List vun klaut Passwoorden, wat tovör in publiken Datenbröken blootmaakt worden is. Bidde versöök dat noch eenmaal mit eenem anner Passwoord, un överlegg di, of du deeses Passwoord ok annerwaar ännern willst. +use_onetime_code = Een Eenmaal-Bruuk-Passwoord bruken + +[mail] +view_it_on = Up %s wiesen +activate_account = Bidde aktiveer dien Konto +register_notify.text_1 = dat is diene Registrerens-Utwiesen-E-Mail för %s! +register_notify.text_3 = Wenn well anners deeses Konto för di maakt hett, muttst du toeerst dien Passwoord setten. +reset_password = Haal dien Konto torügg +password_change.text_1 = Dat Passwoord för dien Konto is jüüst ännert worden. +totp_disabled.subject = TOTP is utknipst +totp_disabled.text_1 = Tied-baseert Eenmaalpasswoord (TOTP) för dien Konto is jüüst utknipst worden. +totp_disabled.no_2fa = Keene anner 2FA-Aarden sünd mehr inricht, sodat dat nu nich mehr nödig is, dat du di mit 2FA to dien Konto anmellst. +removed_security_key.subject = Een Sekerheids-Slötel is wegdaan worden +removed_security_key.text_1 = Sekerheids-Slötel »%[1]s« is jüüst ut dienem Konto wegdaan worden. +account_security_caution.text_1 = Wenn du dat weerst, kannst du deese E-Mail seker minnachten. +account_security_caution.text_2 = Wenn du dat nich weerst, hett well in dien Konto inbroken. Bidde kuntakteer de Sied-Chefs. +register_success = Registreren kumpleet +issue_assigned.pull = @%[1]s hett di to Haalvörslag %[2]s in Repositorium %[3]s towiesen. +issue.action.reopen = @%[1]s hett #%[2]d weer opmaakt. +issue.action.merge = @%[1]s hett #%[2]d in %[3]s tosamenföhrt. +issue.action.reject = @%[1]s hett um Änners för deesen Haalvörslag beden. +issue.action.ready_for_review = @%[1]s hett deesen Haalvörslag as klaar tum Nakieken markeert. +issue.action.new = @%[1]s hett #%[2]d opmaakt. +release.new.subject = %s in %s publik maakt +release.note = Notiz: +release.downloads = Runnerladen: +repo.transfer.subject_to = %s will Repositorium »%s« to %s överdragen +repo.transfer.to_you = du +link_not_working_do_paste = Gaht de Verwies nich? Versöök, dat to koperen un in de URL-Rieg vun dienem Browser intofögen. +hi_user_x = Moin %s, +activate_account.text_2 = Bidde klick up deesen Verwies, um dien Konto binnen %s to aktiveren: +admin.new_user.user_info = Bruker-Informatioon +activate_email.text = Bidde klick up deesen Verwies, um diene E-Mail-Adress binnen %s uttowiesen: +reset_password.text = Wenn du dat weerst, klick bidde up deesen Verwies, um dien Konto binnen %s torüggtohalen: +password_change.subject = Dien Passwoord is ännert worden +issue_assigned.issue = @%[1]s hett di to Gefall %[2]s in Repositorium %[3]s towiesen. +issue.action.push_1 = @%[1]s hett %[3]d Kommitteren to %[2]s schuven +issue.action.push_n = @%[1]s hett %[3]d Kommitterens to %[2]s schuven +activate_account.text_1 = Moin %[1]s, wees bedankt, dat du di up %[2]s registreert hest! +issue.action.review_dismissed = @%[1]s hett dat leste Nakieken vun %[2]s för deesen Haalvörslag ofseggt. +issue.in_tree_path = In %s: +reply = of anter deeser E-Mail stracks +activate_email = Wies diene E-Mail-Adress ut +admin.new_user.subject = Nejer Bruker %s jüüst registreert +register_notify = Willkomen up %s +register_notify.text_2 = Du kannst di to dien Konto mit dienem Brukernaam anmellen: %s +primary_mail_change.text_1 = De Höövd-E-Mail-Adress vun dienem Konto is jüüst to %[1]s ännert worden. Dat heet, dat deese E-Mail-Adress keene E-Mail-Narichtens för dien Konto mehr kriegen word. +release.title = Titel: %s +repo.collaborator.added.subject = %s hett di to %s as Mitarbeider hentoföögt +team_invite.text_2 = Bidde klick up deesen Verwies, um de Klottje bitotreden: +issue.action.force_push = %[1]s hett de %[2]s vun %[3]s to %[4]s dwangsschuven. +issue.action.review = @%[1]s hett över deesen Haalvörslag kommenteert. +primary_mail_change.subject = Diene Höövd-E-Mail-Adress is ännert worden +release.new.text = @%[1]s hett %[2]s in %[3]s publik maakt +release.download.targz = Quelltext (TAR.GZ) +repo.collaborator.added.text = Du büst as Mitarbeider to deesem Repositorium hentoföögt worden: +team_invite.text_1 = %[1]s hett di inladen, in de Klottje %[2]s in de Vereenigung %[3]s intotreden. +removed_security_key.no_2fa = Keene anner 2FA-Aarden sünd mehr inricht, sodat dat nu nich mehr nödig is, dat du di mit 2FA to dien Konto anmellst. +totp_enrolled.subject = Du hest TOTP as 2FA-Aard anknipst +totp_enrolled.text_1.no_webauthn = Du hest jüüst TOTP för dien Konto anknipst. Dat heet, dat du bi all tokünftig Anmellens TOTP as 2FA-Aard bruken muttst. +totp_enrolled.text_1.has_webauthn = Du hest jüüst TOTP för dien Konto anknipst. Dat heet, dat du bi all tokünftig Anmellens TOTP as 2FA-Aard of eets vun dien Sekerheids-Slötels bruken kannst. +issue.x_mentioned_you = @%s hett di nöömt: +issue.action.approve = @%[1]s hett deesem Haalvörslag tostimmt. +repo.transfer.subject_to_you = %s will Repositorium »%s« to di överdragen +team_invite.text_3 = Wahrschau: Deese Inladen weer för %[1]s dacht. Wenn du deese Inladen nich verwacht hest, kannst du deese E-Mail minnachten. +issue.action.close = @%[1]s hett #%[2]d dichtmaakt. +repo.transfer.body = Um dat antonehmen of oftolehnen, besöök %s, of ignoreer dat eenfach. +release.download.zip = Quelltext (ZIP) +team_invite.subject = %[1]s hett di inladen, in de Vereenigung %[2]s intotreden +admin.new_user.text = Bidde klick hier, um deesen Bruker vun de Chef-Paneel to verwalten. + +[modal] +no = Nee +confirm = Utwiesen +cancel = Ofbreken +yes = Jau +modify = Vernejen + +[form] +UserName = Brukernaam +FullName = Kumpleter Naam +Pronouns = Pronomens +Biography = Levensloop +Website = Internett-Sied +Location = Stee +RepoName = Repositoriums-Naam +TeamName = Klottjen-Naam +AuthName = Verlööv-Naam +AdminEmail = Chef-E-Mail +AccessToken = Togang-Teken +CommitMessage = Kommitteren-Naricht +TreeName = Dateipadd +SSPISeparatorReplacement = Trenner +SSPIDefaultLanguage = Normaalspraak +email_error = ` is keene gültige E-Mail-Adress.` +captcha_incorrect = De CAPTCHA-Tahl is falsk. +username_been_taken = Deeser Brukernaam word al bruukt. +To = Twieg-Naam +CommitChoice = Kommitteren-Utköör +git_ref_name_error = ` mutt een gültig Git-Beteekner-Naam wesen.` +include_error = ` mutt de Text »%s« enthollen.` +password_not_match = De Passwoorden passen nich. +Password = Passwoord +Content = Inholl +require_error = ` kann nich leeg wesen.` +alpha_dash_error = ` sall nix as alphanumerisk Bookstavens un Binnestrekens (»-«) un Unnerstrekens (»_«) enthollen.` +size_error = ` mutt de Grött %s hebben.` +glob_pattern_error = ` Glob-Muster is ungültig: %s.` +Email = E-Mail-Adress +Retype = Passwoord utwiesen +CommitSummary = Kommitteren-Tosamenfaten +Description = Beschrieven +NewBranchName = Nejer Twieg-Naam +min_size_error = ` mutt tominnst %s Bookstavens enthollen.` +regex_pattern_error = ` Regex-Muster is ungültig: %s.` +username_error_no_dots = ` kann nix as alphanumerisk Bookstavens (»0-9«, »a-z«, »A-Z«) un Binnestrekens (»-«) un Unnerstrekens (»_«) enthollen. ’t kann nich mit nich-alphanumerisk Bookstavens begünnen of ennen, un ’t düür nich twee nich-alphanumerisk Bookstavens stracks achternanner geven.` +lang_select_error = Köör eene Spraak ut de List ut. +alpha_dash_dot_error = ` sall nix as alphanumerisk Bookstavens un Binnestrekens (»-«), Unnerstrekens (»_«) un Punkten (».«) enthollen.` +max_size_error = ` düür nich mehr as %s Bookstavens enthollen.` +url_error = `»%s« is keene gültige URL.` +username_error = ` kann nix as alphanumerisk Bookstavens (»0-9«, »a-z«, »A-Z«) un Binnestrekens (»-«), Unnerstrekens (»_«) un Punkten (».«) enthollen. ’t kann nich mit nich-alphanumerisk Bookstavens begünnen of ennen, un ’t düür nich twee nich-alphanumerisk Bookstavens stracks achternanner geven.` +invalid_group_team_map_error = ` Towiesen is ungültig: %s` +unknown_error = Unbekannter Fehler: +repo_name_been_taken = De Repositoriums-Naam word al bruukt. +username_change_not_local_user = Frömde Brukers düren hör Brukernaam nich ännern. +repository_files_already_exist.adopt = Dateien för deeses Repositorium gifft ’t al un kann blots övernohmen worden. +repository_files_already_exist.delete = Dateien för deeses Repositorium gifft ’t al. Du muttst se lösken. +password_uppercase_one = Tominnst een Grootbookstaav +password_digit_one = Tominnst eene Tahl +enterred_invalid_repo_name = De Repositoriums-Naam, wat du ingeven hest, is falsk. +enterred_invalid_org_name = De Vereenigungs-Naam, wat du ingeven hest, is falsk. +enterred_invalid_owner_name = De neje Eegner-Naam is nich gültig. +user_not_exist = De Bruuker gifft ’t nich. +team_not_exist = De Klottje gifft ’t nich. +unset_password = De Anmell-Bruker hett dat Passwoord nich sett. +last_org_owner = Du kannst nich de leste Bruker ut de »Eegners«-Klottje wegdoon. Eene Vereenigung mutt alltieden tominnst eenen Eegner hebben. +cannot_add_org_to_team = Eene Vereenigung kann nich as Liddmaat hentoföögt worden. +organization_leave_success = Du hest de Vereenigung %s verlaten. +invalid_ssh_key = Kann dienen SSH-Slötel nich utwiesen: %s +repository_force_private = Dwang-Privaat is anknipst: Privaate Repositoriums könen nich publik maakt worden. +repository_files_already_exist.adopt_or_delete = Dateien för deeses Repositorium gifft ’t al. Nehm se an of löske se. +username_password_incorrect = Brukernaam of Passwoord is falsk. +repository_files_already_exist = Dateien för deeses Repositorium gifft ’t al. Kuntakteer de Systeemchef. +email_invalid = De E-Mail-Adress is ungültig. +password_special_one = Tominnst een Sünnerbookstaav (Punkte, Klammern, Anföhrens-Tekens of so wat) +org_name_been_taken = De Vereenigungs-Naam word al bruukt. +team_name_been_taken = De Klottjen-Naam word al bruukt. +team_no_units_error = Verlööv Togang to tominnst eenem Repositoriums-Deel. +email_been_used = De E-Mail-Adress word al bruukt. +enterred_invalid_password = Dat Passwoord, wat du ingeven hest, is falsk. +password_complexity = Passwoord is nich kumplizeert genoog: +invalid_gpg_key = Kann dienen GPG-Slötel nich utwiesen: %s +openid_been_used = De OpenID-Adress »%s« word al bruukt. +password_lowercase_one = Tominnst een Kleenbookstaav +duplicate_invite_to_team = De Bruker is al as Liddmaat inladen. +unsupported_login_type = De Anmell-Aard unnerstütt dat Konto-Lösken nich. +invalid_ssh_principal = Ungültiger Höövdmann: %s +unable_verify_ssh_key = Kann de SSH-Slötel nich utwiesen, bidde kiek noch eenmaal, dat daar keen Fehler drin is. +auth_failed = Verlöven fehlslagen: %v +still_own_repo = Dien Konto is een Eegner vun een of mehr Repositoriums, löske of överdraag se eerst. +still_own_packages = Dien Konto is een Eegner vun een of mehr Paketen, löske se eerst. +org_still_own_repo = Deese Vereenigung is een Eegner vun een of mehr Repositoriums, löske of överdraag se eerst. +target_branch_not_exist = Enn-Twieg gifft ’t nich. +admin_cannot_delete_self = Du kannst di nich sülvst lösken, wenn du een Chef büst. Löske eerst diene Chef-Rechten. +required_prefix = Ingaav mutt mit »%s« begünnen +must_use_public_key = Du hest eenen privaaten Slötel ingeven. Bidde laad dienen privaaten Slötel nienich elkeenwaar up. Bruuk in Stee daarvun dienen publiken Slötel. +still_has_org = Dien Konto is een Liddmaat in een of mehr Vereenigungen, verlaat se eerst. +org_still_own_packages = Deese Vereenigung is een Eegner vun een of mehr Paketen, löske se eerst. +PayloadUrl = Ladung-URL +visit_rate_limit = Frömd-Togriep hett Togrieps-Begrenz troffen. +2fa_auth_required = Frömd-Togriep bruukt Twee-Faktooren-Anmellen. +email_domain_is_not_allowed = De Domään vun de Bruker-E-Mail-Adress %s passt nich mit EMAIL_DOMAIN_ALLOWLIST of EMAIL_DOMAIN_BLOCKLIST. Wees wiss, dat du de E-Mail-Adress recht sett hest. +username_claiming_cooldown = De Brukernaam kann nich nohmen worden, denn siene Ofköhl-Düür is noch nich vörbi. 't kann am %[1]s nohmen worden. + +[user] +change_avatar = Änner dien Kontobill … +joined_on = Am %s bitreden +repositories = Repositoriums +activity = Publikes Doon +followers.title.one = Nagaher +followers.title.few = Nagahers +following.title.one = Gaht na +followers_one = %d Nagaher +followers_few = %d Nagahers +following_one = gaht %d na +following_few = gaht %d na +follow = Nagahn +unfollow = Nich mehr nagahn +block_user = Bruker blockeren +starred = Repositoriums mit Steernen +watched = Beluurt Repositoriums +code = Quelltext +projects = Projekten +following.title.few = Gaht na +overview = Översicht +block = Blockeren +unblock = Nich mehr blockeren +user_bio = Levensloop +email_visibility.limited = All anmellt Brukers könen diene E-Mail-Adress sehn +show_on_map = Deese Stee up eener Kaart wiesen +settings = Bruker-Instellens +disabled_public_activity = Deeser Bruker hett dat publike Ankieken vun de Doon utknipst. +form.name_chars_not_allowed = Brukernaam »%s« enhollt ungültig Bookstavens. +form.name_pattern_not_allowed = Dat Muster »%s« is in eenem Brukernaam nich verlöövt. +form.name_reserved = De Brukernaam »%s« is vörbehollen. +block_user.detail = Bidde wees wiss, dat dat Blockeren vun eenem Bruker anner Resultaten hett, nämlich: +block_user.detail_1 = Jo wordt elkeen anner nich mehr nagahn un eenanner ok nich mehr nagahn könen. +block_user.detail_2 = Deeser Bruker kann nich mit dienen Repositoriums warken, un ok nich mit Gefallens un Kommentaren, wat to maakt hest. +block_user.detail_3 = Jo köönt eenanner nich as Repositoriums-Mitarbeiders hentofögen. +follow_blocked_user = Du kannst deesem Bruker nich nagahn, denn du hest deesen Bruker blockeert of deeser Bruker hett di blockeert. +public_activity.visibility_hint.self_public = Dien Doon is för elkeen sichtbaar, blots nich dat Warken in privaaten Steden. Inrichten. +public_activity.visibility_hint.admin_public = Dien Doon is för elkeen sichtbaar, aver as Chef kannst du ok dat Warken in privaaten Steden sehn. +public_activity.visibility_hint.self_private = Blots du un de Instanz-Chefs könen dien Doon sehn. Inrichten. +public_activity.visibility_hint.admin_private = Du kannst deeses Doon sehn, um dat, dat du een Chef büst, aver de Bruker will, dat dat privaat blievt. +public_activity.visibility_hint.self_private_profile = Blots du un de Instanz-Chefs könen dien Doon sehn, denn dien Profil is privaat. Inrichten. + +[settings] +profile = Profil +security = Sekerheid +repos = Repositoriums +delete = Konto lösken +organization = Vereenigungen +uid = UID +webauthn = Twee-Faktooren-Anmellen (Sekerheids-Slötels) +blocked_users = Blockeert Brukers +public_profile = Publikes Profil +location_placeholder = Deel waar du umslags büst mit Annerns +pronouns = Pronomens +pronouns_custom = Eegene +update_theme = Thema ännern +update_profile = Profil vernejen +update_language_success = Spraak is verneeit worden. +update_profile_success = Dien Profil is verneeit worden. +change_username_prompt = Wahrschau: Wenn du dienen Brukernaam ännerst, ännert sik ok diene Konto-URL. +change_username_redirect_prompt = De olle Brukernaam leit daarhen um, bit well anners hüm nimmt. +continue = Wiedermaken +cancel = Ofbreken +language = Spraak +language.title = Normaalspraak +language.localization_project = Hülp uns, Forgejo in diene Spraak to översetten! Mehr unnerhören. +hints = Wenken +update_hints = Wenken vernejen +update_hints_success = Wenken sünd verneeit worden. +hidden_comment_types = Verburgen Kommentaar-Aarden +hidden_comment_types.issue_ref_tooltip = Kommentaren, waar de Bruker de Twieg/Mark, wat mit deesem Gefall verbunnen is, ännert hett +comment_type_group_branch = Twieg +comment_type_group_time_tracking = Tied-Erfaten +comment_type_group_pull_request_push = Kommitterens hentoföögt +comment_type_group_project = Projekt +comment_type_group_issue_ref = Gefall-Nömen +saved_successfully = Diene Instellens sünd sekert worden. +privacy = Privaatheid +lookup_avatar_by_mail = Kontobill vun E-Mail-Adress söken +enable_custom_avatar = Eegen Kontobill bruken +choose_new_avatar = Nejes Kontobill utkören +update_avatar = Kontobill vernejen +delete_current_avatar = Stedenwies Kontobill lösken +uploaded_avatar_is_too_big = De upladen Dateigrött ((%d KiB) is mehr as verlöövt (%d KiB). +update_avatar_success = Dien Kontobill is verneeit worden. +change_password = Passwoord ännern +update_password = Passwoord vernejen +old_password = Stedenwies Passwoord +new_password = Nejes Passwoord +theme_desc = Deeses Thema word in de Brukerschnittstee bruukt, wenn du anmellt büst. +primary = Höövd +activated = Aktiveert +requires_activation = Mutt aktiveert worden +primary_email = As Höövd setten +activations_pending = Aktiveren staht ut +delete_email = Wegdoon +email_deletion = E-Mail-Adress wegdoon +add_new_openid = Neje OpenID-URI hentofögen +add_email = E-Mail-Adress hentofögen +add_openid = OpenID-URI hentofögen +keep_email_private = E-Mail-Adress verbargen +manage_gpg_keys = GPG-Slötels verwalten +ssh_principal_been_used = Deeser Höövdmann is al to de Server hentoföögt worden. +gpg_key_id_used = Eenen publiken GPG-Slötel mit de sülve ID gifft ’t al. +gpg_token_signature = Beschütt GPG-Unnerschrift +key_signature_gpg_placeholder = Begünnt mit »-----BEGIN PGP SIGNATURE-----« +ssh_key_verified = Utwiest Slötel +ssh_key_verify = Utwiesen +ssh_token = Teken +ssh_token_help = So kannst du de Unnerschrift maken: +ssh_token_signature = Beschütt SSH-Unnerschrift +key_signature_ssh_placeholder = Begünnt mit »-----BEGIN SSH SIGNATURE-----« +verify_ssh_key_success = SSH-Slötel »%s« is utwiest worden. +key_id = Slötel-ID +principal_content = Inholl +add_gpg_key_success = De GPG-Slötel »%s« is hentoföögt worden. +delete_key = Wegdoon +ssh_key_deletion = SSH-Slötel wegdoon +ssh_principal_deletion_success = De Höövdmann is wegdaan worden. +orgs = Vereenigungen +biography_placeholder = Vertell annern een bietje wat över di! (Markdown word unnerstütt) +change_username = Dien Brukernaam is ännert worden. +ui = Thema +additional_repo_units_hint_description = Wiest eenen Wenk »Mehr anknipsen« för Repositoriums, in wat nich all verföögbaar Delen anknipst sünd. +comment_type_group_label = Vermark +comment_type_group_title = Titel +keep_activity_private = Doon vun de Profil-Sied verbargen +appearance = Utsehn +twofa = Twee-Faktooren-Anmellen (TOTP) +update_language_not_found = Spraak »%s« is nich verföögbaar. +hidden_comment_types.ref_tooltip = Kommentaren, waar deeses Gefall vun eenem anner Gefall/Kommitteren/… nöömt worden is +comment_type_group_assignee = Towiesen +comment_type_group_deadline = Anstahn +password_change_disabled = Frömde Brukers könen hör Passwoord nich dör de Forgejo-Internett-Brukerschnittstee vernejen. +manage_openid = OpenID-Adressen +openid_deletion_desc = Wenn du deese OpenID-Adress ut dienem Konto wegdoost, kannst du di nich mehr daarmit anmellen. Wiedermaken? +add_new_email = E-Mail-Adress hentofögen +applications = Programmen +full_name = Kumpleter Naam +update_language = Spraak ännern +update_user_avatar_success = Dat Kontobill vum Bruker is verneeit worden. +ssh_gpg_keys = SSH- un GPG-Slötels +password_incorrect = De stedenwies Passwoord is falsk. +manage_emails = E-Mail-Adressen verwalten +activate_email = Aktiveren schicken +email_deletion_success = De E-Mail-Adress is wegdaan worden. +uploaded_avatar_not_a_image = De upladen Datei is keen Bill. +openid_deletion_success = De OpenID-Adress is wegdaan worden. +openid_desc = OpenID lett di dat Anmellen to eenem frömden Anbeder utlagern. +account = Konto +password = Passwoord +avatar = Kontobill +website = Internett-Sied +pronouns_unspecified = Nich angeven +additional_repo_units_hint = Vörslagen, mehr Repositorium-Delen antoknipsen +comment_type_group_reference = Nömen +comment_type_group_milestone = Marksteen +comment_type_group_lock = Slutens-Tostand +comment_type_group_review_request = Nakiekens-Anfraag +keep_activity_private.description = Dien publikes Doon kann blots vun di un de Instanz-Chefs sehn worden. +ssh_key_deletion_success = De SSH-Slötel is wegdaan worden. +location = Stee +language.description = Deese Spraak word in deenem Konto sekert un na de Anmellen toeerst bruukt. +comment_type_group_dependency = Ofhangen +retype_new_password = Nejes Passwoord utwiesen +change_password_success = Dien Passwoord is verneeit worden. Bruuk vun nu an tum Anmellen dat neje Passwoord. +manage_themes = Normaalthema +theme_update_success = Dien Thema is verneeit worden. +theme_update_error = Dat utköört Thema gifft ’t nich. +add_new_principal = Höövdmann hentofögen +ssh_key_name_used = Dien Konto hett al eenen SSH-Slötel mit de sülven Naam. +gpg_key_verified = Utwiest Slötel +subkeys = Unnerslötels +key_content = Inholl +add_key_success = De SSH-Slötel »%s« is hentoföögt worden. +gpg_key_deletion = GPG-Slötel wegdoon +manage_ssh_principals = SSH-Zertifikaat-Höövdmannen verwalten +openid_deletion = OpenID-Adress wegdoon +add_email_success = De neje E-Mail-Adress is hentoföögt worden. +email_preference_set_success = E-Mail-Instellen is sett worden. +add_openid_success = De neje OpenID-Adress is hentoföögt worden. +ssh_key_been_used = Deeser SSH-Slötel is al to de Server hentoföögt worden. +verify_gpg_key_success = GPG-Slötel »%s« is utwiest worden. +manage_ssh_keys = SSH-Slötels verwalten +add_key = Slötel hentofögen +gpg_key_verify = Utwiesen +gpg_token = Teken +gpg_token_help = So kannst du de Unnerschrift maken: +key_name = Slötel-Naam +gpg_key_deletion_success = De GPG-Slötel is wegdaan worden. +key_content_gpg_placeholder = Begünnt mit »-----BEGIN PGP PUBLIC KEY BLOCK-----« +key_content_ssh_placeholder = Begünnt mit »ssh-ed25519«, »ssh-rsa«, »ecdsa-sha2-nistp256«, »ecdsa-sha2-nistp384«, »ecdsa-sha2-nistp521«, »sk-ecdsa-sha2-nistp256@openssh.com« of »sk-ssh-ed25519@openssh.com« +gpg_key_matched_identities = Passt up Identitäten: +gpg_token_required = Du muttst eene Unnerschrifft för dat Teken unnern angeven +gpg_invalid_token_signature = De angeven GPG-Slötel, Unnerschrift un Teken passen nich tonanner of dat Teken is verollt. +ssh_invalid_token_signature = De angeven SSH-Slötel, Unnerschrift of Teken passen nich tonanner of dat Teken is verollt. +add_principal_success = De SSH-Zertifikaat-Höövdmann »%s« is hentoföögt worden. +gpg_key_deletion_desc = Wenn du eenen GPG-Slötel wegdoost, sünd Kommitterens, wat daarmit unnerschreven sünd, nich mehr utwiest. Wiedermaken? +added_on = Am %s hentoföögt +valid_until_date = Gültig bit %s +no_activity = In de lesten Tied nich bruukt +can_read_info = Lesen +key_state_desc = Deeser Slötel is in de lesten 7 Dagen bruukt worden +show_openid = Im Profil wiesen +hide_openid = Im Profil verbargen +ssh_externally_managed = Deeser SSH-Slötel word för deesen Bruker frömd verwalt +manage_access_token = Togang-Tekens +generate_new_token = Nejes Teken maken +token_name = Teken-Naam +access_token_deletion = Togang-Teken lösken +delete_token_success = Dat Teken is lösket worden. Programmen, wat dat bruken, könen nich mehr up dien Konto togriepen. +repo_and_org_access = Togang to Repositoriums un Vereenigungen +permissions_public_only = Blots publik +permissions_access_all = All (publik, privaat un begrenzt) +select_permissions = Verlöövnissen utkören +permission_no_access = Keen Togang +permission_read = Lesen +permission_write = Lesen un Schrieven +permissions_list = Verlöövnissen: +at_least_one_permission = Du muttst tominnst eene Verlöövnis utkören, um een Teken to maken +manage_oauth2_applications = OAuth2-Programmen verwalten +edit_oauth2_application = OAuth2-Programm bewarken +remove_oauth2_application = OAuth2-Programm wegdoon +gpg_key_verified_long = Slötel is mit eenem Teken utwiest worden un kann bruukt worden, um Kommitterens uttowiesen, wat up elkeen aktiveert E-Mail-Adress för deesen Bruker passen, un daarto ok för de Identitäten, up wat deeser Slötel passt. +valid_forever = Ewig gültig +principal_state_desc = Deeser SSH-Zertifikaat-Höövdmann is in de lesten 7 Dagen bruukt worden +token_state_desc = Deeses Teken is in de lesten 7 Dagen bruukt worden +ssh_disabled = SSH is utknipst +ssh_key_verified_long = Slötel is mit eenem Teken utwiest worden un kann bruukt worden, um Kommitterens uttowiesen, wat up elkeen aktiveert E-Mail-Adress för deesen Bruker passen. +tokens_desc = Deese Tekens geven över de Forgejo-API Togang to dienem Konto. +ssh_token_required = Du muttst eene Unnerschrifft för dat Teken unnern angeven +ssh_key_deletion_desc = Wenn du eenen SSH-Slötel wegdoost, kann he nich mehr up dien Konto togriepen. Wiedermaken? +gpg_no_key_email_found = Deeser GPG-Slötel passt up keene aktiveert E-Mail-Adress, wat mit dien Konto verbunnen is. He kann doch hentoföögt worden, wenn du dat angeven Teken unnerschriffst. +gpg_key_matched_identities_long = De Identitäten, wat in deesem Slötel binnen liggen, passen up deese aktiveert E-Mail-Adressen för deesen Bruker. Kommitterens, wat up deese E-Mail-Adressens passen, könen mit deesem Slötel utwiest worden. +ssh_principal_deletion = SSH-Zertifikaat-Höövdmann wegdoon +can_write_info = Schrieven +generate_token = Teken maken +generate_token_name_duplicate = %s word al as Programm-Naam bruukt. Bidde bruuk eenen nejen. +ssh_principal_deletion_desc = Wenn du eenen SSH-Zertifikaat-Höövdmann wegdoost, kann he nich mehr up dien Konto togriepen. Wiedermaken? +last_used = Tolest bruukt am +ssh_signonly = SSH is stedenwies utknipst, sodat deese Slötels blots tum Utwiesen vun de Kommitterens-Unnerschrift bruukt worden. +generate_token_success = Dien nejes Teken is maakt worden. Kopeer dat nu, denn dat word nich noch eenmaal wiest. +delete_token = Lösken +access_token_deletion_desc = Wenn du een Teken löskest, könen Programmen, wat dat bruken, nich mehr up dien Konto togriepen. Dat kann man nich torüggnehmen. Wiedermaken? +oauth2_applications_desc = OAuth2-Programmen verlöövt dienen Frömdprogrammen, Brukers in deeser Forgejo-Instanz seker antomellen. +remove_oauth2_application_desc = Wenn du een OAuth2-Programm wegdoost, word sien Togriep to all unnerschreven Togang-Tekens torüggnohmen. Wiedermaken? +create_oauth2_application_success = Du hest een nejes OAuth2-Programm hentoföögt. +oauth2_application_name = Programm-Naam +save_application = Sekern +oauth2_client_id = Klient-ID +oauth2_client_secret = Klient-Geheemst +oauth2_regenerate_secret = Geheemst neei maken +oauth2_application_remove_description = Wenn du een OAuth2-Programm wegdoost, kann ’t nich mehr up anmellt Brukerkonten in deeser Instanz togriepen. Wiedermaken? +authorized_oauth2_applications = Anmellt OAuth2-Programmen +revoke_key = Torüggnehmen +revoke_oauth2_grant = Togriep torüggnehmen +revoke_oauth2_grant_description = Wenn du Togriep för deeses Frömdprogramm torügggnimmst, kann deeses Programm nich mehr up diene Daten togriepen. Willst du dat würrelk? +revoke_oauth2_grant_success = Togriep torüggnohmen. +twofa_disable = Twee-Faktooren-Anmellen utknipsen +twofa_scratch_token_regenerate = Eenmaal-Bruuk-Torügghalens-Slötel neei maken +twofa_disable_note = Du kannst dat Twee-Faktooren-Anmellen wenn nödig utknipsen. +twofa_disabled = Twee-Faktooren-Anmellen is utknipst worden. +scan_this_image = Bekiek deeses Bill mit dienem Anmellens-Programm: +remove_oauth2_application_success = Dat Programm is wegdaan worden. +create_oauth2_application = Een nejes OAuth2-Programm hentofögen +update_oauth2_application_success = Du hest dat OAuth2-Programm verneeit. +create_oauth2_application_button = Nejes Programm +oauth2_redirect_uris = Umleit-URIs. Bidde schriev elkeen URI up eene neje Rieg. +twofa_disable_desc = Wenn du Twee-Faktooren-Anmellen utknipst, is dien Konto minner seker. Wiedermaken? +oauth2_regenerate_secret_hint = Geheemst verloren? +oauth2_client_secret_hint = Dat Geheemst word nich weer wiest, nadeem du deese Sied verlettst of neei laadst. Bidde wees wiss, dat du ’t sekert hest. +oauth2_application_edit = Bewarken +twofa_is_enrolled = Dien Konto hett stedenwies Twee-Faktooren-Anmellen anknipst. +twofa_enroll = Twee-Faktooren-Anmellen anknipsen +twofa_not_enrolled = Dien Konto hett stedenwies keen Twee-Faktooren-Anmellen anknipst. +oauth2_application_create_description = OAuth2-Programmen gifft dienen Frömdprogrammen Togriep up Brukers in deeser Instanz. +authorized_oauth2_applications_description = Du hest in deenem eegenen Forgejo-Konto deesen Frömdprogrammen Togriep geven. Bidde nimm Togriep för Programmen, wat nich mehr bruukt worden, torügg. +twofa_scratch_token_regenerated = Dien Eenmaal-Bruuk-Torügghalens-Slötel is nu %s. Bewahr dat an eener sekeren Stee up, denn dat word nich noch eenmaal wiest. +regenerate_scratch_token_desc = Wenn du dienen Torügghalens-Slötel verloren of al tum Anmellen bruukt hest, kannst du ’t hier torüggsetten. +twofa_failed_get_secret = Kunn dat Geheemst nich halen. +webauthn_register_key = Sekerheids-Slötel hentofögen +webauthn_nickname = Spitznaam +webauthn_delete_key_desc = Wenn du eenen Sekerheids-Slötel wegdoost, kannst du di nich mehr daarmit anmellen. Wiedermaken? +link_account = Konto verbinnen +remove_account_link_success = Dat verbunnt Konto is wegdaan worden. +repos_none = Du büst keen Eegner vun elkeen Repositoriums. +orgs_none = Du büst keen Liddmaat in elkeen Vereenigungen. +blocked_users_none = ’t gifft keene blockeerten Brukers. +delete_account = Dien Konto lösken +delete_account_title = Brukerkonto lösken +delete_account_desc = Willst du würrelk deeses Brukerkonto för all Tieden lösken? +email_notifications.enable = E-Mail-Narichtens anknipsen +email_notifications.onmention = Blots bi’m Nömen benarichtigen +email_notifications.submit = E-Mail-Instellen setten +visibility.limited = Begrenzt +blocked_since = Blockeert siet %s +user_block_success = De Bruker is nu blockeert. +webauthn_alternative_tip = Du willst villicht noch eene anner Twedes-Anmellen-Aard inrichten. +manage_account_links_desc = Deese frömden Konten sünd mit dienem Forgejo-Konto verbunnen. +remove_account_link = Verbunnen Konto wegdoon +remove_account_link_desc = Wenn du een verbunnen Konto wegdoost, hett ’t keenen Togriep mehr to dienem Forgejo-Konto. Wiedermaken? +then_enter_passcode = Un giff de Pass-Tahl in, wat dat Programm wiest: +webauthn_delete_key = Sekerheids-Slötel wegdoon +webauthn_key_loss_warning = Wenn du diene Sekerheids-Slötels verlüst, verlüst du ok Togriep to dien Konto. +manage_account_links = Verbunnt Konten +hooks.desc = Föög Internett-Hakens hento, wat för all Repositoriums, vun wat du een Eegner büst, utlööst worden. +email_notifications.andyourown = Un ok för diene eegenen Narichtens +visibility = Bruker-Sichtbaarkeid +visibility.limited_tooltip = Blots anmellt Brukers könen ’t sehn +visibility.private = Privaat +user_unblock_success = De Bruker is nu nich mehr blockeert. +or_enter_secret = Of giff dat Geheemst in: %s +passcode_invalid = De Pass-Tahl is falsk. Versöök dat bidde noch eenmaal. +twofa_enrolled = Twee-Faktooren-Anmellen is för dien Konto nu inricht. Bewahr dienen Eenmaal-Bruuk-Toorügghalens-Slötel (%s) an eener sekeren Stee up, denn dat word nich noch eenmaal wiest. +delete_prompt = Dat lösket dien Brukerkonto för all Tieden. Dat KANN NICH torüggnohmen worden. +visibility.private_tooltip = Blots de Liddmaten vun Vereenigungen, waar du Liddmaat büst, könen ’t sehn +visibility.public = Publik +delete_with_all_comments = Dien Konto is junger as %s. Um Spöök-Kommentaren to vermieden, worden all Kommentaren up Gefallens un HVs daar ok mit lösket. +confirm_delete_account = Lösken utwiesen +email_notifications.disable = Nich över E-Mail benarichtigen +visibility.public_tooltip = Elkeen kann ’t sehen +password_username_disabled = Frömde Brukers könen hör Brukernaam nich ännern. Bidde kuntakteer dienen Sied-Chef för mehr Informatioonen. +profile_desc = Över di +hidden_comment_types_description = Kommentaar-Arden, wat hier utköört sünd, worden in Gefall-Sieden nich wiest. Wenn du to’n Bispööl »Vermark« utköörst, worden all de »›Bruker‹ hett ›Vermark‹ hentoföögt/wegdaan«-Kommentaren wegdaan. +email_desc = Diene Höövd-E-Mail-Adress word för Narichtens, Passwoord-Torügghalen un, wenn se nich verburgen is, Git-Aktioonen över ’t Internett bruukt. +can_not_add_email_activations_pending = Een Aktiveren staht noch ut. Wenn du eene neje E-Mail-Adress hentofögen willst, versöök dat in een paar Menüten noch eenmaal. +email_deletion_desc = De E-Mail-Adress un daarmit verbunnen Informatioon word ut dienem Konto wegdaan. Git-Kommitterens vun deeser E-Mail-Adress worden nich ännert. Wiedermaken? +principal_desc = Deese SSH-Zertifikaat-Höövdmannen sünd mit dienem Konto verbunnen un geven kumpleten Togriep up diene Repositoriums. +add_email_confirmation_sent = Eene Utwiesens-E-Mail is an »%s« schickt worden. Um diene E-Mail-Adress uttowiesen, kiek bidde in dienen E-Mail-Ingang un folg de Verwies daarin in de anner %s. +ssh_desc = Deese publiken SSH-Slötels sünd mit dienem Konto verbunnen. De tohörig privaate Slötel gifft kumpleten Togriep up diene Repositoriums. SSH-Slötels, wat utwiest worden sünd, könen bruukt worden, um SSH-unnerschreven Git-Kommitterens uttowiesen. +keep_email_private_popup = Diene E-Mail-Adress word vun dienem Profil verbargen un is nich de Normaalweert för Kommitterens, wat du över de Internett-Schnittstee maakst, so as Datei-Upladens, Bewarkens un Tosamenföhrens-Kommitterens. In Stee daarvun kann eene besünnere Adress %s bruukt worden, um Kommitterens mit dienem Konto to verbinnen. Deese Instellen ännert keene bestahn Kommitterens. +ssh_helper = Bruukst du Hülp? Kiek de Inföhren an, wo du diene eegenen SSH-Slötels maakst of hülp gewohnten Probleemen of, över wat man mit SSH mennigmaal strukelt. +access_token_desc = Utköört Teken-Verlöövnissen begrenzen dat Anmellen blots up de tohörig API-Padden. Lees de Dokumenteren för mehr Informatioonen. +oauth2_confidential_client = Diskreeter Klient. Köör dat för Programmen ut, wat dat Geheemst diskreet behanneln, as Internett-Sieden. Köör dat nich för stedenwies Programmen ut, as Schrievdisk- un Telefoon-Programmens. +gpg_helper = Bruukst du Hülp? Kiek de Inföhren över GPG an. +gpg_desc = Deese publiken GPG-Slötels sünd mit dienem Konto verbunnen un worden bruukt, um diene Kommitterens uttowiesen. Holl de tohörig privaaten Slötels seker, denn daarmit kann man Kommitterens mit diener Unnerschrift unnerschrieven. +oauth2_application_locked = Forgejo vermarkt vörweg eenige OAuth2-Programmen bi’m Starten, wenn dat in de Instellens anknipst is. Um unverwachts Verhollen to verhinnern, könen se nich bewarkt of wegdaan worden. Bidde kiek för mehr Informatioonen de OAuth2-Dokumenteren an. +twofa_desc = Um dien Konto tegen Passwoordklau to schütten, kannst du een Smart-Telefoon of anner Geraadskupp bruken, um tied-baseerte Eenmaalpasswoorden (»TOTP«) to kriegen. +twofa_recovery_tip = Wenn du dien Geraadskupp verlüst, kannst du eenen Eenmaal-Bruuk-Torügghalens-Slötel bruken, um weer in dien Konto to komen. +webauthn_desc = Sekerheids-Slötels sünd Geraadskuppen, wat kryptographisk Slötels enthollen. Se könen för dat Anmellen mit Twee Faktooren bruukt worden. Sekerheids-Slötels mutten de »WebAuthn Authenticator«-Standard unnerstütten. +user_block_yourself = Du kannst di nich sülvst blockeren. +pronouns_custom_label = Eegene Pronomens +change_username_redirect_prompt.with_cooldown.one = De olle Brukernaam word na eener Ofköhl-Düür vun %[1]d Dag för all Lüü verföögbaar wesen. In de Ofköhl-Düür kannst du de ollen Naam noch torügghalen. +change_username_redirect_prompt.with_cooldown.few = De olle Brukernaam word na eener Ofköhl-Düür vun %[1]d Dagen för all Lüü verföögbaar wesen. In de Ofköhl-Düür kannst du de ollen Naam noch torügghalen. +keep_pronouns_private = Pronomens blots to anmellt Brukers wiesen +keep_pronouns_private.description = Dat word diene Pronomens vun Besökers, wat nich anmellt sünd, verbargen. +quota.rule.exceeded.helper = De Grött vun all Dingen unner deeser Regel all tosamen is hooger as de Quote. +quota.applies_to_user = Deese Quoten-Regeln gellen för dien Konto +storage_overview = Spieker-Översicht +quota = Quote +quota.applies_to_org = Deese Quoten-Regeln gellen för deese Vereenigung +quota.rule.exceeded = Överweggahn +quota.rule.no_limit = Nich begrenzt +quota.sizes.all = All +quota.sizes.repos.all = Repositoriums +quota.sizes.repos.public = Publike Repositoriums +quota.sizes.repos.private = Privaate Repositoriums +quota.sizes.git.all = Git-Inhollen +quota.sizes.git.lfs = Git-LFS +quota.sizes.assets.attachments.all = Anhangen +quota.sizes.assets.attachments.issues = Gefall-Anhangen +quota.sizes.assets.attachments.releases = Publizerens-Anhangen +quota.sizes.assets.packages.all = Paketen +quota.sizes.wiki = Wiki +quota.sizes.assets.all = Objekten +quota.sizes.assets.artifacts = Warkwies-Objekten +access_token_regeneration = Togang-Teken neei maken +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. + +[repo] +rss.must_be_on_branch = Du muttst up eenem Twieg wesen, um eenen RSS-Schuuv to hebben. +admin.manage_flags = Flaggen verwalten +admin.flags_replaced = Repositoriums-Flaggen utwesselt +owner = Eegner +repo_name = Repositoriums-Naam +repo_size = Repositoriums-Grött +size_format = %[1]s: %[2]s; %[3]s: %[4]s +template = Vörlaag +template_select = Köör eene Vörlaag ut +template_helper = Dat Repositorium as Vörlaag bruken +visibility = Sichtbaarkeid +visibility_helper = Repositorium privaat maken +visibility_fork_helper = (Wenn du dat ännerst, ännert dat ok de Sichtbaarkeid vun all Gabels.) +fork_repo = Repositorium gabeln +fork_from = Gabeln vun +already_forked = Du hest %s al gabelt +fork_branch = Twieg, wat to de Gabel, kloont worden sall +open_with_editor = Mit %s opmaken +download_tar = TAR.GZ runnerladen +generate_repo = Repositorium maken +generate_from = Maken ut +repo_desc = Beschrieven +admin.update_flags = Flaggen vernejen +new_repo_helper = In eenem Repositorium sünd all Dateien vun eenem Projekt, ok hör Versioons-Histoorje. Hest du al annerwaar eens? Treck een Repositorium um. +owner_helper = Eenige Vereenigungen worden in de List villicht nich wiest, denn ’t gifft eene Grenz, wo völe Repositoriums man hebben kann. +admin.enabled_flags = Flaggen, wat för deeses Repositorium anknipst sünd: +admin.failed_to_replace_flags = Kunn Repositoriums-Flaggen nich utwesseln +fork_no_valid_owners = Deeses Repositorium kann nich gabelt worden, denn ’t gifft keene gültigen Eegners. +repo_name_helper = Gode Repositoriums-Namen sünd kört, licht to marken un eenmaalige Slötelwoorden. +visibility_helper_forced = Dien Sied-Chef dwingt, dat neje Repositoriums privaat ween mutten. +template_description = Vörlaag-Repositoriums verlöven Brukers, neje Repositoriums mit de sülve Verteeknisstruktur, Dateien un Instellens to maken. +clone_helper = Bruukst du Hülp bi’m Klonen? Besöök Hülp. +repo_lang = Spraak +repo_gitignore_helper = Vörlaag för .gitignore utkören +visibility_description = Blots de Eegner vun de Vereenigung, of de Liddmaten vun de Vereenigung, wenn se deeses Recht hebben, worden dat sehn könen. +fork_to_different_account = To een anner Konto gabeln +fork_visibility_helper = De Sichtbaarkeid vun eenem gabelt Repositorium kann nich ännert worden. +all_branches = All Twiegen +use_template = Deese Vörlaag bruken +repo_desc_helper = Giff een körte Beschrieven in (wenn du willst) +download_zip = ZIP runnerladen +download_bundle = BUNDLE runnerladen +license_helper = Köör eene Lizenz-Datei ut +object_format = Objekt-Formaat +object_format_helper = Objekt-Formaat in deesem Repositorium. Kann naher nich mehr ännert worden. SHA1 is dat, wat am wiedesten unnerstütt word. +readme = LEESMI +readme_helper = Köör eene Vörlaag för de LEESMI-Datei ut +readme_helper_desc = Dat is de Stee, waar du eene kumplete Beschrieven för dien Projekt schrieven kannst. +create_repo = Repositorium maken +default_branch_label = Höövd +default_branch_helper = De Höövd-Twieg is de Grund-Twieg för Haalvörslagens un Quelltext-Kommitterens. +mirror_prune = Schörtjen +mirror_interval_invalid = De Spegel-Tiedofstand is ungültig. +mirror_public_key = Publiker SSH-Slötel +mirror_use_ssh.not_available = SSH is nich tum Anmellen verföögbaar. +mirror_sync = spegelt +mirror_address = Vun URL klonen +mirror_interval = Tiedofstand för ’t Spegeln (gültige Tied-Eenheiden sünd »h«, »m« un »s«). 0 um dat automatisk Spegeln uttoknipsen. (Minnster Ofstand: %s) +issue_labels = Vermarkens +issue_labels_helper = Köör eene Vermarkens-Sammlung ut +license = Lizenz +auto_init = Repositorium inrichten +mirror_sync_on_commit = Spegeln, wenn Kommitterens schuuvt worden +repo_gitignore_helper_desc = Köör ut eener List vun Vörlagen för bekannte Spraken ut, welke Dateien nich verfolgt worden. Normaale Objekten, wat vun de Bauwarktüüg vun elkeen Spraak utgeven worden, sünd in deeser .gitignore dann al enthollen. +default_branch = Höövd-Twieg +mirror_prune_desc = Feern-Verfolgens-Nömens, wat nich mehr bruukt worden, wegdoon +mirror_use_ssh.text = SSH tum Anmellen bruken +license_helper_desc = Eene Lizenz regelt, wat anners mit dienem Quelltext doon un nich doon düren. Nich wiss, welke för dien Projekt passt? Kiek Köör eene Lizenz an. +mirror_denied_combination = Kann nich publiken Slötel un Passwoord tum Anmellen beide tosammen bruken. +mirror_address_desc = Giff de nödigen Anmell-Informatioonen unner »Anmellen« in. +mirror_lfs_endpoint = LFS-Ennpunkt +mirror_last_synced = Tolest spegelt +mirror_password_placeholder = (Nich ännert) +mirror_password_blank_placeholder = (Nich sett) +watchers = Belurers +stargazers = Steernenkiekers +stars_remove_warning = Dat lösket all Steernen vun deesem Repositorium. +forks = Gabels +stars = Steernen +reactions_more = un noch %d daarto +language_other = Anner +adopt_preexisting_label = Dateien övernehmen +delete_preexisting_label = Lösken +delete_preexisting_content = Dateien in %s lösken +delete_preexisting_success = Dateien sünner Eegner in %s lösken +tree_path_not_found_branch = Padd %[1]s gifft ’t nich in Twieg %[2]s +transfer.accept = Överdragen annehmen +transfer.accept_desc = To »%s« överdragen +transfer.reject = Överdragen oflehnen +transfer.no_permission_to_reject = Du hest nich dat Recht, deeses Överdragen oftolehnen. +desc.private = Privaat +desc.public = Publik +desc.template = Vörlaag +desc.archived = Archiveert +template.topics = Themen +template.avatar = Kontobill +template.one_item = Tominnst een Vörlaag-Ding mutt utköört worden +template.invalid = Een Vörlaag-Repositorium mutt utköört worden +migrate_options_lfs_endpoint.label = LFS-Ennpunkt +migrate_options_lfs_endpoint.placeholder = Wenn leeg laten, word de Ennpunkt vun de Kloon-URL avleit +migrate_items = Umtreck-Dingen +migrate_items_wiki = Wiki +migrate_items_milestones = Markstenen +migrate_items_pullrequests = Haalvörslagen +migrate_items_releases = Publizerens +migrate_repo = Repositorium umtrecken +migrate.clone_address = Umtrecken / Klonen vun URL +migrate.failed = Umtreck fehlslagen: %v +migrate.migrate_items_options = Togang-Teken is nödig, um mehr Dingen umtotrecken +migrated_from = Vun %[2]s umtrucken +migrate.migrate = Vun %s umtrecken +migrate.migrating = Treckt vun %s um … +migrate.github.description = Daten vun github.com of eenem GitHub-Enterprise-Server umtrecken. +migrate.gitlab.description = Daten vun gitlab.com of anner GitLab-Instanzen umtrecken. +migrate.codebase.description = Daten vun codebasehq.com umtrecken. +migrate.migrating_git = Git-Daten worden umtrucken +migrate.migrating_topics = Themen worden umtrucken +migrate.migrating_labels = Vermarkens worden umtrucken +migrate.migrating_releases = Publizerens worden umtrucken +migrate.migrating_issues = Gefallens worden umtrucken +migrate.cancel_migrating_title = Umtreck ofbreken +mirror_from = Spegel vun +forked_from = gabelt vun +fork_from_self = Du kannst dien eegen Repositorium nich gabeln. +watch_guest_user = Mell di an, um deeses Repositorium to beluren. +star_guest_user = Mell di an, um eenen Steern up deeses Repositorium to setten. +subscribe.issue.guest.tooltip = Mell di an, um deeses Gefall to abonneren. +watch = Beluren +unwatch = Nich mehr beluren +star = Steern setten +unstar = Steern wegnehmen +download_archive = Repositorium runnerladen +no_desc = Nich beschrieven +quick_guide = Fixanwies +clone_this_repo = Deeses Repositorium klonen +cite_this_repo = Deeses Repositorium ziteren +push_exist_repo = Een bestahn Repositorium vun de Oorderreeg schuven +code = Quelltext +code.desc = Wies Quelltext, Dateien, Kommitterens un Twiegen. +branch = Twieg +tree = Boom +unit_disabled = De Sied-Chef hett deesen Repositoriums-Deel utknipst. +delete_preexisting = Vörbestahn Dateien lösken +desc.internal = Binnern +template.git_content = Git-Inholl (Höövd-Twieg) +template.webhooks = Internett-Hakens +mirror_password_help = Änner de Brukernaam, um een sekert Passwoord to lösken. +author_search_tooltip = Wiest bit to 30 Brukers +transfer.reject_desc = Överdragen to »%s« ofbreken +migrate_options_lfs = LFS-Dateien umtrecken +migrate_items_labels = Vermarkens +migrate.clone_address_desc = De HTTP(S) of Git »clone« URL vun eenem bestahn Repositorium +migrate.invalid_local_path = De stedenwies Padd is ungültig. ’t gifft dat nich of dat is keen Verteeknis. +migrate.gitea.description = Daten vun gitea.com of anner Gitea-Instanzen umtrecken. +fork_guest_user = Mell di an, um deeses Repositorium to gabeln. +fork = Gabeln +adopt_preexisting = Vörbestahn Dateien övernehmen +blame_prior = Schüld vör deeser Ännern wiesen +adopt_search = Giff Brukernaam in, um na Repositoriums sünner Eegner to söken … (leeg laten, um se all to finnen) +adopt_preexisting_success = Vun %s Dateien övernohmen un Repositorium maakt +tree_path_not_found_commit = Padd %[1]s gifft ’t nich in Kommitteren %[2]s +tree_path_not_found_tag = Padd %[1]s gifft ’t nich in Mark %[2]s +desc.sha256 = SHA256 +template.issue_labels = Gefall-Vermarkens +form.name_pattern_not_allowed = Dat Muster »%s« is in eenem Repositoriums-Naam nich verlöövt. +mirror_lfs = Spieker för grote Dateien (LFS) +mirror_lfs_desc = Spegeln vun LFS-Daten anknipsen. +adopt_preexisting_content = Repositorium vun %s maken +transfer.no_permission_to_accept = Du hest nich dat Recht, deeses Överdragen antonehmen. +template.git_hooks = Git-Hakens +archive.title_date = Deeses Repositorium is am %s archiveert worden. Du kannst de Dateien ankieken un ’t klonen, aver du kannst sienen Tostand nich ännern, also nix schuven un keene nejen Gefallens, Haalvörslagen of Kommentaren maken. +form.reach_limit_of_creation_1 = De Eegner is al bi de Grenz vun %d Repositorium. +form.name_reserved = De Repositoriums-Naam »%s« is vörbehollen. +form.string_too_long = De angeven Text is langer as %d Bookstavens. +migrate_items_issues = Gefallens +template.items = Vörlaag-Dingen +template.git_hooks_tooltip = Du kannst jüüst keene Git-Hakens bewarken of lösken, nadeem se hentoföögt sünd. Köör dat blots ut, wenn du de Vörlaag-Repositorium vertraust. +archive.issue.nocomment = Deeses Repositorium is archiveert. Du kannst nich up Gefallens kommenteren. +archive.pull.nocomment = Deeses Repositorium is archiveert. Du kannst nich up Haalvörslagens kommenteren. +form.reach_limit_of_creation_n = De Eegner is al bi de Grenz vun %d Repositoriums. +migrate_options_mirror_helper = Deeses Repositorium word een Spegel wesen +migrate_options_lfs_endpoint.description.local = Een stedenwies Server-Padd word ok unnerstütt. +migrate_items_merge_requests = Tosamenföhren-Vörslagen +migrate.permission_denied = Du düürst keene stedenwies Repositoriums importeren. +archive.title = Deeses Repositorium is archiveert. Du kannst de Dateien ankieken un ’t klonen, aver du kannst sienen Tostand nich ännern, also nix schuven un keene nejen Gefallens, Haalvörslagen of Kommentaren maken. +need_auth = Anmellen +migrate_options = Umtreck-Instellens +migrate.clone_local_path = of een stedenwies Server-Padd +migrate.migrating_failed.error = Umtrecken fehlslagen: %s +migrate.migrating_failed_no_addr = Umtreck fehlslagen. +migrate.migrating_pulls = Haalvörslagen worden umtrucken +empty_message = Deeses Repositorium hett noch keenen Inholl. +migrate.invalid_lfs_endpoint = De LFS-Ennpunkt is nich gültig. +migrated_from_fake = Vun %[1]s umtrucken +migrate.git.description = Een Repositorium blots vun elkeen Git-Deenst umtrecken. +migrate.onedev.description = Daten vun code.onedev.io of anner OneDev-Instanzen umtrecken. +generated_from = maakt vun +migrate.migrating_failed = Umtrecken un %s fehlslagen. +migrate.forgejo.description = Daten vun codeberg.org of anner Forgejo-Instanzen umtrecken. +migrate.gogs.description = Daten vun notabug.org of anner Gogs-Instanzen umtrecken. +migrate.migrating_milestones = Markstenen worden umtrucken +create_new_repo_command = Een nejes Repositorium in de Oorderreeg maken +migrate.cancel_migrating_confirm = Willst du deesen Umtreck ofbreken? +subscribe.pull.guest.tooltip = Mell di an, um deesen Haalvörslag to abonneren. +more_operations = Mehr doon +migrate.gitbucket.description = Daten vun GitBucket-Instanzen umtrecken. +find_tag = Mark finnen +branches = Twiegen +tag = Mark +tags = Markens +issues = Gefallens +pulls = Haalvörslagen +packages = Paketen +actions = Aktioonen +releases = Publizerens +milestones = Markstenen +org_labels_desc_manage = Verwalten +commits = Kommitterens +commit = Kommitteren +n_commit_one = %s Kommitteren +n_commit_few = %s Kommitterens +n_branch_one = %s Twieg +n_tag_one = %s Mark +n_tag_few = %s Markens +n_release_one = %s Publizeren +n_release_few = %s Publizerens +file.title = %s am %s +file_history = Histoorje +file_view_source = Quelltext wiesen +file_view_rendered = Tekent wiesen +file_view_raw = Ruug wiesen +file_permalink = Ewig Verwies +file_too_large = De Datei is to grot tum Wiesen. +file_copy_permalink = Ewig Verwies koperen +view_git_blame = Git-Schüld wiesen +video_not_supported_in_browser = Dien Browser unnerstütt de HTML5-»video«-Mark nich. +audio_not_supported_in_browser = Dien Browser unnerstütt de HTML5-»audio«-Mark nich. +stored_lfs = Mit Git LFS sekert +unescape_control_characters = Inkielen +executable_file = Utföhrbaar Datei +vendored = Verkoperig +generated = Maakt +commit_graph = Kommitterens-Boom +commit_graph.select = Twiegen utkören +commit_graph.monochrome = Eenfarvig +commit_graph.color = Klöör +commit.contained_in = Deeses Kommitteren is enthollen in: +commit.contained_in_default_branch = Deeses Kommitteren is Deel vun de Höövd-Twieg +commit.load_referencing_branches_and_tags = Twiegen un Markens laden, wat deeses Kommitteren nömen +blame = Schüld +download_file = Datei runnerladen +normal_view = Normaale Sicht +line = Rieg +lines = Riegen +from_comment = (Kommentaar) +no_eol.text = Keen Riegenenn +no_eol.tooltip = Deese Datei ennt nich mit eenem Riegenenn-Bookstaven. +editor.add_file = Datei hentofögen +editor.new_file = Neje Datei +editor.edit_file = Datei bewarken +editor.cannot_edit_lfs_files = LFS-Dateien könen nich in de Internett-Schnittstee bewarkt worden. +editor.delete_this_file = Datei lösken +editor.file_delete_success = Datei »%s« is lösket worden. +editor.name_your_file = Benööm diene Datei … +editor.or = of +editor.cancel_lower = Ofbreken +editor.commit_signed_changes = Unnerschrieven Ännerns kommitteren +editor.commit_changes = Ännerns kommitteren +editor.add_tmpl = »<%s>« hentofögen +editor.add_tmpl.filename = Dateinaam +editor.add = %s hentofögen +editor.update = %s vernejen +editor.delete = %s lösken +editor.patch = Plack anwennen +editor.patching = Plackt: +editor.fail_to_apply_patch = Kann Plack »%s« nich anwennen +editor.new_patch = Nejer Plack +editor.commit_message_desc = Wenn du willst, föög een wiederes Beschrieven hento … +editor.commit_directly_to_this_branch = Kommitteer stracks up de %[1]s-Twieg. +editor.propose_file_change = Datei-Ännern vörslagen +editor.new_branch_name = Benööm de Twieg för deeses Kommitteren +editor.new_branch_name_desc = Nejer Twig-Naam … +editor.cancel = Ofbreken +editor.filename_is_invalid = De Dateinaam is ungültig: »%s«. +editor.invalid_commit_mail = Ungültige E-Mail för dat Kommitteren. +editor.branch_does_not_exist = Twieg »%s« gifft dat in deesem Repositorium nich. +editor.branch_already_exists = Twieg »%s« gifft dat in deesem Repositorium al. +editor.filename_is_a_directory = Dateinaam »%s« word in deesem Repositorium al as Verteeknisnaam bruukt. +editor.file_deleting_no_longer_exists = De Datei, wat lösket word, »%s«, gifft dat in deesem Repositorium nich mehr. +editor.file_already_exists = Eene Datei mit de Naam »%s« gifft dat in deesem Repositorium al. +editor.commit_id_not_matching = De Datei is ännert worden, as du se bewarkt hest. Kommitteer up eenen nejen Twieg un föhr dann tosamen. +editor.push_out_of_date = De Schuuv schient verollt to wesen. +editor.commit_empty_file_header = Eene lege Datei kommitteren +editor.no_changes_to_show = ’t gifft keene Ännerns to wiesen. +editor.fail_to_update_file_summary = Fehler-Naricht: +editor.push_rejected_summary = Kumpleete Oflehnens-Naricht: +editor.add_subdir = Verteeknis hentofögen … +editor.upload_file_is_locked = Datei »%s« is vun %s tosluten. +editor.upload_files_to_dir = Dateien to »%s« upladen +editor.cannot_commit_to_protected_branch = Kann nich up schütt Twieg »%s« kommitteren. +editor.no_commit_to_branch = Kann nich stracks to de Twieg kommitteren, denn: +editor.require_signed_commit = Twieg bruuk een unnerschreven Kommitteren +editor.cherry_pick = Rosienenbick %s up: +editor.revert = Nehm %s torügg up: +commits.desc = Stöver dör de Quelltext-Ännerns-Histoorje. +commits.commits = Kommitterens +commits.no_commits = Keene gemeensaamen Kommitterens. »%s« un »%s« hebben kumpleet verscheden Histoorjes. +commits.nothing_to_compare = Deese Twiegen sünd gliek. +commits.search_branch = Deeser Twieg +commits.search_all = All Twiegen +commits.author = Autor +commits.message = Naricht +commits.date = Datum +commits.older = Oller +commits.newer = Nejer +commits.signed_by_untrusted_user_unmatched = Unnerschrieven vun eenem unvertraut Bruker, well nich de Kommitterer is +commits.gpg_key_id = GPG-Slötel-ID +commits.ssh_key_fingerprint = SSH-Slötel-Fingerspoor +commit.operations = Doon +commit.revert = Torüggnehmen +commit.revert-header = Torüggnehmen: %s +commit.cherry-pick = Rosienenbicken +commit.cherry-pick-header = Rosienenbicken: %s +commit.cherry-pick-content = Twieg utkören, up wat du Rosienenbicken willst: +commitstatus.error = Fehler +commitstatus.failure = Fehlslagen +commitstatus.pending = Staht ut +commitstatus.success = Daankregen +projects = Projekten +projects.description_placeholder = Beschrieven +projects.create = Projekt maken +projects.title = Titel +projects.create_success = Dat Projekt »%s« is maakt worden. +projects.deletion = Projekt lösken +projects.deletion_success = Dat Projekt is lösket worden. +projects.edit = Projekt bewarken +projects.edit_subheader = Projekten organiseren Gefallens un verfolgen dat Wiederkomen. +projects.modify = Projekt bewarken +projects.edit_success = Projekt »%s« is verneeit worden. +projects.type.none = Nix +projects.type.basic_kanban = Slichtes Kanban +projects.type.bug_triage = Fehlers verwalten +projects.template.desc = Vörlaag +projects.column.edit = Striep bewarken +projects.column.edit_title = Naam +projects.column.new_title = Naam +projects.column.new_submit = Striep maken +projects.column.set_default = Höövd setten +projects.column.delete = Striep lösken +projects.column.color = Klöör +projects.open = Opmaken +projects.close = Dichtmaken +projects.column.assigned_to = Towiesen an +projects.card_type.images_and_text = Billers un Text +projects.card_type.text_only = Blots Text +issues.filter_assignees = Towiesen filtern +issues.filter_milestones = Marksteen filtern +issues.filter_projects = Projekt filtern +issues.filter_labels = Vermark filtern +issues.new = Nejes Gefall +issues.new.title_empty = Titel kann nich leeg wesen +issues.new.labels = Vermarkens +issues.new.clear_labels = Vermarkens leegmaken +issues.new.projects = Projekten +issues.new.no_projects = Keen Projekt +issues.new.closed_projects = Dichtmaakt Projekten +issues.new.no_items = Keene Dingen +issues.new.milestone = Marksteen +issues.new.no_milestone = Keen Marksteen +issues.new.open_milestone = Open Markstenen +issues.new.closed_milestone = Dichtmaakt Markstenen +issues.new.assignees = Towiesen +issues.new.no_assignees = Keene Towiesens +issues.new.assign_to_me = An mi towiesen +project = Projekten +release = Publizeren +file_follow = Symbolisk Verwies nagahn +editor.signoff_desc = Föög am Enn vun de Kommitterens-Naricht eenen »Signed-off-by«-Nadrag för de Kommitterer hento. +editor.create_new_branch_np = Maak eenen nejen Twieg för deeses Kommitteren. +editor.filename_cannot_be_empty = De Dateinaam kann nich leeg wesen. +labels = Vermarkens +file_raw = Ruug +commit_graph.hide_pr_refs = Haalvörslagen verbargen +editor.upload_file = Datei upladen +editor.preview_changes = Ännerns vörwiesen +filter_branch_and_tag = Twieg of Mark filtern +symbolic_link = Symbolisk Verwies +editor.cannot_edit_non_text_files = Binäärdateien könen nich in de Internett-Schnittstee bewarkt worden. +editor.must_be_on_a_branch = Du muttst up eenem Twieg wesen, um Ännerns an deeser Datei to maken of vörtoslagen. +editor.fork_before_edit = Du muttst deeses Repositorium gabeln, um Ännerns an deeser Datei to maken of vörtoslagen. +n_branch_few = %s Twiegen +released_this = hett dat publizeert +escape_control_characters = Utkielen +editor.edit_this_file = Datei bewarken +editor.this_file_locked = Datei is tosluten +editor.filename_help = Föög een Verteeknis hento, indeem du sienen Naam mit eenem Schüünstreek (»/«) daarna ingiffst. Löske een Verteeknis, indeem du am Begünn vun de Ingaavfeld de Rücktast drückst. +editor.unable_to_upload_files = Kunn de Dateien to »%s« nich upladen mit Fehler: %v +commits.signed_by_untrusted_user = Unnerschrieven vun eenem unvertraut Bruker +projects.deletion_desc = Wenn du een Projekt löskest, word ’t vun all verwandt Gefallens wegnohmen. Wiedermaken? +projects.column.set_default_desc = Deese Striep as de Höövd-Striep för unverwalt Gefallens un Haalvörslagens setten +issues.desc = Fehlermellens, Upgavens un Markstenen organiseren. +issues.new.open_projects = Open Projekten +editor.create_new_branch = Maak eenen nejen Twieg för deeses Kommitteren un maak daarmit eenen Haalvörslag op. +editor.must_have_write_access = Du muttst Schriev-Togriep hebben, um Ännerns an deeser Datei to maken of vörtoslagen. +editor.file_is_a_symlink = `»%s« is een symbolisk Verwies. Symbolisk Verwiesen könen in de Internett-Bewarker nich bewarkt worden` +editor.commit_empty_file_text = De Datei, wat du kommitteren willst, is leeg. Wiedermaken? +editor.push_rejected = De Ännern is vun de Server oflehnt worden. Bidde överprüüf de Git-Hakens. +commits.browse_further = Wiederstövern +projects.description = Beschrieven (wenn du willst) +projects.card_type.desc = Kaart-Vörwiesens +issues.new.no_label = Keene Vermarkens +issues.new.clear_projects = Projekten leegmaken +issues.new.clear_assignees = Towiesens leegmaken +editor.file_editing_no_longer_exists = De Datei, wat bewarkt word, »%s«, gifft dat in deesem Repositorium nich mehr. +editor.user_no_push_to_branch = Bruker kann nich to Twieg schuven +editor.directory_is_a_file = Verteeknisnaam »%s« word in deesem Repositorium al as Dateinaam bruukt. +editor.file_changed_while_editing = De Datei-Inhollens hebben sik ännert, siet du de Datei opmaakt hest. Klick hier, um se to sehn, of kommitteer de Änners weer, um se to överschrieven. +editor.push_rejected_no_message = De Ännern is vun de Server sünner Naricht oflehnt worden. Bidde överprüüf de Git-Hakens. +commits.signed_by = Unnerschrieven vun +commit.revert-content = Twieg utkören, up wat du dat torüggnehmen willst: +projects.desc = Gefallens un Haalvörslagens in Projekt-Bredden verwalten. +projects.new = Nejes Projekt +projects.template.desc_helper = Köör tum Begünnen eene Projekt-Vörlaag ut +editor.fail_to_update_file = Kunn de Datei »%s« nich vernejen/hentofögen. +ext_issues = Frömde Gefallens +projects.column.new = Neje Striep +projects.column.deletion_desc = Wenn du eene Projekt-Striep löskest, worden all Gefallens daarin in de Höövd-Striep verschuven. Wiedermaken? +issues.new.clear_milestone = Marksteen leegmaken +commits.renamed_from = Umbenöömt vun %s +commits.view_path = To deeser Tied in de Histoorje wiesen +issues.filter_reviewers = Nakieker filtern +issues.new.no_reviewers = Keene Nakiekers +issues.choose.open_external_link = Opmaken +issues.choose.blank = Normaal +issues.choose.invalid_templates = %v ungültig Vörlagen(s) funnen +issues.choose.invalid_config = De Gefall-Instellens enthollen Fehlers: +issues.no_ref = Keen Twieg/Mark angeven +issues.new_label = Nejer Vermark +issues.new_label_placeholder = Vermark-Naam +issues.new_label_desc_placeholder = Beschrieven +issues.create_label = Vermark maken +issues.label_templates.helper = Köör eene Vermarkens-Sammlung ut +issues.label_templates.use = Vermarkens-Sammlung bruken +issues.add_labels = hett %[2]s de Vermarkens %[1]s hentoföögt +issues.remove_label = hett %[2]s de Vermark %[1]s wegdaan +issues.add_milestone_at = `hett dat %[2]s to de Marksteen %[1]s hentoföögt` +issues.add_project_at = `hett dat %[2]s to de Projekt %[1]s hentoföögt` +issues.change_milestone_at = `hett %[3]s de Marksteen vun %[1]s to %[2]s ännert` +issues.remove_milestone_at = `hett dat %[2]s vun de Marksteen %[1]s wegdaan` +issues.remove_project_at = `hett dat %[2]s vun de Projekt %[1]s wegdaan` +issues.deleted_milestone = `(lösket)` +issues.deleted_project = `(lösket)` +issues.self_assign_at = `hett dat %s sik sülven towiesen` +issues.remove_self_assignment = `hett sien Towiesen %s wegnohmen` +issues.change_title_at = `hett %[3]s de Titel vun %[1]s to %[2]s ännert` +issues.change_ref_at = `hett %[3]s de Nömen vun %[1]s to %[2]s ännert` +issues.delete_branch_at = `hett %[2]s de Twieg %[1]s lösket` +issues.filter_label = Vermark +issues.filter_label_exclude = `Bruuk Alt+Klick/Enter, um Vermarkens uttosluten` +issues.filter_label_no_select = All Vermarkens +issues.filter_label_select_no_label = Keen Vermark +issues.filter_milestone = Marksteen +issues.filter_milestone_none = Keene Markstenen +issues.filter_milestone_open = Open Markstenen +issues.filter_project = Projekt +issues.filter_project_all = All Projekten +issues.filter_project_none = Keen Projekt +issues.filter_assignee = Towiesen +issues.filter_assginee_no_select = All Towiesens +issues.filter_assginee_no_assignee = Nüms towiesen +issues.filter_poster = Autor +issues.filter_poster_no_select = All Autoren +issues.filter_type.assigned_to_you = Di towiesen +issues.filter_type.mentioning_you = Nöömt di +issues.filter_type.review_requested = Nakieken anfraggt +issues.filter_sort = Sorteren +issues.filter_sort.latest = Neeist +issues.filter_sort.oldest = Ollst +issues.filter_sort.recentupdate = Körtens ännert +issues.filter_sort.leastupdate = Lang nich ännert +issues.filter_sort.mostcomment = Meest kommenteert +issues.filter_sort.leastcomment = Minnst kommenteert +issues.filter_sort.nearduedate = Nahst Anstahns-Datum +issues.filter_sort.farduedate = Feernst Anstahns-Datum +issues.filter_sort.moststars = Meeste Steernen +issues.filter_sort.feweststars = Minnste Steernen +issues.filter_sort.mostforks = Meeste Gabels +issues.action_open = Opmaken +issues.action_close = Dichtmaken +issues.action_label = Vermark +issues.action_milestone = Marksteen +issues.action_assignee = Towiesen +issues.action_check = Utkören/Ofkören +issues.action_check_all = All Dingen Utkören/Ofkören +issues.opened_by = %[1]s vun %[3]s opmaakt +pulls.merged_by_fake = vun %[2]s is %[1]s tosamenföhrt worden +issues.closed_by = vun %[3]s is %[1]s dichtmaakt worden +issues.closed_by_fake = vun %[2]s is %[1]s dichtmaakt worden +issues.opened_by_fake = vun %[2]s is %[1]s opmaakt worden +issues.previous = Vörig +issues.all_title = All +issues.draft_title = Sketts +issues.num_comments_1 = %d Kommentaar +issues.delete_comment_confirm = Willst du deesen Kommentaar würrelk lösken? +issues.context.copy_link = Verwies koperen +issues.context.reference_issue = In nejem Gefall benömen +issues.context.edit = Bewarken +issues.context.delete = Lösken +issues.no_content = Keen Beschrieven angeven. +issues.choose.get_started = Lössleggen +issues.label_templates.fail_to_load_file = Kunn de Vermark-Vörlaag-Datei »%s« nich laden: %v +issues.add_label = hett %[2]s de Vermark %[1]s hentoföögt +issues.add_assignee_at = `is vun %s %s towiesen worden` +issues.action_milestone_no_select = Keen Marksteen +issues.choose.blank_about = Een nejes Gefall vun de Normaal-Vörlaag maken. +issues.create = Gefall maken +issues.label_templates.title = Eene Vermark-Sammlung laden +issues.label_templates.info = Dat gifft noch keene Vermarkens. Maak eenen Vermark mit »Nejer Vermark« of bruuk eene Vermarkens-Sammlung: +issues.change_project_at = `hett %[3]s dat Projekt vun %[1]s to %[2]s ännert` +issues.remove_assignee_at = `is sien Towiesen vun %s %s wegnohmen worden` +issues.open_title = Open +issues.close = Gefall dichtmaken +issues.choose.ignore_invalid_templates = Ungültig Vörlagens sünd ignoreert worden +issues.add_ref_at = `hett %[2]s de Nömen %[1]s hentoföögt` +issues.filter_type.all_issues = All Gefallens +issues.filter_type.created_by_you = Vun di maakt +issues.filter_milestone_closed = Dichtmaakt Markstenen +issues.commented_at = `hett %s kommenteert` +issues.remove_labels = hett %[2]s de Vermarkens %[1]s wegdaan +issues.filter_type = Aard +pulls.merged_by = vun %[3]s is %[1]s tosamenföhrt worden +issues.next = Anner +issues.add_remove_labels = hett %[3]s de Vermarkens %[1]s hentoföögt un %[2]s wegdaan +issues.remove_ref_at = `hett %[2]s de Nömen %[1]s wegdaan` +issues.filter_milestone_all = All Markstenen +issues.filter_type.reviewed_by_you = Vun di nakiekt +issues.filter_sort.fewestforks = Minnste Gabels +issues.action_assignee_no_select = Nich towiesen +issues.closed_title = Dicht +issues.num_comments = %d Kommentaren +issues.context.quote_reply = Antwoord ziteren +issues.comment_pull_merged_at = hett Kommitteren %[1]s in %[2]s %[3]s tosamenföhrt +issues.close_comment_issue = Mit Kommentaar dichtmaken +issues.reopen_comment_issue = Mit Kommentaar weer opmaken +issues.create_comment = Kommenteren +issues.reopened_at = `hett deeses Gefall %[2]s weer opmaakt` +issues.comment_manually_pull_merged_at = hett Kommitteren %[1]s in %[2]s %[3]s vun Hand tosamenföhrt +issues.reopen_issue = Weer opmaken +issues.closed_at = `hett deeses Gefall %[2]s dichtmaakt` +issues.commit_ref_at = `hett deeses Gefall %[2]s vun eenem Kommitteren benöömt` +issues.ref_closing_from = `hett deeses Gefall vun eenem Haalvörslag, wat ’t %[4]s dichtmaken word, %[2]s benöömt` +issues.ref_closed_from = `hett deeses Gefall %[4]s %[2]s dichtmaakt` +issues.ref_reopened_from = `hett deeses Gefall %[4]s %[2]s weer opmaakt` +issues.ref_from = `vun %[1]s` +issues.author = Autor +issues.author.tooltip.pr = Deeser Bruker is de Autor vun deesem Haalvörslag. +issues.role.owner = Eegner +issues.role.owner_helper = Deeser Bruker is de Eegner vun deesem Repositorium. +issues.role.member = Liddmaat +issues.role.collaborator = Mitarbeider +issues.role.first_time_contributor = Nejer Bidrager +issues.role.first_time_contributor_helper = Dat is de eerste Bidrag vun deesem Bruker to deesem Repositorium. +issues.role.contributor = Bidrager +issues.role.contributor_helper = Deeser Bruker hett al wat in deesem Repositorium kommitteert. +issues.remove_request_review = Nakieken-Anfragg wegdoon +issues.remove_request_review_block = Kann Nakiekens-Anfragg nich wegdoon +issues.dismiss_review = Nakieken ofseggen +issues.dismiss_review_warning = Willst du deeses Nakieken würrelk ofseggen? +issues.sign_in_require_desc = Mell di an um mittosnacken. +issues.edit = Bewarken +issues.cancel = Ofbreken +issues.save = Sekern +issues.label_description = Beschrieven +issues.label_color = Klöör +issues.label_exclusive = Sünner annere +issues.label_archive = Vermark archiveren +issues.label_count = %d Vermarkens +issues.label_open_issues = %d open Gefallens/Haalvörslagens +issues.label_edit = Bewarken +issues.label_delete = Lösken +issues.label_modify = Vermark bewarken +issues.label_deletion = Vermark lösken +issues.label_deletion_success = De Vermark is lösket worden. +issues.label.filter_sort.alphabetically = Na de Alphabeet +issues.label.filter_sort.reverse_alphabetically = Umdreiht na de Alphabeet +issues.label.filter_sort.by_size = Lüttste Grött +issues.num_participants_one = %d Mitmaker +issues.num_participants_few = %d Mitmakers +issues.ref_pull_from = `hett deesen Haalvörslag %[4]s %[2]s benöömt` +issues.label_title = Naam +issues.label_archived_filter = Archiveert Vermarkens wiesen +issues.archived_label_description = (Archiveert) %s +issues.ref_issue_from = `hett deeses Gefall %[4]s %[2]s benöömt` +issues.ref_reopening_from = `hett deeses Gefall vun eenem Haalvörslag, wat ’t %[4]s weer opmaken word, %[2]s benöömt` +issues.author.tooltip.issue = Deeser Bruker is de Autor vun deesem Gefall. +issues.role.member_helper = Deeser Bruker is een Liddmaat vun de Vereenigung, wat de Eegner vun deesem Repositorium is. +issues.role.collaborator_helper = Deeser Bruuker is inladen worden, in deesem Repositorium mittoarbeiden. +issues.re_request_review = Nakieken neei anfragen +issues.is_stale = ’t hett siet de Nakieken Ännerns in deesem HV geven +issues.label_deletion_desc = Wenn du een Vermark löskest, word dat vun all Gefallens wegnohmen. Wiedermaken? +issues.label.filter_sort.reverse_by_size = Gröttste Grött +issues.review.review = Nakieken +issues.review.reviewers = Nakiekers +issues.review.show_resolved = Wies lööst +issues.review.hide_resolved = Verbarg lööst +issues.review.resolve_conversation = Snack lösen +issues.attachment.open_tab = `Klick, um »%s« in eener nejen Karteikaart antokieken` +issues.attachment.download = `Klick, um »%s« runnertoladen` +issues.unsubscribe = Ofbestellen +issues.unpin_issue = Gefall lösssteken +issues.lock = Snack tosluten +issues.unlock = Snack upsluten +issues.lock_duplicate = Een Gefall kann nich dübbelt tosluten worden. +issues.unlock_comment = hett deesen Snack %s upsluten +issues.unlock_confirm = Upsluten +issues.lock_confirm = Tosluten +issues.lock.notice_3 = - Du kannst deeses Gefall to elkeen Tied weer upsluten. +issues.unlock.notice_1 = - Elkeenwell kann weer up deesem Gefall kommenteren. +issues.unlock.notice_2 = - Du kannst deeses Gefall to elkeen Tied weer tosluten. +issues.lock.reason = Grund för ’t Tosluten +issues.comment_on_locked = Du kannst nich up een tosloten Gefall kommenteren. +issues.delete = Lösken +issues.delete.title = Deeses Gefall lösken? +issues.tracker = Tied-Erfater +issues.start_tracking_short = Tiednehmer starten +issues.start_tracking = Tied-Erfaten begünnen +issues.stop_tracking_history = `hett %s to warken uphöört` +issues.cancel_tracking = Wegdoon +issues.cancel_tracking_history = `hett %s dat Tied-Erfaten wegdaan` +issues.add_time = Tied vun Hand indragen +issues.del_time = Deese Tied-Upschrift lösken +issues.add_time_short = Tied hentofögen +issues.add_time_cancel = Ofbreken +issues.add_time_history = `hett %s bruukt Tied hentoföögt` +issues.del_time_history = `hett %s bruukt Tied wegdaan` +issues.add_time_hours = Stünnen +issues.add_time_minutes = Menüten +issues.add_time_sum_to_small = Keene Tied is indragen worden. +issues.time_spent_total = Tied bruukt all tosamen +issues.time_spent_from_all_authors = `Tied bruukt all tosamen: %s` +issues.due_date = Anstahns-Datum +issues.push_commit_1 = hett %[2]s %[1]d Kommitteren hentoföögt +issues.push_commits_n = hett %[2]s %[1]d Kommitterens hentoföögt +issues.force_push_compare = Verglieken +issues.due_date_form_edit = Bewarken +issues.due_date_form_remove = Wegdoon +issues.due_date_not_set = Keen Anstahns-Datum sett. +issues.due_date_added = hett %[2]s dat Anstahns-Datum %[1]s hentoföögt +issues.due_date_remove = hett %[2]s dat Anstahns-Datum %[1]s wegdaan +issues.due_date_overdue = Staht al lang an +issues.dependency.title = Ofhangens +issues.dependency.issue_no_dependencies = Keene Ofhangens sett. +issues.dependency.pr_no_dependencies = Keene Ofhangens sett. +issues.dependency.no_permission_1 = Du hest nich de Rechten, um %d Ofhangen to lesen +issues.dependency.no_permission_n = Du hest nich de Rechten, um %d Ofhangens to lesen +issues.dependency.add = Ofhangen hentofögen … +issues.dependency.cancel = Ofbreken +issues.dependency.issue_closing_blockedby = Dat Dichtmaken vun deesem Gefall word vun deesen Gefallens blockeert +issues.dependency.pr_closing_blockedby = Dat Dichtmaken vun deesem Haalvörslag word vun deesen Gefallens blockeert +issues.dependency.pr_close_blocks = Deeser Haalvörslag blockeert dat Dichtmaken vun deesen Gefallens +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.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. +issues.dependency.add_error_dep_issue_not_exist = Ofhangig Gefall gifft dat nich. +issues.dependency.add_error_dep_not_exist = Ofhangen gifft dat nich. +issues.dependency.add_error_dep_exists = Ofhangen gifft dat al. +issues.dependency.add_error_cannot_create_circular = Du kannst keen Ofhangen maken, waar sik twee Gefallens tegensiedig blockeren. +issues.dependency.add_error_dep_not_same_repo = Beide Gefallens mutten in de sülve Repositorium wesen. +issues.review.self.approval = Du kannst nich dien eegen Haalvörslag tostimmen. +issues.review.self.rejection = Du kannst nich up dien eegen Haalvörslag um Ännerns beden. +issues.review.comment = hett %s nakiekt +issues.review.dismissed_label = Ofseggt +issues.review.left_comment = hett kommenteert +issues.review.content.empty = Du muttst eenen Kommentaar geven, wat för Ännerns du hebben willst. +issues.review.reject = hett %s um Ännerns beden +issues.review.remove_review_request = hett %[2]s de Nakieken-Anfraag för %[1]s wegdaan +issues.review.remove_review_request_self = hett %s dat Nakieken verweigert +issues.unlock_error = Kann een Gefall nich upsluten, wenn ’t nich tosloten is. +issues.lock_with_reason = hett dat %[2]s um %[1]s tosluten un Snack up Mitarbeiders begrenzt +issues.unpin_comment = hett dat %s lössstoken +issues.lock.notice_1 = - Anner Brukers könen keene nejen Kommentaren to deesem Gefall hentofögen. +issues.stop_tracking = Tiednehmer anhollen +issues.lock.unknown_reason = Kann een Gefall nich sünner Grund tosluten. +issues.subscribe = Abonneren +issues.max_pinned = Du kannst nich mehr Gefallens faststeken +issues.pin_comment = hett dat %s faststoken +issues.lock_no_reason = hett dat %s tosluten un Snack up Mitarbeiders begrenzt +issues.delete.text = Willst du deeses Gefall würrelk lösken? (Dat lösket för all Tieden all Inhollen. Wenn du ’t blots archiveren willst, maakt ’t lever blots dicht) +issues.start_tracking_history = `hett %s to warken begunnen` +issues.lock.notice_2 = - Du un anner Mitarbeiders mit Togriep to deesem Repositorium köönt wiederhen Kommentaren schrieven, wat elkeenwell sücht. +issues.due_date_modified = hett dat Anstahns-Datum vun %[2]s to %[1]s %[3]s ännert +issues.dependency.issue_remove_text = Dat word de Ofhangen vun deesem Gefall wegdoon. Wiedermaken? +issues.review.approve = hett %s deesen Ännerns tostimmt +issues.review.dismissed = hett %[2]s dat Nakieken vun %[1]s ofseggt +issues.lock.title = Snack up deesem Gefall tosluten. +issues.unlock.title = Snack up deesem Gefall upsluten. +issues.tracker_auto_close = Tiednehmer word automatisk anhollt, wenn dat Gefall dichtmaakt word +issues.dependency.no_permission.can_remove = Du hest nich de Rechten, um deese Ofhangen to lesen, aver du kannst deese Ofhangen wegdoon +issues.dependency.remove_info = Deese Ofhangen wegdoon +issues.dependency.removed_dependency = `hett %s eene Ofhangen wegdaan` +issues.dependency.issue_close_blocked = Du muttst all Gefallens, wat deeses Gefall blockeren, dichtmaken, ehr du dat hier dichtmaken kannst. +issues.review.outdated = Verollt +issues.review.option.show_outdated_comments = Verollte Kommentarens wiesen +issues.review.un_resolve_conversation = Snack weer opmaken +issues.tracking_already_started = `Du hest dat Tied-Erfaten al in eenem anner Gefall begunnen!` +issues.due_date_invalid = Dat Anstahns-Datum is ungültig of buten de Rieg. Bidde bruuk dat Formaat »JJJJ-MM-DD«. +issues.dependency.remove = Wegdoon +issues.dependency.issue_close_blocks = Deeses Gefall blockeert dat Dichtmaken vun deesen Gefallens +issues.review.outdated_description = Inholl hett sik ännert, siet deeser Kommentaar schreven worden is +issues.force_push_codes = `hett %[1]s vun %[2]s to %[4]s %[6]s dwangsschuven` +issues.dependency.pr_remove_text = Dat word de Ofhangen vun deesem Haalvörslag wegdoon. Wiedermaken? +issues.review.pending = Staht ut +issues.review.option.hide_outdated_comments = Verollte Kommentarens verbargen +issues.due_date_form = JJJJ-MM-DD +issues.dependency.added_dependency = `hett %s eene neje Ofhangen hentoföögt` +issues.review.wait = is %s um een Nakieken anfraggt worden +issues.review.add_review_request = hett %[2]s um een Nakieken vun %[1]s anfraggt +issues.review.show_outdated = Wies verollt +issues.review.hide_outdated = Verbarg verollt +issues.content_history.options = Instellens +issues.reference_link = Nömen: %s +compare.compare_base = Grund +compare.compare_head = Verglieken +pulls.desc = Haalvörslagen un Quelltext-Nakiekens anknipsen. +pulls.new = Nejer Haalvörslag +pulls.view = Haalvörslag wiesen +pulls.allow_edits_from_maintainers = Bewarkens vun Liddmaten verlöven +pulls.allow_edits_from_maintainers_err = Vernejen fehlslagen +pulls.compare_changes_desc = Köör de Twieg ut, waarhen tosamenföhrt worden sall, un vun welkem Twieg haalt worden sall. +pulls.has_viewed_file = Ankiekt +pulls.has_changed_since_last_review = Siet lestem Nakieken ännert +pulls.viewed_files_label = %[1]d vun %[2]d Dateien ankiekt +pulls.expand_files = All Dateien verwiedern +pulls.collapse_files = All Dateien tosamenfolden +pulls.compare_base = tosamenföhren na +pulls.compare_compare = halen vun +pulls.switch_head_and_base = Kopp un Grund tuusken +pulls.filter_branch = Twieg filtern +pulls.no_results = Keene Resultaten funnen. +pulls.show_all_commits = All Kommitterens wiesen +pulls.show_changes_since_your_last_review = Ännerns siet dienem lesten Nakieken wiesen +pulls.showing_specified_commit_range = Blots Ännerns vun Kommitterens %[1]s bit %[2]s wiesen +pulls.review_only_possible_for_full_diff = Nakieken gaht blots, wenn de hele Unnerscheed wiest word +pulls.filter_changes_by_commit = Na Kommitteren filtern +pulls.nothing_to_compare = Deese Twiegen sünd gliek. ’t is nich nödig, eenen Haalvörslag to maken. +pulls.nothing_to_compare_have_tag = De utköört Twieg/Mark sünd gliek. +pulls.create = Haalvörslag maken +pulls.title_desc_one = will %[1]d Kommitteren vun %[2]s na %[3]s tosamenföhren +pulls.merged_title_desc_one = hett %[1]d Kommitteren vun %[2]s na %[3]s %[4]s tosamenföhrt +pulls.change_target_branch_at = `hett %[3]s de Enn-Twieg vun %[1]s to %[2]s ännert` +pulls.tab_conversation = Snack +pulls.tab_commits = Kommitterens +pulls.tab_files = Ännert Dateien +pulls.reopen_to_merge = Bidde maak deesen Haalvörslag weer op, um dat Tosamenföhren dörtoföhren. +pulls.cant_reopen_deleted_branch = Deeser Haalvörslag kann nich weer opmaakt worden, denn de Twieg is lösket worden. +pulls.merged = Tosamenföhrt +pulls.merged_success = Haalvörslag tosamenföhrt un dichtmaakt +pulls.closed = Haalvörslag dichtmaakt +pulls.manually_merged = Vun Hand tosamenföhrt +pulls.merged_info_text = De Twieg %s kann nu lösket worden. +pulls.is_closed = De Haalvörslag is dichtmaakt worden. +pulls.title_wip_desc = `Begünn de Titel mit %s, daarmit de Haalvörslag nich ut Versehn tosamenföhrt word.` +pulls.still_in_progress = Noch in de Maak? +pulls.cannot_merge_work_in_progress = Deeser Haalvörslag is as noch in de Maak markeert. +pulls.ready_for_review = Klaar tum Nakieken? +pulls.add_prefix = Dat Präfix %s hentofögen +pulls.remove_prefix = Dat Präfix %s wegdoon +pulls.files_conflicted = Deeser Haalvörslag hett Ännerns, wat mit de Enn-Twieg unverdragelk sünd. +pulls.is_ancestor = Deeser Twieg is al in de Enn-Twieg enthollen. Dat gifft nix tum tosamenföhren. +pulls.is_empty = De Ännerns in deesem Twieg sünd al in de Enn-Twieg. Dat word een leger Kommitteren. +pulls.required_status_check_failed = Eenige nödig Överprüfens sünd fehlslagen. +pulls.required_status_check_missing = Eenige nödig Överprüfens sünd nich daar. +pulls.required_status_check_administrator = As een Chef düürst du deesen Haalvörslag doch tosamenföhren. +pulls.blocked_by_approvals = Deeser Haalvörslag hett noch nich genoog Tostimmens. %d vun %d Tostimmens geven. +pulls.blocked_by_rejection = Een offizieller Nakieker hett um Ännerns an deesem Haalvörslag beden. +pulls.blocked_by_outdated_branch = Deeser Haalvörslag is blockeert, denn he is verollt. +pulls.cannot_auto_merge_desc = Deeser Haalvörslag kann nich automatisk tosamenföhrt worden, denn dat gifft Unverdragelkheidens. +pulls.cannot_auto_merge_helper = Föhr dat vun Hand tosamen, um de Unverdragelkheidens oftohelpen. +pulls.num_conflicting_files_1 = %d unverdragelk Datei +pulls.approve_count_1 = %d Tostimmen +pulls.reject_count_n = %d Bidden um Ännerns +pulls.waiting_count_n = %d Nakiekens stahn ut +pulls.wrong_commit_id = Kommitteren-ID mutt eene Kommitteren-ID up de Enn-Twieg wesen +pulls.no_merge_helper = Knips Tosamenföhrens-Instellens in de Repositoriums-Instellens an of föhr de Tosamenföhren vun Hand tosamen. +pulls.no_merge_wip = De Haalvörslag kann nich tosamenföhrt worden, denn dat is as noch in de Maak markeert. +pulls.no_merge_not_ready = De Haalvörslag is nich klaar tum Tosamenföhren, bekiek de Nakiekens-Tostand un de Överprüfens. +pulls.merge_pull_request = Tosamenföhrens-Kommitteren maken +pulls.has_pull_request = `Eenen Haalvörslag tüsken deesen Twiegen gifft dat al: %[2]s#%[3]d` +pulls.blocked_by_official_review_requests = Deeser Haalvörslag is blockeert, denn een of mehr offiziell Nakiekers hebben noch nich tostimmt. +pulls.blocked_by_changed_protected_files_1 = Deeser Haalvörslag is blockeert, denn dat ännert eene beschütt Datei: +pulls.no_merge_desc = De Haalvörslag kann nich tosamenföhrt worden, denn all Tosamenföhrens-Instellens sünd in deesem Repositorium utknipst. +issues.review.resolved_by = hett deesen Snack as lööst markeert +issues.reference_issue.body = Text +issues.content_history.delete_from_history = Ut Histoorje lösken +pulls.compare_changes = Nejer Haalvörslag +pulls.allow_edits_from_maintainers_desc = Brukers, well dat Recht hebben, to de Grund-Twieg to schrieven, düren ok up deesen Twieg schuuven +pulls.nothing_to_compare_and_allow_empty_pr = Deese Twiegen sünd gliek. De HV word leeg wesen. +pulls.title_desc_few = will %[1]d Kommitterens vun %[2]s na %[3]s tosamenföhren +pulls.data_broken = Deeser Haalvörslag is kaputt, denn de Gabel-Informatioon fehlt. +pulls.waiting_count_1 = %d Nakieken staht ut +issues.content_history.deleted = lösket +issues.content_history.created = maakt +issues.content_history.delete_from_history_confirm = Ut Histoorje lösken? +issues.blocked_by_user = Du kannst in deesem Repositorium keene Gefallens opmaken, denn de Repositoriums-Eegner hett di blockeert. +pulls.merged_title_desc_few = hett %[1]d Kommitterens vun %[2]s na %[3]s %[4]s tosamenföhrt +pulls.reject_count_1 = %d Bidde um Ännerns +pulls.blocked_by_user = Du kannst in deesem Repositorium keenen Haalvörslag opmaken, denn de Repositoriums-Eegner hett di blockeert. +pulls.no_merge_access = Du hest nich dat Recht, deesen Haalvörslag tosamentoföhren. +issues.comment.blocked_by_user = Du kannst up deesem Gefall nich kommenteren, denn de Repositoriums-Eegner of de Autor vun de Gefall hett di blockeert. +pulls.switch_comparison_type = Verglieks-Aard ännern +pulls.showing_only_single_commit = Blots Ännerns vun Kommitteren %[1]s wiesen +pulls.blocked_by_changed_protected_files_n = Deeser Haalvörslag is blockeert, denn dat ännert beschütt Dateien: +pulls.num_conflicting_files_n = %d unverdragelk Dateien +issues.content_history.edited = bewarkt +pulls.select_commit_hold_shift_for_range = Kommitteren utkören. Holl Umschalt un Klick, um eene Rieg uttokören +pulls.is_checking = Överprüfen vun Tosamenföhrens-Unverdragelkheidens löppt. Bidde versöök dat in körter Tied noch eenmaal. +pulls.can_auto_merge_desc = Deeser Haalvörslag kann automatisk tosamenföhrt worden. +pulls.approve_count_n = %d Tostimmens +pulls.rebase_merge_pull_request = Umbaseren dann fix na vörn +pulls.rebase_merge_commit_pull_request = Umbaseren dann Tosamenföhrens-Kommitteren maken +pulls.squash_merge_pull_request = Plattdrück-Kommitteren maken +pulls.fast_forward_only_merge_pull_request = Blots fix na vörn +pulls.merge_manually = Vun Hand tosamenföhrt +pulls.merge_commit_id = De Tosamenföhrens-Kommitteren-ID +pulls.require_signed_wont_sign = De Twieg bruukt unnerschrieven Kommitterens, aver deeses Tosamenföhren word nich unnerschrieven wesen +pulls.invalid_merge_option = Du kannst deese Tosamenföhrens-Instellen för deesen Haalvörslag nich bruken. +pulls.merge_conflict = Tosamenföhren fehlslagen: Dat hett bi’m Tosamenföhren eene Unverdragelkheid geven. Wenk: Versöök eene anner Tosamenföhrens-Aard +pulls.merge_conflict_summary = Fehler-Naricht +pulls.rebase_conflict = Tosamenföhren fehlslagen: Dat hett bi’m Umbaseren vun Kommitteren %[1]s eene Unverdragelkheid geven. Wenk: Versöök eene anner Tosamenföhrens-Aard +pulls.rebase_conflict_summary = Fehler-Naricht +pulls.merge_out_of_date = Tosamenföhren fehlslagen: Bi’m Tosamenföhren is de Grund verneeit worden. Wenk: Versöök dat noch eenmaal. +pulls.head_out_of_date = Tosamenföhren fehlslagen: Bi’m Tosamenföhren is de Kopp verneeit worden. Wenk: Versöök dat noch eenmaal. +pulls.push_rejected_summary = Kumpleete Oflehnens-Naricht +pulls.push_rejected = Schuven fehlslagen: Dat Schuven is oflehnt worden. Bidde överprüüf de Git-Hakens för deeses Repositorium. +pulls.open_unmerged_pull_exists = `Du kannst dat nich weer opmaken, denn dat gifft een anner open Haalvörslag (#%d) mit akkeraat de sülven Eegenskuppen.` +pulls.status_checking = Eenige Överprüfens stahn ut +pulls.status_checks_success = All Överprüfens sünd klaar +pulls.status_checks_warning = Eenige Överprüfens hebben Wahrschauens mellt +pulls.status_checks_error = Eenige Överprüfens hebben Fehlers mellt +pulls.status_checks_failure = Eenige Överprüfens sünd fehlslagen +pulls.status_checks_requested = Nödig +pulls.status_checks_hide_all = All Överprüfens verbargen +pulls.status_checks_details = Mehr Informatioonen +pulls.status_checks_show_all = All Överprüfens wiesen +pulls.update_branch_rebase = Twieg mit Umbaseren vernejen +pulls.outdated_with_base_branch = De Twieg is tegen de Grund-Twieg verollt +pulls.close = Haalvörslag dichtmaken +pulls.closed_at = `hett deesen Haalvörslag %[2]s dichtmaakt` +pulls.reopened_at = `hett deesen Haalvörslag %[2]s weer opmaakt` +pulls.cmd_instruction_hint = Wies Oorderreeg-Instruksjes +pulls.cmd_instruction_checkout_title = Utchecken +pulls.cmd_instruction_merge_title = Tosamenföhren +pulls.clear_merge_message = Tosamenföhrens-Naricht leegmaken +pulls.reopen_failed.head_branch = De Haalvörslag kann nich weer opmaakt worden, denn de Kopp-Twieg gifft dat nich mehr. +pulls.reopen_failed.base_branch = De Haalvörslag kann nich weer opmaakt worden, denn de Grund-Twieg gifft dat nich mehr. +pulls.made_using_agit = AGit +pulls.auto_merge_when_succeed = Automatisk Tosamenföhren, wenn all Överprüfens kumpleet sünd +pulls.auto_merge_newly_scheduled_comment = ` hett de Haalvörslag %[1]s sett, sik tosamentoföhren, wenn all Överprüfens kumpleet sünd` +pulls.delete.title = Deesen Haalvörslag lösken? +pulls.recently_pushed_new_branches = Du hest to de Twieg %[1]s %[2]s schuven +milestones.new = Nejer Marksteen +milestones.closed = %s dichtmaakt +milestones.open = Opmaken +milestones.close = Dichtmaken +milestones.completeness = %d%% Kumpleet +milestones.create = Marksteen maken +milestones.desc = Beschrieven +milestones.due_date = Anstahns-Datum (kann leeg wesen) +milestones.create_success = De Marksteen »%s« is maakt worden. +milestones.edit = Marksteen bewarken +milestones.edit_subheader = Markstenen organiseren Gefallens un verfolgen Wiederkomen. +milestones.cancel = Ofbreken +milestones.modify = Marksteen vernejen +milestones.edit_success = Marksteen »%s« is verneeit worden. +milestones.deletion = Marksteen lösken +pulls.has_merged = Fehlslagen: De Haalvörslag is tosamenföhrt worden, du kannst nich noch eenmaal tosamenföhren of de Enn-Twieg ännern. +pulls.unrelated_histories = Tosamenföhren fehlslagen: De Tosamenföhrens-Kopp un -Grund hebben keene gemeensame Histoorje. Wenk: Versöök eene anner Tosamenföhrens-Aard +pulls.update_not_allowed = Du düürst deesen Twieg nich vernejen +pulls.commit_ref_at = `hett deesen Haalvörslag %[2]s vun eenem Kommitteren benöömt` +pulls.auto_merge_newly_scheduled = De Haalvörslag weer sett, sik tosamentoföhren, wenn all Överprüfens kumpleet sünd. +milestones.clear = Leeg maken +pulls.push_rejected_no_message = Schuven fehlslagen: Dat Schuven is sünner feerne Naricht oflehnt worden. Bidde överprüüf de Git-Hakens för deeses Repositorium +pulls.update_branch = Twieg mit Tosamenföhren vernejen +pulls.update_branch_success = Twieg is verneeit worden +pulls.cmd_instruction_checkout_desc = Check in dienem Projekt-Repositorium eenen nejen Twieg ut un probeer de Ännerns ut. +pulls.cmd_instruction_merge_desc = Föhr de Ännerns tosamen un veneei up Forgejo. +pulls.cmd_instruction_merge_warning = Wahrschau: De Instellens »Tosamenföhren vun Hand automatisk erkennen« is för deeses Repositorium utknipst, du muttst deesen Haalvörslag daarna noch as vun Hand tosamenföhrt markeren. +pulls.auto_merge_button_when_succeed = (Wenn Överprüfens kumpleet sünd) +pulls.auto_merge_cancel_schedule = Automatisk Tosamenföhren ofbreken +pulls.auto_merge_canceled_schedule = Dat automatisk Tosamenföhren is för deesen Haalvörslag ofbroken worden. +pulls.agit_explanation = Mit de AGit-Warkwies maakt. AGit lett Bidragers Ännerns mit »git push« vörslagen, sünner eene Gabel of eenen nejen Twieg to maken. +pulls.auto_merge_has_pending_schedule = %[1]s hett de Haalvörslag %[2]s sett, sik tosamentoföhren, wenn all Överprüfens kumpleet sünd. +pulls.auto_merge_not_scheduled = Deeser Haalvörslag is nich för dat automatisk Tosamenföhren sett. +pull.deleted_branch = (lösket):%s +pulls.auto_merge_canceled_schedule_comment = ` hett dat automatisk Tosamenföhren vun deesem Haalvörslag, wenn all Överprüfens kumpleet sünd, %[1]s ofbroken` +pulls.delete.text = Willst du deesen Haalvörslag würrelk lösken? (Dat lösket för all Tieden all Inhollen. Wenn du ’t blots archiveren willst, maakt ’t lever blots dicht) +milestones.update_ago = %s verneeit +milestones.no_due_date = Keen Anstahns-Datum +milestones.new_subheader = Markstenen könen di hülpen, Gefallens to organiseren un hör Wiederkomen to verfolgen. +milestones.title = Titel +milestones.invalid_due_date_format = Anstahns-Datums-Formaat mutt »JJJJ-MM-DD« wesen. +milestones.deletion_desc = Wenn een Marksteen lösket word, word dat vun all benöömt Gefallens wegdaan. Wiedermaken? +milestones.deletion_success = De Marksteen is lösket worden. +milestones.filter_sort.name = Naam +milestones.filter_sort.latest_due_date = Feernst Anstahns-Datum +milestones.filter_sort.least_complete = Minnst kumpleet +milestones.filter_sort.most_complete = Meest kumpleet +milestones.filter_sort.most_issues = Meest Gefallens +signing.will_sign = Deeses Kommitteren word mit de Slötel »%s« unnerschreven. +signing.wont_sign.nokey = Deese Instanz hett keenen Slötel, um deeses Kommitteren to unnerschrieven. +signing.wont_sign.never = Kommitterens worden nie unnerschrieven. +signing.wont_sign.always = Kommitterens worden alltieden unnerschrieven. +signing.wont_sign.twofa = Du muttst Twee-Faktooren-Anmellen anknipsen, um Kommitterens to unnerschrieven. +signing.wont_sign.headsigned = Deeses Kommitteren word nich unnerschrieven, denn dat Kopp-Kommitteren is nich unnerschreven. +signing.wont_sign.basesigned = Deeses Kommitteren word nich unnerschrieven, denn dat Grund-Kommitteren is nich unnerschreven. +signing.wont_sign.commitssigned = Dat Tosamenföhren word nich unnerschrieven, denn de Kommitterens vun Belang sünd nich all unnerschreven. +signing.wont_sign.approved = Dat Tosamenföhren word nich unnerschrieven, denn de HV is nich tostimmt. +signing.wont_sign.not_signed_in = Du büst nich anmellt. +ext_wiki = Frömdes Wiki +wiki = Wiki +wiki.welcome = Willkomen im Wiki. +wiki.desc = Schriev un deel Dokumenterens mit Mitarbeiders. +wiki.create_first_page = Maak de eerste Sied +wiki.page = Sied +wiki.filter_page = Sied filtern +wiki.new_page = Sied +wiki.page_title = Sied-Titel +wiki.page_content = Sied-Text +wiki.default_commit_message = Schriev eene Notiz över deeses Sieden-Vernejen (wenn du willst). +wiki.save_page = Sied sekern +wiki.cancel = Ofbreken +wiki.last_commit_info = %s hett diese Sied %s bewarkt +wiki.edit_page_button = Bewarken +wiki.new_page_button = Neje Sied +wiki.file_revision = Sied-Versioon +wiki.back_to_wiki = Torügg tur Wiki-Sied +wiki.delete_page_button = Sied lösken +wiki.delete_page_notice_1 = Wenn du de Wiki-Sied »%s« löskest, kann se nich mehr torügghaalt worden. Wiedermaken? +wiki.reserved_page = De Wiki-Sied-Naam »%s« is vörbehollen. +wiki.pages = Sieden +wiki.last_updated = Tolest %s verneeit +wiki.original_git_entry_tooltip = Wies de echte Git-Datei un bruuk nich de fründelk Verwies. +wiki.search = Im Wiki söken +wiki.no_search_results = Keene Resultaten +activity = Doon +activity.navbar.pulse = Puls +activity.navbar.code_frequency = Quelltext-Frequenz +activity.navbar.contributors = Bidragers +activity.navbar.recent_commits = Leste Kommitterens +activity.period.filter_label = Tied: +activity.period.daily = 1 Dag +activity.period.halfweekly = 3 Dagen +activity.overview = Översicht +activity.active_prs_count_1 = %d aktiiv Haalvörslag +activity.merged_prs_count_1 = Tosamenföhrt Haalvörslag +activity.opened_prs_count_1 = Nejer Haalvörslag +activity.title.user_n = %d Brukers +activity.title.prs_n = %d Haalvörslagen +activity.title.prs_merged_by = %s vun %s tosamenföhrt +activity.title.prs_opened_by = %s vun %s opmaakt +activity.merged_prs_label = Tosamenföhrt +activity.opened_prs_label = Neei vörslagen +activity.active_issues_count_1 = %d aktiiv Gefall +activity.closed_issues_count_1 = Dichtmaakt Gefall +activity.title.issues_closed_from = %s vun %s dichtmaakt +activity.title.issues_created_by = %s vun %s opmaakt +activity.new_issues_count_1 = Nejes Gefall +activity.new_issues_count_n = Neje Gefallens +activity.new_issue_label = Opmaakt +activity.closed_issue_label = Dichtmaakt +activity.title.unresolved_conv_1 = %d nich lööst Snack +activity.unresolved_conv_desc = Deese körtens ännert Gefallens un Haalvörslagen sünd noch nich lööst worden. +activity.unresolved_conv_label = Open +activity.published_release_label = Publizeren +activity.published_tag_label = Mark +activity.no_git_activity = In deeser Tied hett dat keen Kommitterens-Doon geven. +activity.git_stats_exclude_merges = Sünner Tosamenföhrens +activity.git_stats_author_1 = %d Autor +activity.git_stats_author_n = %d Autoren +activity.git_stats_pushed_1 = hett +activity.git_stats_pushed_n = hebben +activity.git_stats_commit_1 = %d Kommittteren +activity.git_stats_commit_n = %d Kommittterens +activity.git_stats_push_to_branch = to %s un +activity.git_stats_push_to_all_branches = to all Twiegen schuven. +activity.git_stats_on_default_branch = Up %s +activity.git_stats_files_changed_n = ännert worden +activity.git_stats_addition_n = %d neje Riegen +activity.git_stats_addition_1 = %d neje Rieg +activity.git_stats_and_deletions = un +activity.git_stats_deletion_1 = %d lösket Rieg geven +activity.commit = Kommitterens-Doon +contributors.contribution_type.filter_label = Bidrag-Aard: +contributors.contribution_type.additions = Neje Riegen +settings = Instellens +settings.options = Repositorium +settings.collaboration = Mitarbeiders +settings.collaboration.admin = Chef +settings.collaboration.write = Schrieven +settings.collaboration.read = Lesen +settings.collaboration.owner = Eegner +settings.hooks = Internett-Hakens +settings.collaboration.undefined = Nich sett +settings.githooks = Git-Hakens +settings.basic_settings = Grund-Instellens +settings.federation_not_enabled = Verdeeltheid is in diener Instanz utknipst. +settings.mirror_settings.docs.disabled_push_mirror.instructions = Sett dien Repositorium, dat Kommitterens, Markens un Twiegen automatisk vun eenem anner Repositorium haalt worden. +settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning = Jüüst nu kann dat blots in de Menü »Nejer Umtreck« maakt worden. För mehr Informatioonen, bekiek bidde: +settings.mirror_settings.docs.disabled_push_mirror.info = Schuuv-Spegels sünd vun dienem Sied-Chef utknipst worden. +settings.mirror_settings.docs.no_new_mirrors = Dien Repositorium spegelt Ännerns to of vun eenem anner Repositorium. Bidde wees wiss, dat du jüüst nu keene nejen Spegels maken kannst. +settings.mirror_settings.docs.can_still_use = Ok wenn du keene Spegels bewarken of neje maken kannst, düürst du diene bestahn Spegels wiederhen bruken. +settings.mirror_settings.docs.pull_mirror_instructions = Um eenen Haal-Spegel intorichten, bekiek bidde: +settings.mirror_settings.docs.more_information_if_disabled = Hier lehrst du mehr över Schuuv- un Haal-Spegels: +settings.mirror_settings.docs.doc_link_title = Wo spegel ick Repositoriums? +settings.mirror_settings.mirrored_repository = Spegelt Repositorium +settings.mirror_settings.direction = Richtung +settings.mirror_settings.direction.pull = Halen +settings.mirror_settings.direction.push = Schuven +settings.mirror_settings.last_update = Tolest verneeit +settings.mirror_settings.push_mirror.edit_sync_time = Spegelns-Tiedofstand bewarken +settings.mirror_settings.push_mirror.none_ssh = Nix +settings.units.overview = Översicht +settings.mirror_settings.push_mirror.copy_public_key = Publiken Slötel koperen +settings.pull_mirror_sync_in_progress = Haalt jüüst Ännerns vun de feernen Stee %s. +settings.pull_mirror_sync_quota_exceeded = Quote överweggahn, haalt keene Ännerns. +settings.site = Internett-Sied +settings.update_settings = Instellens sekern +settings.branches.update_default_branch = Höövd-Twieg vernejen +settings.branches.add_new_rule = Neje Örder hentofögen +settings.advanced_settings = Mehr Instellens +settings.use_internal_wiki = Inbaut Wiki bruken +settings.external_wiki_url = URL vum frömden Wiki +settings.use_internal_issue_tracker = Inbaut Gefall-Verfolger bruken +settings.external_tracker_url = URL vum frömden Gefall-Verfolger +settings.tracker_url_format = URL-Formaat vum frömden Gefall-Verfolger +settings.tracker_url_format_error = Dat URL-Formaat vum frömden Gefall-Verfolger is keene gültige URL. +settings.tracker_issue_style.numeric = Numerisk +settings.tracker_issue_style.regexp = Regel-Utdruck +settings.tracker_issue_style.regexp_pattern = Regel-Utdruck-Muster +settings.enable_timetracker = Tied-Erfaten anknipsen +settings.allow_only_contributors_to_track_time = Blots Bidragers Tied erfaten laten +settings.pulls_desc = Haalvörslagen im Repositorium anknipsen +settings.pulls.ignore_whitespace = Leegtekens för Unverdragelkheidens minnachten +settings.pulls.allow_rebase_update = Verlöven, Haalvörslag-Twieg dör Umbaseren to vernejen +settings.pulls.default_delete_branch_after_merge = Haalvörslag-Twieg na de Tosamenföhren automatisk lösken +settings.pulls.default_allow_edits_from_maintainers = Bewarkens vun Liddmaten normaal verlöven +settings.releases_desc = Repositorium-Publizerens anknipsen +settings.packages_desc = Repositorium-Paketlist anknipsen +settings.projects_desc = Repositorium-Projekten anknipsen +settings.admin_settings = Chef-Instellens +settings.admin_code_indexer = Quelltext-Indizerer +settings.admin_stats_indexer = Quelltext-Statistiken-Indizerer +settings.admin_indexer_commit_sha = Tolest indizeert Kommitteren +settings.admin_indexer_unindexed = Nich indizeert +settings.reindex_requested = Nejes Indizeren vörmarkt +settings.reindex_button = Tum Neeiindizeren vörmarken +settings.danger_zone = Gefahren-Zoon +settings.convert_succeed = De Spegel is in een normaales Repositorium umwannelt worden. +settings.convert_fork = To normaalem Repositorium umwanneln +settings.convert_fork_desc = Du kannst deese Gabel in een normaales Repositorium umwanneln. Dat kann nich torüggnohmen worden. +settings.convert_fork_confirm = Repositorium umwanneln +settings.convert_fork_succeed = De Gabel is in een normaales Repositorium umwannelt worden. +settings.transfer.title = Eegnerskupp överdragen +settings.transfer.button = Eegnerskupp överdragen +settings.transfer.modal.title = Eegnerskupp överdragen +settings.transfer.rejected = Repositoriums-Överdragen is oflehnt worden. +settings.transfer.success = Repositoriums-Överdragen is ofsluten. +settings.transfer_abort = Överdragen ofbreken +settings.transfer_abort_invalid = Du kannst een Repositoriums-Överdragen, wat dat nich gifft, nich ofbreken. +settings.confirmation_string = Utwiesens-Text +settings.transfer_in_progress = Een Överdraag löppt al. Bidde breck dat eerst of, wenn du deeses Repositorium to een anner Bruker överdragen willst. +settings.transfer_perform = Överdragen dörföhren +settings.transfer_succeed = Dat Repositorium is överdragen worden. +settings.transfer_quota_exceeded = De neje Eegner (%s) is över de Quote. Dat Repositorium is nich överdragen worden. +milestones.filter_sort.earliest_due_data = Nahst Anstahns-Datum +milestones.filter_sort.least_issues = Minnst Gefallens +wiki.wiki_page_revisions = Sied-Versioonen +activity.period.yearly = 1 Jahr +activity.title.issues_1 = %d Gefall +activity.git_stats_files_changed_1 = ännert worden +activity.git_stats_deletion_n = %d lösket Riegen geven +contributors.contribution_type.deletions = Lösket Riegen +settings.federation_following_repos = URLs vun Nagahns-Repositoriums. Trennt mit »;«, keene Leegtekens. +settings.mirror_settings.docs = Sett dien Repositorium, dat Kommitterens, Markens un Twiegen automatisk mit eenem anner Repositorium spegelt worden. +settings.mirror_settings.push_mirror.add = Schuuv-Spegel hentofögen +settings.units.add_more = Mehr anknipsen +settings.branches.switch_default_branch = Höövd-Twieg ännern +settings.use_external_wiki = Frömdes Wiki bruken +settings.external_tracker_url_error = De URL vum frömden Gefall-Verfolger is keene gültige URL. +settings.actions_desc = Integreerte CI-/CD-Affolgens mit Forgejo-Aktioonen anknipsen +settings.convert_notices_1 = Dat wannelt deesen Spegel in een normaales Repositorium um un kann nich torüggnohmen worden. +settings.convert_confirm = Repositorium umwanneln +signing.wont_sign.parentsigned = Deeses Kommitteren word nich unnerschrieven, denn dat Ollern-Kommitteren is nich unnerschreven. +wiki.page_already_exists = Eene Wiki-Sied mit de sülven Naam gifft dat al. +activity.period.weekly = 1 Week +activity.period.monthly = 1 Maant +activity.closed_issues_count_n = Dichtmaakt Gefallens +settings.desc = Unner »Instellens« kannst du de Instellens för dat Repositorium verwalten +settings.federation_apapiurl = Verdeeltheids-URL vun deesem Repositorium. Kopeer un föög dat in de Verdeeltheids-Instellens vun eenem anner Repositorium as eene URL vun eenem Nagahns-Repositorium in. +settings.mirror_settings.docs.doc_link_pull_section = de Deel »Vun eenem feernen Repositorium halen« in de Dokumenteren. +settings.mirror_settings.pushed_repository = Schuuvt Repositorium +settings.units.units = Eenheiden +settings.wiki_globally_editable = Elkeenwell verlöven, dat Wiki to bewarken +settings.tracker_issue_style.regexp_pattern_desc = De eerste Fangens-Grupp word in Stee vun {index} bruukt. +settings.convert = To normaalem Repositorium umwanneln +settings.convert_desc = Du kannst deesen Spegel in een normaales Repositorium umwanneln. Dat kann nich torüggnohmen worden. +settings.transfer_abort_success = Dat Repositoriums-Överdragen na %s is ofbroken worden. +signing.wont_sign.error = Bi’m Nakieken, of dat Kommitteren unnerschrieven worden kann, hett dat eenen Fehler geven. +signing.wont_sign.pubkey = Deeses Kommitteren word nich unnerschrieven, denn du hest in dienem Konto keenen publiken Slötel angeven. +activity.active_prs_count_n = %d aktiiv Haalvörslagen +activity.merged_prs_count_n = Tosamenföhrt Haalvörslagen +activity.title.user_1 = %d Bruker +activity.title.prs_1 = %d Haalvörslag +activity.active_issues_count_n = %d aktiiv Gefallens +activity.title.issues_n = %d Gefallens +activity.title.unresolved_conv_n = %d nich lööst Snacks +activity.title.releases_1 = %d Publizeren +activity.git_stats_file_1 = is %d Datei +contributors.contribution_type.commits = Kommitterens +settings.mirror_settings = Spegel-Instellens +settings.federation_settings = Verdeeltheid-Instellens +settings.mirror_settings.docs.disabled_pull_mirror.instructions = Sett dien Repositorium, dat Kommitterens, Markens un Twiegen automatisk to eenem anner Repositorium schuuvt worden. Haal-Spegels sünd vun dienem Sied-Chef utknipst worden. +settings.mirror_settings.docs.pulling_remote_title = Vun eenem feernen Repositorium halen +settings.sync_mirror = Nu spegeln +settings.update_mirror_settings = Spegel-Instellens vernejen +activity.git_stats_additions = un dat hett +settings.mirror_settings.push_mirror.none = Keene Schuuv-Spegels inricht +settings.mirror_settings.push_mirror.remote_url = Feerne Git-Repositoriums-URL +settings.wiki_desc = Repositoriums-Wiki anknipsen +settings.external_wiki_url_error = De URL vum frömden Wiki is keene gültige URL. +settings.use_external_issue_tracker = Frömden Gefall-Verfolger bruken +wiki.welcome_desc = Dat Wiki lett di Dokumenterens mit Mitarbeiders schrieven un delen. +wiki.page_name_desc = Giff eenen Naam för deese Wiki-Sied in. Eenige besünnere Namens sünd: »Home«, »_Sidebar« un »_Footer«. +activity.period.quarterly = 3 Maanten +activity.period.semiyearly = 6 Maanten +activity.opened_prs_count_n = Neje Haalvörslagen +settings.tracker_issue_style.alphanumeric = Alphanumerisk +settings.transfer_owner = Nejer Eegner +activity.title.releases_n = %d Publizerens +activity.title.releases_published_by = %s vun %s publizeert +activity.published_prerelease_label = Vör-Publizeren +activity.git_stats_file_n = sünd %d Dateien +settings.push_mirror_sync_in_progress = Schuuvt jüüst Ännerns to de feernen Stee %s. +settings.pulls.enable_autodetect_manual_merge = Tosamenföhren vun Hand automatisk erkennen (Wahrschau: In eenigen besünneren Fallen kann dat falsk oordelen) +settings.convert_fork_notices_1 = Dat wannelt deese Gabel in een normaales Repositorium um un kann nich torüggnohmen worden. +settings.enter_repo_name = Giff de Eegner un Repositoriums-Naam jüüst so in, as se wiesen worden: +settings.transfer_notices_2 = - Du hest wiederhen Togriep up dat Repositorium, wenn du dat to eener Vereenigung överdraggst, waar du een Eegner büst. +settings.transfer_started = Deeses Repositorium is tum Överdragen vörmarkt worden un wacht up Verlööv vun »%s« +settings.external_wiki_url_desc = Besökers worden to de URL vum frömden Wiki umleit, wenn se up de Wiki-Karteikaart klicken. +settings.issues_desc = Repositoriums-Gefall-Verfolger anknipsen +settings.external_tracker_url_desc = Besökers worden to de URL vum frömden Gefall-Verfolger umleit, wenn se up de Gefallens-Karteikaart klicken. +settings.tracker_issue_style = Tahlen-Formaat vum frömden Gefall-Verfolger +settings.tracker_url_format_desc = Bruuk de Utdruckens {user}, {repo} un {index} för de Brukernaam, Repositoriums-Naam un Gefall-Tahl. +settings.admin_enable_health_check = Repositorium-Gesundheids-Överprüfens anknipsen (git fsck) +settings.admin_enable_close_issues_via_commit_in_any_branch = Een Gefall över een Kommitteren sluten, wat in eenem nich-Höövd-Twieg maakt worden is +settings.new_owner_has_same_repo = De neje Eegner hett al een Repositorium mit de sülven Naam. Bidde köör een anner Naam ut. +settings.new_owner_blocked_doer = De neje Eegner hett di blockeert. +settings.transfer_desc = Överdraag deeses Repositorium to eenem Bruker of eener Vereenigung, waar du Chef-Rechtens hest. +settings.transfer_notices_1 = - Du hest keen Togriep mehr up dat Repositorium, wenn du dat to eenem enkelt Bruker överdraggst. +settings.transfer_notices_3 = - Wenn dat Repositorium privaat is un to eenem enkelt Bruker överdragen word, passt deese Aktioon up, dat de Bruker tominnst Lesen-Togriep hett (un ännert de Rechtens as nödig). +settings.signing_settings = Unnerschrift-Utwiesens-Instellens +settings.trust_model.collaborator = Mitarbeider +settings.trust_model.collaborator.long = Mitarbeider: Unnerschriftens vun Mitarbeiders vertrauen +settings.trust_model.committer = Kommitterer +settings.trust_model.committer.long = Kommitterer: Vertrau Unnerschriften, wat to de Kommitterer passen (Dat is jüüst as up GitHub un dwingt, dat Kommitterens, wat vun Forgejo unnerschrieven worden, Forgejo as Kommitterer hebben) +settings.trust_model.committer.desc = Gültige Unnerschriften worden blots dann as »vertraut« markeert, wenn se to de Kommitterer passen, un sünst as »unvertraut«. Dat dwingt Forgejo, de Kommitterer up unnerschrieven Kommitterens to wesen, un de eegentlik Kommitterer word mit Nadragen »Co-authored-by:« un »Co-committed-by:« im Kommitteren vermarkt. De normaale Slötel för Forgejo mutt to eenem Bruker in de Datenbank passen. +settings.trust_model.collaboratorcommitter = Mitarbeider+Kommitterer +settings.trust_model.collaboratorcommitter.long = Mitarbeider+Kommitterer: Vertrau Unnerschriften vun Mitarbeiders, wat to de Kommitterer passen +settings.wiki_rename_branch_main_notices_1 = Dat KANN NICH torüggnohmen worden. +settings.wiki_rename_branch_main_notices_2 = Dat benöömt för all Tieden de binnern Twieg vun de Repositoriums-Wiki vun %s um. Bestahn Utcheckens mutten dann verneeit worden. +settings.wiki_branch_rename_failure = Kunn de Twieg-Naam vun de Wiki vun de Repositorium nich normaliseren. +settings.confirm_wiki_branch_rename = De Wiki-Twieg umbenöömen +settings.wiki_delete = Wiki-Daten lösken +settings.wiki_delete_desc = De Repositoriums-Wiki-Daten to lösken is för all Tieden un kann nich torüggnohmen worden. +settings.wiki_delete_notices_1 = - Dat word dat Repositoriums-Wiki för %s för all Tieden lösken un utknipsen. +settings.confirm_wiki_delete = Wiki-Daten lösken +settings.delete = Deeses Repositorium lösken +settings.delete_desc = Een Repositorium to lösken is för all Tieden un kann nich torüggnohmen worden. +settings.delete_notices_1 = - Dat KANN NICH torüggnohmen worden. +settings.trust_model.default = Normaales Vertroens-Modell +settings.wiki_deletion_success = De Repositoriums-Wiki-Daten sünd lösket worden. +settings.trust_model = Unnerschrift-Vertroens-Modell +settings.trust_model.collaborator.desc = Gültige Unnerschriften vun Mitarbeiders in deesem Repositorium worden as »vertraut« markeert (of se to de Kommitterer passen of nich). Annerns worden gültige Unnerschriften as »unvertraut« markeert, wenn de Unnerschrift tum Kommitterer passt, un as »passt nich«, wenn nich. +settings.trust_model.collaboratorcommitter.desc = Gültige Unnerschriften vun Mitarbeiders in deesem Repositorium worden as »vertraut« markeert, wenn se to de Kommitterer passen. Annerns worden gültige Unnerschriften as »unvertraut« markeert, wenn de Unnerschrift tum Kommitterer passt, un as »passt nich«, wenn nich. Dat dwingt Forgejo, de Kommitterer up unnerschrieven Kommitterens to wesen, un de eegentlik Kommitterer word mit Nadragen »Co-authored-by:« un »Co-committed-by:« im Kommitteren vermarkt. De normaale Slötel för Forgejo mutt to eenem Bruker in de Datenbank passen. +settings.trust_model.default.desc = Dat normaale Repositoriums-Vertroens-Modell för deese Instanz bruken. +settings.wiki_rename_branch_main_desc = De Twieg, wat binnern vun de Wiki bruukt word, to »%s« umbenöömen. Deeses Ännern is för all Tieden un kann nich torüggnohmen worden. +settings.wiki_rename_branch_main = De Wiki-Twieg-Naam normaliseren +settings.wiki_branch_rename_success = De Twieg-Naam vun de Wiki vun de Repositorium is normaliseert worden. +settings.delete_notices_2 = - Dat lösket för all Tieden dat Repositorium %s mit all Quelltexten, Gefallens, Kommentaren, Wiki-Daten un Mitarbeider-Instellens. +settings.deletion_success = Dat Repositorium is lösket worden. +settings.update_settings_success = De Repositoriums-Instellens sünd verneeit worden. +settings.add_collaborator_success = De Mitarbeider is hentoföögt worden. +settings.add_collaborator_owner = Kann eenen Eegner nich as Mitarbeider hentofögen. +settings.add_collaborator_duplicate = Deeser Mitarbeider is al to de Repositorium hentoföögt worden. +settings.add_collaborator_blocked_our = Kann de Mitarbeider nich hentofögen, denn de Repositoriums-Eegner hett hüm blockeert. +settings.add_collaborator_blocked_them = Kann de Mitarbeider nich hentofögen, denn he hett de Repositoriums-Eegner blockeert. +settings.delete_collaborator = Wegdoon +settings.collaborator_deletion = Mitarbeider wegdoon +settings.collaborator_deletion_desc = Wenn du eenen Mitarbeider wegdoost, hett he keenen Togriep mehr up deeses Repositorium. Wiedermaken? +settings.remove_collaborator_success = De Mitarbeider is wegdaan worden. +settings.org_not_allowed_to_be_collaborator = Vereenigungen könen nich as Mitarbeider hentoföögt worden. +settings.change_team_access_not_allowed = Blots de Vereenigungs-Eegner kann de Klottjen-Togriep to de Repositorium ännern +settings.team_not_in_organization = De Klottje is nich in de sülve Vereenigung as dat Repositorium +settings.teams = Klottjen +settings.add_team = Klottje hentofögen +settings.add_team_duplicate = Klottje hett dat Repositorium al +settings.add_team_success = De Klottje hett nu Togriep to de Repositorium. +settings.change_team_permission_tip = De Klottjen-Rechte sünd up de Klottjen-Instellens-Sied sett un könen nich pro Repositorium ännert worden +settings.delete_team_tip = Deese Klottje hett Togriep to all Repositoriums un kann nich lösket worden +settings.remove_team_success = De Togriep vun de Klottje to de Repositorium is wegdaan worden. +settings.add_webhook = Internett-Haak hentofögen +settings.add_webhook.invalid_channel_name = Internett-Haak-Kanaal-Naam düür nich leeg wesen un mutt mehr as blot de #-Bookstaav enthollen. +settings.webhook_deletion = Internett-Haak wegdoon +settings.webhook_deletion_success = De Internett-Haak is wegdaan worden. +settings.webhook.test_delivery = Levern testen +settings.webhook.test_delivery_desc = Deesen Internett-Haak mit eenem falsken Vörfall testen. +settings.webhook.test_delivery_desc_disabled = Aktiveer deesen Internett-Haak, um hüm mit eenem falsken Vörfall to testen. +settings.webhook.request = Anfraag +settings.webhook.response = Antwoord +settings.webhook.payload = Inholl +settings.webhook.body = Text +settings.webhook.replay.description_disabled = Aktiveer deesen Internett-Haak, um hüm weer uttoföhren. +settings.githook_edit_desc = Wenn de Haak nich aktiiv is, word Bispööl-Inholl wiest. Wenn du de Inholl leeg lettst, word deeser Haak utknipst. +settings.githook_name = Haak-Naam +settings.githook_content = Haak-Inholl +settings.update_githook = Haak vernejen +settings.payload_url = Enn-URL +settings.http_method = HTTP-Aard +settings.content_type = Aard vum POST-Inholl +settings.secret = Geheemst +settings.slack_username = Brukernaam +settings.slack_color = Klöör +settings.discord_username = Brukernaam +settings.discord_icon_url = Bill-URL +settings.event_desc = Utlösen för: +settings.event_push_only = Schuuv-Vörfall +settings.event_send_everything = All Vörfallen +settings.event_choose = Eegene Vörfallen … +settings.event_header_repository = Repositoriums-Vörfallen +settings.event_create = Maken +settings.event_create_desc = Twieg of Mark maakt. +settings.event_delete = Lösken +settings.event_delete_desc = Twieg of Mark lösket. +settings.event_fork_desc = Repositorium gabelt. +settings.event_wiki = Wiki +settings.event_release = Publizeren +settings.event_release_desc = Publizeren in eenem Repositorium maakt, verneeit of lösket. +settings.event_push = Schuuv +settings.event_push_desc = Git-Schuuv to eenem Repositorium. +settings.event_repository = Repositorium +settings.event_repository_desc = Repositorium maakt of lösket. +settings.event_header_issue = Gefall-Vörfallen +settings.event_issues_desc = Gefall opmaakt, dichtmaakt, weer opmaakt of bewarkt. +settings.event_issue_assign = Towiesen +settings.event_issue_label = Vermarkens +settings.event_issue_milestone = Markstenen +settings.event_issue_milestone_desc = Marksteen hentoföögt, wegdaan of ännert. +settings.event_issue_comment = Kommentaren +settings.event_issue_comment_desc = Gefall-Kommentaar maakt, bewarkt of lösket. +settings.event_header_pull_request = Haalvörslag-Vörfallens +settings.event_pull_request = Ännern +settings.event_pull_request_desc = Haalvörslag opmaakt, dichtmaakt, weer opmaakt of bewarkt. +settings.event_pull_request_assign = Towiesen +settings.event_pull_request_assign_desc = Haalvörslag towiesen of Towiesen wegdaan. +settings.event_pull_request_label = Vermarkens +settings.event_pull_request_label_desc = Haalvörslag-Vermarkens hentoföögt of wegdaan. +settings.event_pull_request_milestone = Markstenen +settings.event_pull_request_milestone_desc = Marksteen hentoföögt, wegdaan of ännert. +settings.event_pull_request_comment = Kommentaren +settings.event_pull_request_comment_desc = Haalvörslag-Kommentaar maakt, bewarkt of lösket. +settings.event_pull_request_review = Nakiekens +settings.event_pull_request_review_desc = Haalvörslag tostimmt of torüggwiest of Nakiekens-Kommentaren hentoföögt. +settings.event_pull_request_sync = Verneeit +settings.event_pull_request_sync_desc = Twieg automatisk mit de Enn-Twieg verneeit. +settings.event_pull_request_review_request = Nakiekens-Anfragen +settings.event_pull_request_review_request_desc = Haalvörslag-Nakieken anfraggt of Nakiekens-Anfraag wegdaan. +settings.event_pull_request_approvals = Haalvörslag-Tostimmens +settings.event_pull_request_merge = Haalvörslag-Tosamenföhren +settings.event_pull_request_enforcement = Dwingen +settings.event_package = Paket +settings.event_package_desc = Paket in eenem Repositorium maakt of lösket. +settings.branch_filter = Twieg-Filter +settings.add_hook_success = De Internett-Haak is hentoföögt worden. +settings.update_webhook = Internett-Haak vernejen +settings.update_hook_success = De Internett-Haak is verneeit worden. +settings.delete_webhook = Internett-Haak wegdoon +settings.recent_deliveries = Leste Leverns +settings.hook_type = Haak-Aard +settings.slack_token = Teken +settings.graphql_url = GraphQL-URL +settings.web_hook_name_gitea = Gitea +settings.web_hook_name_discord = Discord +settings.web_hook_name_telegram = Telegram +settings.web_hook_name_matrix = Matrix +settings.web_hook_name_msteams = Microsoft Teams +settings.web_hook_name_feishu = Feishu / Lark Suite +settings.web_hook_name_feishu_only = Feishu +settings.web_hook_name_larksuite_only = Lark Suite +settings.web_hook_name_wechatwork = WeCom (WeChat Work) +settings.web_hook_name_packagist = Packagist +settings.packagist_username = Packagist-Brukernaam +settings.packagist_api_token = API-Teken +settings.packagist_package_url = Packagist-Paket-URL +settings.web_hook_name_sourcehut_builds = Up SourceHut bauen +settings.sourcehut_builds.manifest_path = Padd tum Bau-Manifest +settings.sourcehut_builds.visibility = Upgaav-Sichtbaarkeid +settings.add_deploy_key = Utbrengens-Slötel hentofögen +settings.is_writable = Schriev-Togriep anknipsen +settings.is_writable_info = Deesem Utbrengens-Slötel verlöven, tum Repositorium to schuven. +settings.no_deploy_keys = Dat gifft noch keene Utbrengens-Slötels. +settings.title = Titel +settings.key_name_used = Dat gifft al eenen Utbrengens-Slötel mit de sülve Naam. +settings.add_key_success = De Utbrengens-Slötel »%s« is hentoföögt worden. +settings.deploy_key_deletion = Utbrengens-Slötel wegdoon +settings.deploy_key_deletion_success = De Utbrengens-Slötel is wegdaan worden. +settings.branches = Twiegen +settings.protected_branch = Twieg Schütten +settings.protected_branch.save_rule = Örder sekern +settings.protected_branch.delete_rule = Örder wegdoon +settings.branch_protection = Schüttens-Örders för Twieg »%s« +settings.protect_new_rule = Eene neje Twieg-Schüttens-Örder hentofögen +settings.protect_disable_push = Schuven utknipsen +settings.protect_enable_push = Schuven anknipsen +settings.protect_whitelist_committers = Verlöövt Schuvers utkören +settings.protect_whitelist_committers_desc = Blots verlöövt Brukers of Klottjen düren to deesem Twieg schuven (aver nich dwangsschuven). +settings.protect_whitelist_deploy_keys = Verlöövt Utbrengens-Slötels mit Schriev-Togriep as Schuvers. +settings.protect_whitelist_users = Verlöövt Brukers as Schuvers +settings.protect_merge_whitelist_teams = Verlöövt Klottjen as Tosamenföhrers +settings.protect_check_status_contexts = Tostands-Överprüfens anknipsen +settings.protect_check_status_contexts_list = Tostands-Överprüfens, wat in deesem Repositorium in de leste Week funnen worden sünd +settings.protect_invalid_status_check_pattern = Ungültiges Tostands-Överprüfens-Muster: »%s«. +settings.protect_required_approvals = Nödige Tostimmens +settings.protect_approvals_whitelist_enabled = Blots verlöövt Brukers of Klottjen düren tostimmen +settings.protect_approvals_whitelist_teams = Verlöövt Klottjen tum Nakieken +settings.dismiss_stale_approvals = Verslaan Tostimmens ofseggen +settings.dismiss_stale_approvals_desc = Wenn neje Kommitterens up de Twieg schuven worden, wat de Inholl vum Haalvörslag ännern, worden olle Tostimmens ofseggt. +settings.ignore_stale_approvals = Verslaan Tostimmens minnachten +settings.ignore_stale_approvals_desc = Tostimmens, wat up oller Kommitterens maakt worden sünd (verslaan Nakiekens), nich daarto tellen, wo völe Tostimmens de HV hett. Is egaal wenn verslaan Nakiekens eh ofseggt worden. +settings.require_signed_commits = Kommitterens mutten unnerschrieven wesen +settings.require_signed_commits_desc = Schuvens to deesem Twieg verseggen, wat nich unnerschrieven sünd of nich utwiest worden könen. +settings.protect_branch_name_pattern = Naam-Muster för schütt Twiegen +settings.protect_patterns = Musters +settings.protect_protected_file_patterns = Schütt Dateinaam-Musters (trennt mit Semikolons »;«) +settings.update_protect_branch_success = Twieg-Schütten för Örder »%s« is verneeit worden. +settings.remove_protected_branch_failed = Twieg-Schüttens-Örder »%s« kunn nich wegdaan worden. +settings.block_rejected_reviews = Tosamenföhren bi Nakiekens mit erbeden Ännerns blockeren +settings.block_rejected_reviews_desc = Dat Tosamenföhren is nich verlöövt, wenn offizielle Nakiekers um Ännerns beden hebben, ok wenn dat genoog Tostimmens gifft. +settings.block_on_official_review_requests = Tosamenföhren bi offiziellen Nakiekens-Anfragen blockeren +settings.block_on_official_review_requests_desc = Dat Tosamenföhren is nich verlöövt, wenn eene offizielle Nakieker-Anfraag utstaht, ok wenn dat genoog Tostimmens gifft. +settings.block_outdated_branch = Tosamenföhren för verollte Haalvörslagen blockeren +settings.enforce_on_admins_desc = Repositoriums-Chefs düren deese Örder nich minnachten. +settings.merge_style_desc = Tosamenföhrens-Aarden +settings.default_merge_style_desc = Normaale Tosamenföhrens-Aard +settings.edit_protected_branch = Bewarken +settings.add_collaborator = Mitarbeider hentofögen +settings.webhook.replay.description = Deesen Internett-Haak weer utföhren. +settings.event_issues = Ännern +settings.webhook.delivery.success = Een Vörfall is to de Leverslang hentoföögt worden. Dat kann een paar Sekünnen düren, ehr dat in de Lever-Histoorje vörkummt. +settings.discord_icon_url.exceeds_max_length = Bill-URL düür nich langer as 2048 Bookstavens wesen +settings.update_settings_no_unit = Dat Repositorium sall tominnst elk of anner Aard vun Gebruuk verlöven. +settings.delete_notices_fork_1 = - Gabels vun deesem Repositorium worden nach de Lösken to normaalen Repositoriums. +settings.confirm_delete = Repositorium lösken +settings.add_collaborator_inactive_user = Kann eenen inaktiiv Bruker nich as Mitarbeider hentofögen. +settings.add_webhook.invalid_path = Padd düür keen Deel enthollen, wat ».« of »..« of leeg is, un kann nich mit eenem Schüünstreek begünnen of ennen. +settings.hooks_desc = Internett-Hakens schicken automatisk HTTP-POST-Anfragen to eenem Server, wenn wisse Forgejo-Vörfallen passeren. Lees mehr in de Internett-Hakens-Dokumenteren. +settings.webhook_deletion_desc = Wenn du eenen Internett-Haak wegdoost, worden siene Instellens un Lever-Histoorje lösket. Wiedermaken? +settings.githooks_desc = Git-Hakens worden vun Git sülvst utföhrt. Du kannst Haken-Dateien unnern bewarken, um eegene Aktioonen intorichten. +settings.webhook.headers = Koppriegen +settings.event_fork = Gabel +settings.event_wiki_desc = Wiki-Sied maakt, umbenöömt, bewarkt of lösket. +settings.slack_icon_url = Bill-URL +settings.slack_channel = Kanaal +settings.web_hook_name_forgejo = Forgejo +settings.sourcehut_builds.secrets = Geheemsten +settings.sourcehut_builds.secrets_helper = Giff de Upgaav Togang to de Bau-Geheemsten (bruukt de Verlöövnis SECRETS:RO) +settings.deploy_keys = Utbrengens-Slötels +settings.protect_enable_merge = Tosamenföhren anknipsen +settings.protect_no_valid_status_check_patterns = Keene gültigen Tostands-Överprüfens-Musters. +settings.protect_approvals_whitelist_users = Verlöövt Nakiekers +settings.protect_unprotected_file_patterns = Nich schütt Dateinaam-Musters (trennt mit Semikolons »;«) +settings.remove_protected_branch_success = Twieg-Schütten för Örder »%s« is wegdaan worden. +settings.default_branch_desc = Köör eenen Höövd-Repositoriums-Twieg för Haalvörslagen un Quelltext-Kommitterens ut: +settings.choose_branch = Köör eenen Twieg ut … +settings.event_issue_assign_desc = Gefall towiesen of Towiesen wegdaan. +settings.add_web_hook_desc = %s in dien Repositorium inbinnen. +settings.web_hook_name_gogs = Gogs +settings.key_been_used = Een Utbrengens-Slötel mit de sülve Inholl word al bruukt. +settings.protect_merge_whitelist_committers = Tosamenföhrens-Verlööv-List anknipsen +settings.protect_merge_whitelist_users = Verlöövt Brukers as Tosamenföhrers +settings.event_issue_label_desc = Gefall-Vermarkens hentoföögt of wegdaan. +settings.active_helper = Informatioonen över utlööst Vörfallen worden to deeser Internett-Haak-URL schickt. +settings.web_hook_name_slack = Slack +settings.protect_enable_push_desc = Elkeen, well Schriev-Togriep hett, düür to deesem Twieg schuven (aver nich dwangsschuven). +settings.protect_status_check_patterns = Tostands-Överprüfens-Musters +settings.protect_status_check_patterns_desc = Giff Musters in, wat angeven, welke Tostands-Överprüfens klaar wesen mutten, ehr Twiegen in eenen Twieg, wat up deese Örder passt, tosamenföhrt worden könen. Elkeen Rieg sett een Muster. Musters düren nich leeg wesen. +settings.protect_status_check_matched = Passt +settings.protect_approvals_whitelist_enabled_desc = Blots Nakiekens vun verlöövt Brukers of Klottjen tellen to de nödige Tahl vun Tostimmens. Sünner eene sülke List tellen Nakiekens vun elkeen, well Schriev-Togriep hett, to de nödige Tahl vun Tostimmens. +settings.protect_branch_name_pattern_desc = Naam-Musters för schütt Twiegen. Kiek in de Dokumenteren för de Muster-Syntax. Bispölen: main, release/** +settings.protected_branch_deletion = Twieg-Schütten wegdoon +settings.protected_branch_deletion_desc = Wenn du de Twieg-Schütten utknipst, düren all Brukers mit Schriev-Rechten to the Twieg schuven. Wiedermaken? +settings.active = Aktiiv +settings.deploy_key_desc = Utbrengens-Slötels hebben Blots-Lesen-Togriep up dat Repositorium. +settings.deploy_key_deletion_desc = Wenn du eenen Utbrengens-Slötel wegdoost, hett he keenen Togriep mehr up deeses Repositorium. Wiedermaken? +settings.protect_disable_push_desc = Man düür nich to deesem Twieg schuven. +settings.protect_enable_merge_desc = Elkeen, well Schriev-Togriep hett, düür Haalvörslagens in deesen Twieg tosamenföhren. +settings.protect_whitelist_teams = Verlöövt Klottjen as Schuvers +settings.protect_merge_whitelist_committers_desc = Blots verlöövt Brukers of Klottjen düren Haalvörslagen in deesen Twieg tosamenföhren. +settings.protect_check_status_contexts_desc = Verlang, dat vör de Tosamenföhren Tostands-Överprüfens klaar wesen mutten. Wenn dat anknipst is, mutten Kommitterens eerst to een anner Twieg schuven worden, un könen eerst dann tosamenföhrt of strack to eenem Twieg schuuvt worden, wat up deese Örder passt, nadeem de Tostands-Överprüfens klaar worden sünd. Wenn keen Umgeven passt, mutt de leste Kommitteren klaar wesen, wat ok immer de Umgeven is. +settings.protect_required_approvals_desc = Verlööv Haalvörslagen blots dann tosamentoföhren, wenn genoog Nakiekers tostimmt hebben. +settings.block_outdated_branch_desc = Dat Tosamenföhren is nich verlöövt, wenn de Kopp-Twieg achter de Grund-Twieg torügg is. +settings.authorization_header = Anmellens-Kopprieg +settings.authorization_header_desc = Wenn sett, word dat as Anmellens-Kopprieg för Anfragen anföögt. Bispölen: %s. +settings.slack_domain = Domään +settings.web_hook_name_dingtalk = DingTalk +settings.deploy_key_content = Inholl +settings.no_protected_branch = Dat gifft keene schütt Twiegen. +settings.enforce_on_admins = Deese Örder för Repositoriums-Chefs dwingen +settings.protected_branch_duplicate_rule_name = För deese Sammlung vun Twiegen gifft dat all een Örder +settings.tags = Markens +settings.tags.protection = Mark-Schütten +settings.tags.protection.allowed = Verlöövt +settings.tags.protection.allowed.teams = Verlöövt Klottjen +settings.tags.protection.allowed.noone = Nüms +settings.tags.protection.none = Dat gifft keene schütt Markens. +settings.thread_id = Thema-ID +settings.matrix.homeserver_url = Heimaadserver-URL +settings.matrix.room_id = Ruum-ID +settings.archive.header = Deeses Repo archiveren +settings.archive.error_ismirror = Du kannst een spegelt Repo nich archiveren. +settings.archive.tagsettings_unavailable = Mark-Instellens sünd in archiveert Repos nich verföögbaar. +settings.unarchive.button = Repo ut Archiv torügghalen +settings.unarchive.success = Dat Repo is nu nich mehr archiveert. +settings.unarchive.error = Een Fehler is bi’m Torügghalen vum Repo ut de Archiv uptreden. Kiek in de Utgaav för mehr Informatioonen. +settings.lfs = LFS +settings.lfs_filelist = LFS-Dateien, wat in deesem Repositorium verwahrt sünd +settings.lfs_lfs_file_no_commits = Keene Kommitterens för deese LFS-Datei funnen +settings.tags.protection.pattern = Mark-Muster +settings.tags.protection.allowed.users = Verlöövt Brukers +settings.chat_id = Snack-ID +settings.archive.button = Repo archiveren +settings.unarchive.header = Deeses Repo as nich mehr archiveert setten +settings.update_avatar_success = Dat Repositoriums-Kontobill is verneeit worden. +settings.lfs_findcommits = Kommitterens finnen +settings.protected_branch_required_approvals_min = Nödige Tostimmens könen nich negativ wesen. +settings.archive.mirrors_unavailable = Spegels sünd in archiveert Repos nich verföögbaar. +settings.tags.protection.create = Örder hentofögen +settings.bot_token = Bot-Teken +settings.matrix.message_type = Narichten-Aard +settings.archive.text = Wenn dat Repo archiveert word, kann man daar blots noch lesen. Dat word vum Kontor verburgen. Nüms (ok nich du sülvst!) kann noch neje Kommitterens maken of Gefallens of Haalvörslagen opmaken. +settings.archive.success = Dat Repo is archiveert worden. +settings.archive.error = Een Fehler is bi’m Archiveren vum Repo uptreden. Kiek in de Utgaav för mehr Informatioonen. +settings.archive.branchsettings_unavailable = Twieg-Instellens sünd in archiveert Repos nich verföögbaar. +settings.unarchive.text = Wenn dat Repo nich mehr archiveert is, kann dat weer Kommitterens un Schuvens kriegen un ok neje Gefallens un Haalvörslagens. +settings.lfs_no_lfs_files = In deesem Repositorium sünd keene LFS-Dateien verwahrt +settings.lfs_noattribute = Deeser Padd is im Höövd-Twieg nich as toslutbaar markeert +settings.lfs_findpointerfiles = Wieser-Dateien finnen +settings.lfs_invalid_locking_path = Ungültiger Padd: %s +settings.lfs_lock = Slött +settings.lfs_lock_path = Dateipadd tum tosluten … +settings.lfs_locks_no_locks = Keene Slötten +settings.lfs_force_unlock = Upsluten dwingen +settings.lfs_pointers.sha = Blob-Prüfsumm +settings.lfs_pointers.oid = OID +settings.lfs_pointers.inRepo = Im Repo +settings.lfs_pointers.accessible = Bruker kann togriepen +settings.lfs_pointers.associateAccessible = %d togangelk OIDs benöömen +settings.rename_branch_failed_exist = Kann Twieg nich umbenöömen, denn de Enn-Twieg %s gifft dat al. +settings.rename_branch_success = Twieg %s is in %s umbenöömt worden. +settings.rename_branch = Twieg umbenöömen +diff.browse_source = In Quell stövern +diff.parent = Ollern +diff.commit = Kommitteren +diff.git-notes = Anmarkens +diff.data_not_available = Unnerscheed-Inholl is nich verföögbaar +diff.options_button = Unnerscheed-Instellens +diff.show_diff_stats = Statistiken wiesen +diff.download_patch = Plack-Datei runnerladen +diff.show_split_view = Deelte Sicht +diff.show_unified_view = Vereenigte Sicht +diff.whitespace_button = Leegtekens +diff.whitespace_ignore_all_whitespace = Leegtekens bi’m Verglieken vun Riegen minnachten +diff.whitespace_ignore_amount_changes = Ännerns in de Meng an Leegtekens minnachten +diff.whitespace_ignore_at_eol = Ännerns in de Leegtekens am Datei-Enn minnachten +diff.stats_desc_file = %d Ännerns: %d neje Riegen un %d lösket Riegen +diff.bin = BIN +diff.bin_not_shown = Binäärdatei word nich wiesen. +diff.view_file = Datei wiesen +diff.file_before = Vörher +diff.file_after = Daarna +diff.file_byte_size = Grött +diff.file_suppressed = Datei-Unnerscheed unnerdrückt, denn dat is to grot +diff.too_many_files = Eenige Dateien worden nich wiesen, denn in deesem Unnerscheed sünd to völe Dateien ännert worden +diff.show_more = Mehr wiesen +diff.load = Unnerscheed laden +diff.generated = maakt +diff.vendored = verkoperig +diff.comment.placeholder = Eenen Kommentaar schrieven +diff.comment.start_review = Nakieken begünnen +diff.review = Nakieken klaarmaken +diff.review.header = Nakieken avgeven +diff.review.approve = Tostimmen +diff.committed_by = kommitteert vun +diff.protected = Schütt +diff.image.side_by_side = Tegenanner +diff.image.swipe = Wisken +diff.show_file_tree = Dateiboom wiesen +diff.hide_file_tree = Dateiboom verbargen +release.releases = Publizerens +release.detail = Över de Publizeren +release.tags = Markens +release.new_release = Nejes Publizeren +release.draft = Sketts +release.prerelease = Vör-Publizeren +release.stable = Stevig +release.edit = Bewarken +release.ahead.commits = %d Kommitterens +release.ahead.target = to %s siet deesem Publizeren +tag.ahead.target = to %s siet deeser Mark +release.source_code = Quelltext +release.edit_subheader = Publizerens organiseren Projekt-Versioonen. +release.tag_name = Mark-Naam +release.target = Enn +release.tag_helper_existing = Bestahn Mark. +release.title_empty = Titel kann nich leeg wesen. +release.message = Beschriev deeses Publizeren +release.prerelease_desc = As Vör-Publizeren markeren +release.prerelease_helper = Markeer, dat deeses Publizeren nich för stevig Gebruuk dacht is. +release.cancel = Ofbreken +release.publish = Publizeren publik maken +release.save_draft = Sketts sekern +release.deletion_success = Dat Publizeren is lösket worden. +release.tag_name_already_exist = Een Publizeren mit deesem Mark-Naam gifft dat al. +release.tag_name_invalid = De Mark-Naam is nich gültig. +release.tag_name_protected = De Mark-Naam is schütt. +release.downloads = Runnerladens +release.download_count_one = %s maal runnerladen +release.download_count_few = %s maal runnerladen +release.hide_archive_links = Automatisk maakt Archiven verbargen +release.releases_for = Publizerens för %s +release.tags_for = Markens för %s +release.system_generated = Deeser Anhang is automatisk maakt worden. +release.type_attachment = Anhang +release.type_external_asset = Frömdes Objekt +release.asset_external_url = Frömde URL +release.add_external_asset = Frömdes Objekt hentofögen +branch.name = Twieg-Naam +branch.already_exists = Een Twieg mit de Naam »%s« gifft dat al. +branch.delete_head = Lösken +branch.delete = Twieg »%s« lösken +branch.delete_html = Twieg lösken +branch.create_branch = Maak Twieg %s +branch.create_from = vun »%s« +branch.create_success = Twieg »%s« is maakt worden. +branch.branch_already_exists = Twieg »%s« gifft dat in deesem Repositorium al. +branch.deleted_by = Vun %s lösket +branch.restore_failed = Kunn Twieg »%s« nich torügghalen. +branch.protected_deletion_failed = Twieg »%s« is schütt un kann nich lösket worden. +branch.restore = Twieg »%s« torügghalen +branch.download = Twieg »%s« runnerladen +branch.rename = Twieg »%s« umbenöömen +branch.included = Enthollen +branch.create_new_branch = Twieg vum Twieg maken: +branch.rename_branch_to = »%s« umbenöömen to: +branch.create_branch_operation = Twieg maken +branch.new_branch = Nejen Twieg maken +topic.manage_topics = Themen verwalten +topic.done = Daan +topic.count_prompt = Du kannst nich mehr as 25 Themen utkören +settings.lfs_lock_already_exists = Slött gifft dat al: %s +diff.whitespace_show_everything = All Ännerns wiesen +diff.review.placeholder = Nakiekens-Kommentaar +settings.lfs_delete = LFS-Datei mit OID %s lösken +settings.lfs_delete_warning = Wenn eene LFS-Datei lösket word, kann bi’m Utchecken de Fehler »Objekt gifft dat nich« uptreden. Willst du dat würrelk? +settings.lfs_locks = Slötten +diff.comment.markdown_info = Markdown kann bruukt worden, um dat Textformaat antopassen. +settings.lfs_invalid_lock_directory = Kann Verteeknis nich tosluten: %s +settings.lfs_pointers.exists = Bestaht im Lager +settings.rename_branch_failed_not_exist = Kann Twieg %s nich umbenöömen, denn de Twieg gifft dat nich. +diff.comment.reply = Antern +diff.image.overlay = Överleggen +settings.lfs_lock_file_no_exist = Tosluten Datei gifft dat im Höövd-Twieg nich +diff.file_suppressed_line_too_long = Datei-Unnerscheed unnerdrückt, denn een of mehr Riegen sünd to lang +settings.lfs_pointers.found = Hett %d Blob-Wieser(s) funnen – %d benöömt, %d unbenöömt (im Lager fehlen %d) +settings.rename_branch_failed_protected = Kann Twieg %s nich umbenöömen, denn dat is een schütt Twieg. +diff.download_diff = Unnerscheed-Datei runnerladen +diff.stats_desc = %d ännert Dateien mit %d nejen Riegen un %d lösket Riegen +diff.file_image_height = Höcht +tag.create_tag_from = Neje Mark vun »%s« maken +tag.create_success = Mark »%s« is maakt worden. +error.csv.too_large = Kann deese Datei nich teken, denn se is to grot. +diff.file_image_width = Breddt +diff.comment.add_line_comment = Riegen-Kommentaar hentofögen +diff.comment.add_review_comment = Kommentaar hentofögen +release.tag_helper_new = Neje Mark. Deese Mark word vun de Enn maakt. +release.edit_release = Publizeren vernejen +release.deletion_desc = Wenn du een Publizeren löskest, word dat blots vun Forgejo wegdaan. Dat ännert nix an de Git-Mark, de Inholl vun dienem Repositorium of siener Histoorje. Wiedermaken? +release.add_tag = Mark maken +release.asset_name = Objekt-Naam +branch.delete_branch_has_new_commits = Twieg »%s« kann nich lösket worden, denn na de Tosamenföhren sünd neje Kommitterens hentoföögt worden. +branch.restore_success = Twieg »%s« is torügghaalt worden. +tag.create_tag = Mark %s maken +diff.comment.add_single_comment = Enkelt Kommentaar hentofögen +diff.review.comment = Kommentaar +diff.review.reject = Um Ännerns bidden +diff.has_escaped = Deese Rieg hett verburgen Unicode-Bookstavens +releases.desc = Verfolg Projekt-Versioonen un Runnerladens. +diff.review.self_reject = Haalvörslag-Autoren könen nich up hör eegen Haalvörslag um Ännerns beden +diff.review.self_approve = Haalvörslag-Autoren könen nich hör eegen Haalvörslag tostimmen +release.deletion_tag_desc = Lösket deese Mark ut de Repositorium. Dat ännert nix an de Inholl vun de Repositorium of siener Histoorje. Wiedermaken? +release.invalid_external_url = Ungültige frömde URL: »%s« +tag.confirm_create_tag = Mark maken +release.compare = Verglieken +branch.delete_desc = Eenen Twieg to lösken is för all Tieden. Ok wenn de lösket Twieg villicht noch körte Tied rumliggt, ehr he würrelk wegdaan word, KANN DAT MEESTTIEDENS NICH torüggnohmen worden. Wiedermaken? +branch.deletion_success = Twieg »%s« is lösket worden. +branch.included_desc = Deeser Twieg is Deel vum Höövd-Twieg +release.new_subheader = Publizerens organiseren Projekt-Versioonen. +release.tag_helper = Köör eene bestahn Mark ut of maak eene neje Mark. +release.deletion_tag_success = De Mark is lösket worden. +release.tag_already_exist = De Mark-Naam gifft dat al. +branch.warning_rename_default_branch = Du benöömst de Höövd-Twieg um. +branch.renamed = Twieg %s is in %s umbenöömt worden. +topic.format_prompt = Themen mutten mit eenem Bookstaav of Tahl begünnen, düren Binnestrekens (»-«) un Punkten (».«) enthollen un könen bit to 35 Bookstavens lang wesen. All Bookstavens mutten Kleenbookstavens wesen. +error.csv.invalid_field_count = Kann deese Datei nich teken, denn se hett de falske Tahl vun Felden in Rieg %d. +release.title = Publizerens-Titel +release.delete_release = Publizeren lösken +release.delete_tag = Mark lösken +release.deletion = Publizeren lösken +release.hide_archive_links_helper = Verbargt automatisk maakt Quelltext-Archiven för deeses Publizeren. To’n Bispööl wenn du diene eegenen uplaadst. +branch.deletion_failed = Kunn Twieg »%s« nich lösken. +branch.branch_name_conflict = Twieg-Naam »%s« is unverdragelk mit de al bestahn Twieg »%s«. +branch.new_branch_from = Nejen Twieg vun »%s« maken +tag.create_tag_operation = Mark maken +release.add_tag_msg = Bruuk de Titel un Inholl vun de Publizeren as Mark-Naricht. +find_file.go_to_file = Datei finnen +find_file.no_matching = Keene passend Datei funnen +branch.tag_collision = Twieg »%s« kann nich maakt worden, denn in de Repositorium gifft dat al eene Mark mit de sülve Naam. +branch.default_deletion_failed = Twieg »%s« is de Höövd-Twieg un kann nich lösket worden. +branch.confirm_create_branch = Twieg maken +error.csv.unexpected = Kann deese Datei nich teken, denn se enthollt eenen unverwachten Bookstaav in Rieg %d un Striep %d. +pulls.edit.already_changed = Kann Ännerns an de Haalvörslag nich sekern. Dat schient, dat de Inholl al vun een anner Bruker ännert worden is. Bidde laad de Sied neei un versöök, dat dann noch eenmaal to bewarken, daarmit du hör Ännerns nich överschriffst +mirror_lfs_endpoint_desc = Spegel word versöken, de Klonen-URL to bruken, um de LFS-Server uttofinnen. Du kannst ok eenen eegenen Ennpunkt angeven, wenn de Repositoriums-LFS-Dateien annerwaar lagert worden. +migrate_options_lfs_endpoint.description = Umtreck word versöken, de frömde Git-Tegenstee to bruken, um de LFS-Server uttofinnen. Du kannst ok eenen eegenen Ennpunkt angeven, wenn de Repositoriums-LFS-Dateien annerwaar lagert worden. +clear_ref = `Stedenwies Beteekner leegmaken` +org_labels_desc = Vereenigungs-Vermarkens, wat mit all Repositoriums unner deeser Vereenigung bruukt worden könen +invisible_runes_header = `Deese Datei enthollt unsichtbaare Unicode-Bookstavens` +ambiguous_runes_line = `Deese Rieg hett verwesselbaare Unicode-Bookstavens` +ambiguous_character = `%[1]c [U+%04[1]X] kann mit %[2]c [U+%04[2]X] verwesselt worden` +commits.search.tooltip = Du kannst Slötelwoorden mit »author:«, »committer:«, »after:« of »before:« begünnen, to’n Bispööl »revert author:Alice before:2019-01-13«. +projects.new_subheader = Verwalt, verfolg un verneei diene Arbeid an eener Stee, daarmit Projekten dörsichtig un up Tied blieven. +issues.label_archive_tooltip = Archiveert Vermarkens worden in de Vörslagens, wenn du na Vermarkens söchst, normaal nich wiest. +issues.label_exclusive_desc = Benööm de Vermark Rebeet/Ding, daarmit dat nich mit anner Vermarkens ut de sülven Rebeet/ tosamen bruukt worden kann. +issues.label_exclusive_warning = Elkeen anner Vermark in de sülve Rebeet word wegdaan, wenn de Vermarkens vun eenem Gefall of Haalvörslag bewarkt worden. +blame.ignore_revs.failed = Kunn de Versioonen in de .git-blame-ignore-revs nich minnachten. +invisible_runes_line = `Deese Rieg hett verburgen Unicode-Bookstavens` +mirror_address_url_invalid = De angeven URL is ungültig. Du muttst all Delen vun de URL recht utkielen. +mirror_address_protocol_invalid = De angeven URL is ungültig. Blots Steden vun de Aarden »http(s)://« of »git://« könen tum Spegeln bruukt worden. +mirror_use_ssh.helper = Forgejo spegelt dat Repositorium mit Git över SSH un maakt för di een Slötelpaar, wenn du deese Instellen utköörst. Du muttst wiss maken, dat de maakt publike Slötel dat Recht kriggt, to de Enn-Repositorium to schuven. Wenn du dat utköörst, kannst du keen Anmellen mit Passwoord bruken. +migrate.permission_denied_blocked = Du kannst nich vun verboden Servers importeren; bidde fraag de Chef, of he de Instellens ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS överprüfen maag. +blame.ignore_revs = Minnacht Versioonen in .git-blame-ignore-revs. Klick hier, um daar överwegtogahn un de normaale Schüld-Ansicht to wiesen. +migrate.github_token_desc = Du kannst hier een of mehr Tekens angeven, wat mit Kommas trennt sünd, um dat Umtrecken fixer to maken, um de GitHub-API-Togrieps-Begrenz. WAHRSCHAU: Wenn du dat missbruukst, kannst du de Richtlienjen vun de Deenstbedriev verletzen un dien Konto kann sperrt worden. +issues.edit.already_changed = Kann Ännerns an de Gefall nich sekern. Dat schient, dat de Inholl al vun een anner Bruker ännert worden is. Bidde laad de Sied neei un versöök, dat dann noch eenmaal to bewarken, daarmit du hör Ännerns nich överschriffst +broken_message = De Git-Daten unner deesem Repositorium könen nich lesen worden. Kuntakteer de Chef vun deeser Instanz of löske dat Repositorium. +ambiguous_runes_header = `Deese Datei enthollt verwesselbaare Unicode-Bookstavens` +ambiguous_runes_description = `Deese Datei enthollt Unicode-Bookstavens, wat man licht mit anner Bookstavens verwesseln kann. Wenn du glöövst, dat dat so wesen sall, kannst du deese Wahrschau seker minnachten. Bruuk de Utkielen-Knoop, um se to wiesen.` +invisible_runes_description = `Deese Datei enthollt unsichtbaare Unicode-Bookstavens, wat Minsken nich sehn könen, aver vun eenem Reekner anners verarbeidt worden könen. Wenn du glöövst, dat dat so wesen sall, kannst du deese Wahrschau seker minnachten. Bruuk de Utkielen-Knoop, um se to wiesen.` +comments.edit.already_changed = Kann Ännerns an de Kommentaar nich sekern. Dat schient, dat de Inholl al vun een anner Bruker ännert worden is. Bidde laad de Sied neei un versöök, dat dann noch eenmaal to bewarken, daarmit du hör Ännerns nich överschriffst +pulls.clear_merge_message_hint = Wenn du de Tosamenföhrens-Naricht leeg maakst, lösket dat blots de Naricht-Inholl un behollt sülk automatisk maakte Git-Nadragens as »Co-Autored-By …«. +settings.add_webhook_desc = Forgejo schickt POST-Anfragen mit eener angeven Inholls-Aard to de Enn-URL. Lees mehr in de Internett-Hakens-Inföhren. +issues.review.pending.tooltip = Deeser Kommentaar is jüüst för anner Brukers nich sichtbaar. Um diene utstahn Kommentaren avtogeven, köör boven in de Sied »%s« → »%s/%s/%s« ut. +settings.sourcehut_builds.access_token_helper = Togang-Teken, wat de Verlöövnis JOBS:RW hett. Maak een builds.sr.ht-Teken of een builds.sr.ht-Teken mit Togriep to Geheemsten up meta.sr.ht. +settings.protect_unprotected_file_patterns_desc = Nich schütt Dateien, wat stracks ännert worden düren, wenn de Bruker Schriev-Togriep hett, an de Schuuv-Schüttens-Örders vörbi. Mennig Musters könen mit Semikolon (»;«) trennt worden. Kiek de Dokumenteren för ">%[2]s för de Syntax an. Bispölen: .drone.yml, /docs/**/*.txt. +settings.protected_branch_required_rule_name = Ördernaam is nödig +settings.protect_protected_file_patterns_desc = Schütt Dateien, wat nich stracks ännert worden düren, sülvst wenn de Bruker dat Recht hett, Dateien in deesem Twieg hentotofögen, to bewarken of to lösken. Mennig Musters könen mit Semikolon (»;«) trennt worden. Kiek de Dokumenteren för ">%[2]s för de Syntax an. Bispölen: .drone.yml, /docs/**/*.txt. +settings.branch_filter_desc = Twieg-Verlöövnis-List för Vörfallen över dat Schuven un dat Maken un Lösken vun Twiegen, angeven as een Glob-Muster. Wenn leeg of * worden Vörfallen för all Twiegen mellt. Kiek de Dokumenteren för %[2]s för de Syntax an. Bispölen: master, {master,release*}. +settings.matrix.room_id_helper = De Ruum-ID kann vun de Element-Internett-Sied unner Ruum-Instellens → Verwiedert → Binnere Ruum-ID haalt worden. Bispööl: %s. +settings.tags.protection.pattern.description = Du kannst eenen enkelt Naam bruken of een Glob-Muster of Regel-Utdruck, um up mennig Markens to passen. Lees mehr in de Inföhren över schütt Markens. +error.broken_git_hook = Git-Hakens in deesem Repositorium schienen kaputt to wesen. Bidde folg de Dokumenteren, um se to repareren, dann schuuv een paar Kommitterens, um de Tostand to vernejen. +settings.matrix.access_token_helper = Dat word anraden, daarföör eegens een Matrix-Konto intorichten. Dat Togangs-Teken kann in de Element-Internett-Sied (in eener privaaten/anonymen Karteikaart) unner Brukermenü (boven links) → All Instellens → Hülp & Över → Togangs-Teken (stracks unner de Heimaadserver-URL) haalt worden. Maak de privaate/anonyme Karteikaart dicht (wenn du di avmellst, word dat Teken ungültig). +issues.review.add_remove_review_requests = hett %[3]s um Nakiekens vun %[1]s anfraggt un de Nakiekens-Anfragen för %[2]s wegdaan +issues.review.add_review_requests = hett %[2]s um Nakiekens vun %[1]s anfraggt +issues.review.remove_review_requests = hett %[2]s de Nakieken-Anfragen för %[1]s wegdaan +pulls.delete_after_merge.head_branch.is_protected = De Kopp-Twieg, wat du lösken willst, is een schütt Twieg un kann nich lösket worden. +pulls.delete_after_merge.head_branch.insufficient_branch = Du hest nich dat Recht, de Kopp-Twieg to lösken. +pulls.delete_after_merge.head_branch.is_default = De Kopp-Twieg, wat du lösken willst, is de Höövd-Twieg un kann nich lösket worden. +issues.filter_sort.relevance = Belang +diff.git-notes.add = Anmarken hentofögen +diff.git-notes.remove-header = Anmarken wegdoon +diff.git-notes.remove-body = Deeses Anmarken word wegdaan. +issues.num_reviews_one = %d Nakieken +issues.summary_card_alt = Tosamenfatens-Kaart vun eenem Gefall mit de Naam »%s« im Repositorium %s +issues.num_reviews_few = %d Nakiekens +settings.default_update_style_desc = Normaale Vernejens-Aard, wat bruukt word, um Haalvörslagens to vernejen, wat achter de Grund-Twieg torügg sünd. +pulls.sign_in_require = Mell di an, um eenen nejen Haalvörslag to maken. +new_from_template = Bruuk eene Vörlaag +new_advanced = Mehr Instellens +new_advanced_expand = Klick, um mehr to wiesen +auto_init_description = Begünn de Git-Histoorje mit eenem LEESMI un föög, wenn du willst, Lizenz- un .gitignore-Dateien hento. +new_from_template_description = Du kannst eene bestahn Repositoriums-Vörlaag up deeser Instanz utkören un hör Instellens anwennen. +summary_card_alt = Tosamenfatens-Kaart vun de Repositorium %s +issues.reaction.alt_add = De %[1]s-Reageren to de Kommentaar hentofögen. +issues.reaction.add = Reageren hentofögen +issues.reaction.alt_few = %[1]s hett mit %[2]s reageert. +issues.reaction.alt_many = %[1]s un %[2]d anner hebben mit %[3]s reageert. +issues.reaction.alt_remove = De %[1]s-Reageren vun de Kommentaar wegdoon. +issues.context.menu = Kommentaar-Menü +release.summary_card_alt = Tosamenfatens-Kaart vun eenem Publizeren mit de Naam »%s« im Repositorium %s +editor.commit_email = Kommitterens-E-Mail +archive.pull.noreview = Deeses Repositorium is archiveert. Du kannst keene Haalvörslagens nakieken. +commits.view_single_diff = Ännerns an deeser Datei in deesem Kommitteren wiesen +pulls.editable = Bewarkbaar +pulls.editable_explanation = Deeser Haalvörslag verlöövt Bewarkens vun Liddmaten. Du kannst stracks daarto bidragen. +issues.reopen.blocked_by_user = Du kannst deeses Gefall nich weer opmaken, denn de Repositoriums-Eegner of de Autor vun de Gefall hett di blockeert. +pulls.comment.blocked_by_user = Du kannst up deesem Haalvörslag nich kommenteren, denn de Repositoriums-Eegner of de Autor vun de Haalvörslag hett di blockeert. +issues.filter_no_results = Keene Resultaten +issues.filter_no_results_placeholder = Versöök, diene Söök-Filters antopassen. + +[repo.permissions] +code.read = Lesen: De Quelltext vun deesem Repositorium ankieken un klonen. +code.write = Schrieven: Schuuv to de Repositorium un maak Twiegen un Markens. +issues.read = Lesen: Gefallens un Kommentaren lesen un maken. +issues.write = Schrieven: Gefallens dichtmaken un wiedere Informatioonen so as Vermarkens, Markstenen, Towiesens, Anstahns-Daten un Ofhangens bewarken. +releases.write = Schrieven: Publizerens un hör Objekten publik maken, bewarken un lösken. +releases.read = Lesen: Publizerens ankieken un runnerladen. +wiki.write = Schrieven: Sieden in de inbaut Wiki maken, vernejen un lösken. +wiki.read = Lesen: Dat inbaut Wiki un siene Histoorje lesen. +pulls.write = Schrieven: Haalvörslagen dichtmaken un wiedere Informatioonen so as Vermarkens, Markstenen, Towiesens, Anstahns-Daten un Ofhangens bewarken. +pulls.read = Lesen: Haalvörslagen lesen un maken. +projects.read = Lesen: Repositoriums-Projekt-Bredden wiesen. +projects.write = Schrieven: Projekten un Striepen maken un bewarken. +packages.read = Lesen: Paketen in de Repositorium ankieken un runnerladen. +actions.write = Schrieven: CI-/CD-Affolgens vun Hand utlösen, neei starten, ofbreken of tostimmen. +actions.read = Lesen: CI-/CD-Affolgens un hör Utgaav ankieken. +ext_issues = Togriep to de Verwies to eenem frömden Gefall-Verfolger. De Rechten worden frömd verwalt. +ext_wiki = Togriep to de Verwies to eenem frömden Wiki. De Rechten worden frömd verwalt. +packages.write = Schrieven: Paketen in de Repositorium publik maken un lösken. + +[graphs] +component_loading = Lade %s … +component_loading_failed = Kunn %s nich laden +component_loading_info = Dat kann een bietje düren … +component_failed_to_load = Een unverwacht Fehler is uptreden. +code_frequency.what = Quelltext-Frequenz +contributors.what = Bidragens +recent_commits.what = Leste Kommitterens + +[org] +org_name_holder = Vereenigungs-Naam +org_full_name_holder = Kumpleter Naam vun de Vereenigung +org_name_helper = Vereenigungs-Namen sallen kört un lich to marken wesen. +create_org = Vereenigung maken +open_dashboard = Kontor opmaken +repo_updated = %s verneeit +members = Liddmaten +teams = Klottjen +code = Quelltext +lower_members = Liddmaten +lower_repositories = Repositoriums +create_new_team = Neje Klottje +team_name = Klottjen-Naam +team_desc = Beschrieven +team_desc_helper = Beschriev de Zweck of Rull vun de Klottje. +team_access_desc = Repositoriums-Togriep +team_permission_desc = Rechten +team_unit_desc = Togriep to Repositoriums-Delen verlöven +team_unit_disabled = (Utknipst) +form.create_org_not_allowed = Du hest nich dat Recht, eene Vereenigung to maken. +settings = Instellens +settings.options = Vereenigung +settings.full_name = Kumpleter Naam +settings.website = Internett-Sied +settings.visibility.limited = Begrenzt (blots anmellt Brukers könen ’t sehn) +settings.visibility.limited_shortname = Begrenzt +settings.visibility.private_shortname = Privaat +settings.update_settings = Instellens vernejen +settings.update_setting_success = Vereenigungs-Instellens sünd verneeit worden. +settings.change_orgname_redirect_prompt = De olle Naam leit daarhen um, bit well anners hüm nimmt. +settings.update_avatar_success = Dat Vereenigungs-Kontobill is verneeit worden. +settings.delete = Vereenigung lösken +settings.delete_account = Deese Vereenigung lösken +settings.delete_prompt = Dat lösket de Vereenigung för all Tieden. Dat KANN NICH torüggnohmen worden! +settings.confirm_delete_account = Lösken utwiesen +settings.delete_org_title = Vereenigung lösken +settings.delete_org_desc = De Vereenigung word för all Tieden lösket. Wiedermaken? +settings.labels_desc = Föög Vermarkens hento, wat för Gefallens in all Repositoriums unner deeser Vereenigung bruukt worden könen. +create_team = Klottje maken +form.name_pattern_not_allowed = Dat Muster »%s« is in eenem Vereenigungs-Naam nich verlöövt. +follow_blocked_user = Du kannst deeser Vereenigung nich nagahn, denn de Vereenigung hett du blockeert. +form.name_reserved = De Vereenigungs-Naam »%s« is vörbehollen. +settings.repoadminchangeteam = Repositoriums-Chef kann Togriep för Klottjen hentofögen un wegdoon +settings.email = Kuntakt-E-Mail +settings.permission = Verlöövnissen +settings.visibility.private = Privaat (blots Vereenigungs-Liddmaten könen ’t sehn) +team_name_helper = Klottjen-Namen sallen kört un licht to marken wesen. +settings.location = Stee +settings.change_orgname_prompt = Wahrschau: Wenn du de Vereenigungs-Naam ännerst, ännert sik ok de Vereenigungs-URL un de olle Naam word freeigeven. +org_desc = Beschrieven +settings.visibility = Sichtbaarkeid +settings.visibility.public = Publik +settings.hooks_desc = Föög Internett-Hakens hento, wat för all Repositoriums unner deeser Vereenigung utlööst worden. +members.membership_visibility = Liddmaat-Sichtbaarkeid: +members.public = Sichtbaar +members.public_helper = Verbargen +members.private = Nich sichtbaar +members.private_helper = Sichtbaar maken +members.member_role = Liddmaat-Rull: +members.owner = Eegner +members.member = Liddmaat +members.remove = Wegdoon +members.remove.detail = %[1]s ut %[2]s wegdoon? +members.leave = Verlaten +members.leave.detail = Willst du de Vereenigung »%s« würrelk verlaten? +members.invite_desc = Föög eenen nejen Liddmaat to %s hento: +members.invite_now = Nu inladen +teams.join = Bitreden +teams.leave = Verlaten +teams.leave.detail = Willst du de Klottje »%s« würrelk verlaten? +teams.can_create_org_repo = Repositoriums maken +teams.can_create_org_repo_helper = Liddmaten könen neje Repositoriums in de Vereenigung maken. De Maker kriggt Chef-Rechten in de neje Repositorium. +teams.none_access = Keen Togang +teams.none_access_helper = De Instellen »Keen Togang« is blots för privaate Repositoriums vun Belang. +teams.general_access = Eegener Togang +teams.general_access_helper = Liddmaten-Rechten worden vun de Rechten-Tabell unnern fastleggt. +teams.read_access = Lesen +teams.write_access = Schrieven +teams.admin_access = Chef-Togang +teams.no_desc = Deese Klottje is nich beschrieven +teams.settings = Instellens +teams.owners_permission_desc = Eegners hebben kumpleten Togang to all Repositoriums un hebben Chef-Togang to de Vereenigung. +teams.update_settings = Instellens vernejen +teams.delete_team = Klottje wegdoon +teams.add_team_member = Klottjen-Liddmaat hentofögen +teams.delete_team_success = De Klottje is wegdaan worden. +teams.write_permission_desc = Deese Klottje gifft Schrievens-Togriep: Liddmaten könen Klottjen-Repositoriums ankieken un daarhen schuven. +teams.remove_all_repos_title = All Klottjen-Repositoriums wegdoon +teams.add_all_repos_title = All Repositoriums hentofögen +teams.add_nonexistent_repo = Dat Repositorium, wat du hentofögen willst, gifft dat nich; bidde maak ’t eerst. +teams.add_duplicate_users = Bruker is al een Klottjen-Liddmaat. +teams.members.none = Deese Klottje hett keene Liddmaten. +teams.specific_repositories = Wisse Repositoriums +teams.all_repositories_helper = Klottje het Togang to all Repositoriums. Wenn du dat utköörst, worden all bestahn Repositoriums to de Klottje hentoföögt. +teams.invite.title = Du büst inladen worden, to de Klottje %s in de Vereenigung %s bitotreden. +teams.invite.by = Vun %s inladen +teams.invite.description = Bidde klick up de Knoop unnern, um to de Klottje bitotreden. +teams.invite_team_member = To %s inladen +teams.delete_team_desc = Wenn du eene Klottje wegdoost, hebben hör Liddmaten keen Togriep mehr up de Repositoriums. Wiedermaken? +teams.admin_permission_desc = Deese Klottje gifft Chef-Togriep: Liddmaten könen Klottjen-Repositoriums ankieken, daarhen schuven un Mitarbeiders hentofögen. +teams.create_repo_permission_desc = Daarto gifft deese Klottje dat Recht, Repositoriums to maken: Liddmaten könen neje Repositoriums in de Vereenigung maken. +teams.repositories = Klottjen-Repositoriums +teams.members = Klottjen-Liddmaten +teams.add_all_repos_desc = Dat föögt all de Repositoriums in de Vereenigung to de Klottje hento. +teams.admin_access_helper = Liddmaten könen to Klottjen-Repositoriums schuven un halen un daar Mitarbeiders hentofögen. +teams.delete_team_title = Klottje wegdoon +teams.invite_team_member.list = Utstahn Inladens +teams.remove_all_repos_desc = Dat doot all Repositoriums vun de Klottje weg. +teams.read_permission_desc = Deese Klottje gifft Lesens-Togriep: Liddmaten könen Klottjen-Repositoriums ankieken un klonen. +teams.repos.none = Deese Klottje kann up keene Repositoriums togriepen. +teams.specific_repositories_helper = Liddmaten hebben blots Togriep up Repositoriums, wat besünners to de Klottje hentoföögt worden sünd. Wenn du dat utköörst, worden Repositoriums, wat du al mit All Repositoriums hentoföögt hest, nich automatisk wegdaan. +teams.all_repositories = All Repositoriums +settings.change_orgname_redirect_prompt.with_cooldown.one = De olle Vereenigungs-Naam word na eener Ofköhl-Düür vun %[1]d Dag för all Lüü verföögbaar wesen. In de Ofköhl-Düür kannst du de ollen Naam noch torügghalen. +settings.change_orgname_redirect_prompt.with_cooldown.few = De olle Vereenigungs-Naam word na eener Ofköhl-Düür vun %[1]d Dagen för all Lüü verföögbaar wesen. In de Ofköhl-Düür kannst du de ollen Naam noch torügghalen. + +[admin] +dashboard = Kontor +self_check = Sülvst-Överprüfen +identity_access = Sülvst & Togang +users = Brukerkonten +organizations = Vereenigungen +assets = Quelltext-Objekten +repositories = Repositoriums +hooks = Internett-Hakens +integrations = Inbinnens +authentication = Anmellens-Quellen +emails = Bruker-E-Mails +config = Inrichten +notices = Systeem-Narichtens +config_summary = Tosamenfaten +monitor = Överwachen +first_page = Eerste +last_page = Leste +config_settings = Instellens +total = All tosamen: %d +settings = Chef-Instellens +dashboard.statistic = Tosamenfaten +dashboard.operations = Plegens-Aktioonen +dashboard.new_version_hint = Forgejo %s is nu verföögbaar, du hest %s. Kiek de Blog för mehr Informatioonen an. +dashboard.delete_generated_repository_avatars = Maakte Repositoriums-Kontobillers lösken +dashboard.sync_repo_tags = Markens vun Git-Daten to de Datenbank spegeln +dashboard.update_mirrors = Spegels vernejen +dashboard.repo_health_check = Gesundheids-Överprüfen för all Repositoriums +dashboard.check_repo_stats = De Statistiken vun all Repositoriums överprüfen +dashboard.deleted_branches_cleanup = Lösket Twiegen uprümen +dashboard.git_gc_repos = Up all Repositoriums de Müll avhalen +dashboard.resync_all_sshprincipals = De ».ssh/authorized_principals«-Datei mit de SSH-Höövdmannen vun Forgejo vernejen. +dashboard.reinit_missing_repos = All fehlend Git-Repositoriums neei inrichten, för wat dat Uptekens gifft +dashboard.cleanup_packages = Avlopen Paketen uprümen +dashboard.cleanup_actions = Avlopen Utgaven un Objekten vun Aktioonen uprümen +dashboard.current_goroutine = Stedenwies Go-Routinen +dashboard.total_memory_allocated = Spieker towiesen all tosamen +dashboard.memory_allocate_times = Spieker-Towiesens +dashboard.system_status = Systeem-Tostand +dashboard.operation_switch = Wesseln +dashboard.operation_run = Utföhren +dashboard.clean_unbind_oauth_success = All unverbunnen OAuth-Verbinnens sünd wegdaan worden. +dashboard.task.process = Upgaav: %[1]s +dashboard.task.cancelled = Upgaav: %[1]s ofbroken: %[3]s +dashboard.task.error = Fehler in Upgaav: %[1]s: %[3]s +dashboard.task.unknown = Unbekannte Upgaav: %[1]s +dashboard.cron.started = Hett Tiedplaan begunnen: %[1]s +dashboard.cron.error = Fehler im Tiedplaan: %s: %[3]s +dashboard.delete_inactive_accounts.started = Upgaav, um all nich aktiveerten Konten to lösken, begunnen. +dashboard.delete_repo_archives = All Repositoriums-Archiven (ZIP, TAR.GZ, usw. …) lösken +dashboard.delete_missing_repos.started = Upgaav, um all Repositoriums sünner Git-Dateien to lösken, begunnen. +dashboard.delete_missing_repos = All Repositoriums sünner Git-Dateien lösken +dashboard.task.finished = Upgaav: %[1]s vun %[2]s begunnen is daan worden +dashboard.cron.finished = Tiedplaan: %[1]s is daan worden +dashboard.operation_name = Aktioons-Naam +dashboard.cron.process = Tiedplaan: %[1]s +dashboard.cron.cancelled = Tiedplaan: %[1]s ofbroken: %[3]s +dashboard.resync_all_sshkeys = De ».ssh/authorized_keys«-Datei mit de SSH-Slötels vun Forgejo vernejen. +dashboard.memory_obtained = Spieker erhollen +dashboard.pointer_lookup_times = Wieser-Nakiek-Tieden +dashboard.task.started = Hett Upgaav begunnen: %[1]s +dashboard.delete_inactive_accounts = All nich aktiveerten Konten lösken +dashboard.delete_repo_archives.started = Upgaav, um all Repositoriums-Archiven to lösken, begunnen. +dashboard.archive_cleanup = Olle Repositoriums-Archiven lösken +dashboard.resync_all_hooks = De Hakens »pre-receive«, »update« un »post-receive« in all Repositoriums vernejen +dashboard.clean_unbind_oauth = Unverbunnen OAuth-Verbinnens uprümen +dashboard.sync_repo_branches = Fehlend Twiegen vun Git-Daten to de Datenbank spegeln +dashboard.update_migration_poster_id = Umtreck-Autor-IDs vernejen +dashboard.cleanup_hook_task_table = hook_task-Tabell uprümen +dashboard.sync_external_users = Frömde Brukerdaten vernejen +dashboard.server_uptime = Server-Bedrievstied +dashboard.current_memory_usage = Stedenwies Spiekerbruuk +dashboard.heap_memory_obtained = Hoopspieker erhollen +dashboard.current_heap_usage = Stedenwies Hoopbruuk +dashboard.heap_memory_idle = Hoopspieker mit nix to doon +dashboard.heap_memory_released = Hoopspieker freeigeven +dashboard.heap_objects = Hoopobjekten +dashboard.bootstrap_stack_usage = Bootstrap-Stapelbruuk +dashboard.stack_memory_obtained = Stapelspieker erhollen +dashboard.mspan_structures_usage = MSpan-Struktuuren-Bruuk +dashboard.mspan_structures_obtained = MSpan-Struktuuren erhollen +dashboard.mcache_structures_usage = MCache-Struktuuren-Bruuk +dashboard.gc_metadata_obtained = Wiedere Informatioonen för GC erhollen +dashboard.other_system_allocation_obtained = Anner Systeemtowiesens erhollen +dashboard.next_gc_recycle = Anner GC-Müllavhalen +dashboard.last_gc_time = Tied siet lestem GC +dashboard.total_gc_pause = GC-Paus all tosamen +dashboard.last_gc_pause = Leste GC-Paus +dashboard.gc_times = GC-Tieden +dashboard.delete_old_actions = All olles Doon ut de Datenbank lösken +dashboard.update_checker = Vernejens-Sööker +dashboard.delete_old_system_notices = All ollen Systeemnarichten ut de Datenbank lösken +dashboard.gc_lfs = In LFS-Meta-Objekten de Müll avhalen +dashboard.stop_zombie_tasks = Spöök-Aktioonen-Upgaven anhollen +dashboard.stop_endless_tasks = Aktioonen-Upgaven sünner Enn anhollen +dashboard.cancel_abandoned_jobs = Verlaten Aktioonen-Upgaven ofbreken +dashboard.sync_branch.started = Twieg-Vernejen begunnen +users.user_manage_panel = Brukerkonten verwalten +users.new_account = Brukerkonto maken +users.name = Brukernaam +users.full_name = Kumpleter Naam +users.activated = Aktiveert +users.admin = Chef +users.restricted = Begrenzt +users.reserved = Vörbehollen +users.created = Maakt +users.last_login = Tolest anmellt +users.never_login = Nie anmellt +users.send_register_notify = E-Mail-Naricht över dat Registreren schicken +users.new_success = Dat Brukerkonto »%s« is maakt worden. +users.edit = Bewarken +users.auth_source = Anmellens-Quell +users.local = Stedenwies +users.auth_login_name = Anmell-Naam +users.password_helper = Laat dat Passwoord leeg, um dat nich to ännern. +users.update_profile_success = Dat Brukerkonto is verneeit worden. +users.edit_account = Brukerkonto bewarken +users.is_activated = Konto aktiveert +users.prohibit_login = Konto sperrt +users.block.description = Deesem Bruker verseggen, mit deesem Deenst dör deeses Konto to warken, un dat Anmellen verseggen. +users.is_admin = Chefkonto +users.admin.description = Deesem Bruker kumpleten Togriep to all Chef-Aktioonen geven, wat mit de Internett-Schnittstee un de API gahn. +users.is_restricted = Begrenztes Konto +users.allow_git_hook = Kann Git-Hakens maken +dashboard.memory_free_times = Spieker-Freeigevens +users.bot = Bot +users.2fa = 2FA +dashboard.profiling_bucket_hash_table_obtained = Profileren-Emmer-Prüfsummtabell erhollen +dashboard.sync_tag.started = Mark-Vernejen begunnen +dashboard.rebuild_issue_indexer = Gefall-Indizerer neei bauen +users.activated.description = Of dat E-Mail-Utwiesen ofsluten is. De Eegner vun eenem nich aktiveerten Konto kann sik nich anmellen, bit dat E-Mail-Utwiesen ofsluten is. +dashboard.heap_memory_in_use = Hoopspieker bruukt +users.max_repo_creation_desc = (Giff -1 in, um de Normaalweert vun de Instanz to bruken.) +dashboard.mcache_structures_obtained = MCache-Struktuuren erhollen +dashboard.start_schedule_tasks = Aktioonen-Upgaven mit Tiedplaan begünnen +users.remote = Frömd +users.max_repo_creation = Hoogste Tahl vun Repositoriums +dashboard.delete_old_actions.started = Hett begunnen, all olles Doon ut de Datenbank to lösken. +users.repos = Repos +users.restricted.description = Verlööv blots, mit de Repositoriums un Vereenigungen to warken, waar deeser Bruker as Mitarbeider hentoföögt is. Dat verhinnert Togriep to publiken Repositoriums in deeser Instanz. +users.allow_git_hook_tooltip = Git-Hakens worden as de BS-Bruker utföhrt, unner well Forgejo löppt, un hebben dat sülve Maat an Host-Togriep. Also könen Brukers mit de Git-Haak-Recht all Forgejo-Repositoriums ankieken un bewarken un ok de Datenbank, wat Forgejo bruukt. Also könen se ok Chef-Rechten för Forgejo kriegen. +users.allow_import_local = Kann stedenwies Repositoriums importeren +users.local_import.description = Verlööv, Repositoriums vun de stedenwies Dateisysteem vum Server to importeren. Dat kann een Sekerheidsprobleem wesen. +users.allow_create_organization = Kann Vereenigungen maken +users.organization_creation.description = Verlööv, neje Vereenigungen to maken. +users.update_profile = Brukerkonto vernejen +users.delete_account = Brukerkonto lösken +users.cannot_delete_self = Du kannst nich di sülven lösken +users.still_own_repo = De Bruker is noch een Eegner vun een of mehr Repositoriums. Löske of överdraag deese Repositoriums eerst. +users.still_has_org = De Bruker is noch een Liddmaat vun eener Vereenigung. Doo de Bruker eerst ut all Vereenigungen weg. +users.purge = Bruker wegschüren +users.purge_help = Mit Dwang de Bruker un all siene Repositoriums, Vereenigungen un Paketen lösken. All Kommentaren un Gefallens, wat deeser Bruker maakt hett, worden ok lösket. +users.still_own_packages = Deeser Bruker is noch Eegner vun een of mehr Paketen, löske eerst deese Paketen. +users.list_status_filter.menu_text = Filter +users.list_status_filter.not_active = Nich aktiiv +users.list_status_filter.is_restricted = Begrenzt +users.list_status_filter.not_restricted = Unbegrenzt +users.list_status_filter.is_2fa_enabled = 2FA anknipst +users.list_status_filter.not_2fa_enabled = 2FA utknipst +users.details = Bruker-Informatioonen +emails.email_manage_panel = Bruker-E-Mails verwalten +emails.primary = Höövd +emails.activated = Aktiveert +emails.filter_sort.email = E-Mail +emails.filter_sort.email_reverse = E-Mail (umdreiht) +emails.filter_sort.name = Brukernaam +emails.filter_sort.name_reverse = Brukernaam (umdreiht) +emails.updated = E-Mail verneeit +emails.not_updated = Kunn de erbeden E-Mail-Adress nich vernejen: %v +emails.duplicate_active = Deese E-Mail-Adress is al för eenen anner Bruker aktiiv. +emails.change_email_header = E-Mail-Eegenskuppen vernejen +emails.change_email_text = Willst du deese E-Mail-Adress würrelk vernejen? +emails.delete = E-Mail wegdoon +emails.delete_desc = Willst du deese E-Mail-Adress würrelk wegdoon? +emails.deletion_success = De E-Mail-Adress is wegdaan worden. +emails.delete_primary_email_error = Du kannst de Höövd-E-Mail nich wegdoon. +orgs.org_manage_panel = Vereenigungen verwalten +orgs.name = Naam +orgs.teams = Klottjen +orgs.members = Liddmaten +orgs.new_orga = Neje Vereenigung +repos.repo_manage_panel = Repositoriums verwalten +repos.unadopted = Repositoriums sünner Eegner +repos.unadopted.no_more = Keene Repositoriums sünner Eegner funnen. +repos.owner = Eegner +repos.name = Naam +repos.private = Privaat +repos.issues = Gefallens +repos.size = Grött +repos.lfs_size = LFS-Grött +packages.package_manage_panel = Paketen verwalten +packages.total_size = Grött all tosamen: %s +packages.unreferenced_size = Unbenöömt Grött: %s +packages.cleanup = Avlopen Daten uprümen +packages.cleanup.success = Avlopen Daten uprüümt +packages.owner = Eegner +packages.creator = Maker +packages.name = Naam +packages.version = Versioon +packages.type = Aard +packages.repository = Repositorium +packages.size = Grött +packages.published = Publizeert +defaulthooks = Normaale Internett-Hakens +defaulthooks.add_webhook = Normaalen Internett-Haak hentofögen +defaulthooks.update_webhook = Normaalen Internett-Haak vernejen +systemhooks = Systeem-Internett-Hakens +systemhooks.add_webhook = Systeem-Internett-Haak hentofögen +systemhooks.update_webhook = Systeem-Internett-Haak vernejen +auths.auth_manage_panel = Anmellens-Quellen verwalten +auths.new = Anmellens-Quell hentofögen +auths.name = Naam +auths.type = Aard +systemhooks.desc = Internett-Hakens schicken automatisk HTTP-POST-Anfragen to eenem Server, wenn wisse Forgejo-Vörfallen passeren. Internett-Hakens, wat hier inricht worden, hanneln för all Repositoriums in de Systeem, also bedenk bidde, wat dat för de Systeemlast heten word. Lees mehr in de Internett-Hakens-Dokumenteren. +auths.enabled = Anknipst +auths.updated = Verneeit +auths.security_protocol = Sekerheids-Protokoll +auths.domain = Domään +auths.host = Host +auths.port = Poort +auths.bind_dn = Binne-DN +auths.bind_password = Binne-Passwoord +auths.user_base = Bruker-Söök-Grundlaag +auths.user_dn = Bruker-DN +auths.attribute_username = Brukernaam-Eegenskupp +auths.attribute_username_placeholder = Laat dat leeg, um de Brukernaam to bruken, wat in Forgejo ingeven worden is. +auths.attribute_name = Vörnaam-Eegenskupp +auths.attribute_surname = Achternaam-Eegenskupp +auths.attribute_mail = E-Mail-Eegenskupp +auths.attribute_ssh_public_key = Eegenskupp för publiken SSH-Slötel +auths.attribute_avatar = Kontobill-Eegenskupp +auths.attributes_in_bind = Eegenskuppen in Binne-DN-Umgeven halen +auths.default_domain_name = Normaaler Domään-Naam för de E-Mail-Adress +auths.allow_deactivate_all = Verlööv, dat een leges Söökresultaat all Brukers as nich aktiiv sett +auths.use_paged_search = Söök mit Siedens bruken +auths.search_page_size = Siedengrött +auths.filter = Bruker-Filter +auths.admin_filter = Chef-Filter +auths.restricted_filter = Begrenzt-Filter +auths.verify_group_membership = Gruppen-Liddmatenskupp in LDAP utwiesen (laat de Filter leeg, um dat to överspringen) +auths.group_search_base = Gruppensöök-Grundlaag-DN +auths.group_attribute_list_users = Gruppen-Eegenskupp, wat de Brukerlist enthollt +auths.user_attribute_in_group = Bruker-Eegenskupp in Grupp list +auths.map_group_to_team_removal = Brukers ut spegelt Klottjen wegdoon, wenn de Bruker nich in de tohörig LDAP-Grupp is +auths.enable_ldap_groups = LDAP-Gruppen anknipsen +auths.ms_ad_sa = MS-AD-Söök-Eegenskuppen +auths.smtp_auth = SMTP-Anmellens-Aard +auths.smtphost = SMTP-Host +auths.smtpport = SMTP-Poort +auths.allowed_domains = Verlöövte Domänen +auths.skip_tls_verify = TLS-Utwiesen överspringen +auths.force_smtps = SMTPS dwingen +auths.helo_hostname = HELO-Hostnaam +auths.helo_hostname_helper = Hostnaam, wat mit HELO schickt word. Laat dat leeg, um de stedenwies Hostnaam to schicken. +auths.disable_helo = HELO utknipsen +auths.pam_service_name = PAM-Deenst-Naam +auths.pam_email_domain = PAM-E-Mail-Domään (nich nödig) +auths.oauth2_provider = OAuth2-Anbeder +auths.oauth2_icon_url = Bill-URL +auths.oauth2_clientID = Klient-ID (Slötel) +auths.oauth2_clientSecret = Klient-Geheemst +auths.oauth2_use_custom_url = Eegene URLs in Stee vun de normaalen URLs bruken +auths.oauth2_tokenURL = Teken-URL +auths.oauth2_authURL = Anmellen-URL +auths.oauth2_profileURL = Profil-URL +auths.oauth2_emailURL = E-Mail-URL +auths.skip_local_two_fa = Stedenwies 2FA överspringen +auths.oauth2_tenant = Inwohner +auths.oauth2_scopes = Wiedere Rebeeten +users.deletion_success = Dat Brukerkonto is lösket worden. +users.list_status_filter.is_admin = Chef +auths.syncenabled = Bruker-Vernejen anknipsen +users.reset_2fa = 2FA torüggsetten +users.list_status_filter.is_prohibit_login = Anmellen verseggen +users.list_status_filter.not_admin = Keen Chef +auths.auth_type = Anmellens-Aard +auths.restricted_filter_helper = Laat dat leeg, wenn keene Brukers begrenzt wesen sallen. Bruuk eenen Steern (»*«), um all Brukers, wat nich up de Chef-Filter passen, as begrenzt to setten. +auths.force_smtps_helper = SMTPS word alltieden up Poort 465 bruukt. Sett dat, um SMTPS up anner Poorten to dwingen. (Anners word up anner Poorten STARTTLS bruukt, wenn de Host dat unnerstütt.) +users.list_status_filter.reset = Torüggsetten +users.list_status_filter.is_active = Aktiiv +users.list_status_filter.not_prohibit_login = Anmellen verlöven +auths.auth_name = Anmellens-Naam +auths.map_group_to_team = LDAP-Gruppens up Vereenigungs-Klottjen avbillen (laat dat Feld leeg, um dat to överspringen) +auths.allowed_domains_helper = Laat dat leeg, um all Domänens to verlöven. Trenn mennig Domänen mit eenem Komma (»,«). +defaulthooks.desc = Internett-Hakens schicken automatisk HTTP-POST-Anfragen to eenem Server, wenn wisse Forgejo-Vörfallen passeren. Internett-Hakens, wat hier inricht worden, sünd Normaalweertens un worden in all neje Repositoriums kopeert. Lees mehr in de Internett-Hakens-Dokumenteren. +auths.openIdConnectAutoDiscoveryURL = URL för Automatisk Utförsken mit OpenID-Verbinnen +auths.skip_local_two_fa_helper = Wenn dat nich sett is, heet dat, dat stedenwies Brukers mit 2FA doch tum Anmellen dör 2FA gahn mutten +auths.oauth2_required_claim_name = Nödig Anrecht-Naam +auths.oauth2_required_claim_value = Nödig Anrecht-Weert +auths.oauth2_required_claim_value_helper = Sett deesen Weert, um dat Anmellen vun deesem Quell blots to Brukers to verlöven, well een Anrecht up deesen Naam un Weert hebben +auths.oauth2_required_claim_name_helper = Sett deesen Naam, um dat Anmellen vun deesem Quell blots to Brukers to verlöven, well een Anrecht up deesen Naam hebben +auths.oauth2_group_claim_name = Anrecht-Naam, wat Gruppnamen för deesen Quell gifft. (Nich nödig) +auths.oauth2_admin_group = Gruppen-Anrecht-Weert för Chef-Brukers. (Nich nödig – bruukt boven de Anrecht-Naam) +auths.oauth2_restricted_group = Gruppen-Anrecht-Weert för begrenzte Brukers. (Nich nödig – bruukt boven de Anrecht-Naam) +auths.oauth2_map_group_to_team = Billt Anrechts-Gruppen up Vereenigungs-Klottjen av. (Nich nödig – bruukt boven de Anrecht-Naam) +auths.oauth2_map_group_to_team_removal = Brukers vun spegelt Klottjen wegdoon, wenn de Bruker nich to de tohörig Grupp daartohöört. +auths.sspi_auto_create_users = Brukers automatisk maken +auths.sspi_auto_activate_users = Brukers automatisk aktiveren +auths.sspi_auto_activate_users_helper = Verlöövt de SSPI-Anmellens-Aard, neje Brukers automatisk to aktiveren +auths.sspi_separator_replacement = Trennteken, wat in Stee vun \, / un @ bruukt word +auths.sspi_separator_replacement_helper = De Bookstaav, wat bruukt word, um de Trenntekens vun unnerörnt Anmell-Namen uttowesseln (to’n Bispööl dat \ in »DOMAIN\bruker«) un Bruker-Höövdmann-Namen (to’n Bispööl dat @ in »bruker@example.org«). +auths.sspi_default_language = Bruker-Normaal-Spraak +auths.tips = Tipps +auths.tips.gmail_settings = Gmail-Instellens: +auths.tips.oauth2.general = Anmellen mit OAuth2 +auths.tips.oauth2.general.tip = Wenn du een nejes OAuth2-Programm vermarkst, sall de Rückroop-/Umleit-URL wesen: +auths.tip.oauth2_provider = OAuth2-Anbeder +auths.tip.bitbucket = Vermark eenen nejen OAuth-Bruker up %s un föög de Verlööv »Konto« → »Lesen« hento +auths.tip.nextcloud = Vermark eenen nejen OAuth-Bruker up diener Instanz, indeem du dat Menü »Instellens« → »Sekerheid« → »OAuth-2.0-Klient« bruukst +auths.tip.dropbox = Maak een nejes Programm up %s +auths.tip.github = Vermark een nejes OAuth-Programm up %s +auths.tip.gitlab_new = Vermark een nejes Programm up %s +auths.tip.google_plus = Haal OAuth2-Klient-Anmelldaten vun de Google-API-Konsool up %s +auths.tip.discord = Vermark een nejes Programm up %s +auths.tip.gitea = Vermark een nejes OAuth2-Programm. Anleden kann up %s funnen worden +auths.tip.twitter = Gah to %s, maak een Programm un wees wiss, dat de Instellen »Verlööv deesem Programm, tum Anmellen mit Twitter bruukt to worden« anknipst is +auths.edit = Anmellens-Quell bewarken +auths.activated = Deeser Anmellens-Quell is aktiveert +auths.new_success = De Anmellens-Aard »%s« is hentoföögt worden. +auths.update_success = De Anmellens-Quell is verneeit worden. +auths.update = Anmellens-Quell vernejen +auths.delete = Anmellens-Quell wegdoon +auths.delete_auth_title = Anmellens-Quell wegdoon +auths.delete_auth_desc = Wenn du eenen Anmellens-Quell wegdoost, könen Brukers dat nich mehr bruken, um sik antomellen. Wiedermaken? +auths.still_in_used = De Anmellens-Quell word noch bruukt. Du muttst Brukers, wat deesen Anmellens-Quell bruken, eerst ännern of lösken. +auths.deletion_success = De Anmellens-Quell is wegdaan worden. +auths.login_source_exist = De Anmellens-Quell »%s« gifft dat al. +auths.unable_to_initialize_openid = Kann de OpenID-Verbinnens-Anbeder nich inrichten: %s +auths.invalid_openIdConnectAutoDiscoveryURL = Ungültige URL för Automatisk Utförsken (dat mutt eene gültige URL wesen, wat mit http:// of https:// begünnt) +config.server_config = Server-Inrichten +config.app_name = Instanz-Titel +config.app_slogan = Instanz-Motto +config.app_ver = Forgejo-Versioon +config.app_url = Grund-URL +config.custom_file_root_path = Eegener Datei-Ruut-Padd +config.domain = Server-Domään +config.offline_mode = Stedenwies-Modus +config.disable_router_log = Router-Utgaav utknipsen +config.run_user = Bruker för ’t Utföhren +config.run_mode = Utföhrens-Aard +config.git_version = Git-Versioon +config.lfs_root_path = LFS-Ruut-Padd +config.script_type = Schrievens-Aard +config.ssh_config = SSH-Inrichten +config.ssh_enabled = Anknipst +config.ssh_start_builtin_server = Inbaut Server bruken +config.ssh_domain = SSH-Server-Domään +config.ssh_port = Poort +config.ssh_listen_port = Tohören-Poort +config.ssh_root_path = Ruutpadd +config.ssh_key_test_path = Slöteltestpadd +config.ssh_minimum_key_size_check = Minnste Slötelgrött prüfen +config.ssh_minimum_key_sizes = Minnste Slötelgröten +config.lfs_config = LFS-Inrichten +config.lfs_enabled = Anknipst +config.lfs_content_path = LFS-Inholls-Padd +config.db_config = Datenbank-Inrichten +config.db_type = Aard +config.db_host = Host +config.db_name = Naam +config.db_user = Brukernaam +config.db_schema = Schema +config.db_ssl_mode = SSL +config.db_path = Padd +config.register_email_confirm = E-Mail-Utwiesen bi’m Registreren verlangen +config.disable_register = Sülvst-Registreren utknipsen +config.reverse_auth_user = Umdreiht-Proxy-Anmell-Bruker +config.lfs_http_auth_expiry = LFS-HTTP-Anmellens-Avlooptied +config.enable_openid_signin = OpenID-Anmellen anknipsen +config.show_registration_button = Registreren-Knoop wiesen +config.require_sign_in_view = Anmellen verlangen, um Inholl to wiesen +config.mail_notify = E-Mail-Narichtens anknipsen +config.enable_captcha = CAPTCHA anknipsen +config.active_code_lives = Ofloops-Düür vun de Aktiverens-Teken +config.default_keep_email_private = E-Mail-Adressen normaal verbargen +config.default_allow_create_organization = Normaal verlöven, Vereenigungen to maken +config.enable_timetracking = Tied-Erfaten anknipsen +config.default_enable_timetracking = Tied-Erfaten normaal anknipsen +config.default_allow_only_contributors_to_track_time = Blots Bidragers Tied erfaten laten +config.no_reply_address = Verburgen E-Mail-Domään +config.default_visibility_organization = Normaal-Sichtbaarkeid vun nejen Vereenigungen +config.default_enable_dependencies = Gefall-Ofhangens normaal anknipsen +config.webhook_config = Internett-Haak-Inrichten +config.queue_length = Slang-Längde +config.deliver_timeout = Lever-Tied-Överweggahn +config.skip_tls_verify = TLS-Utwiesen överspringen +config.mailer_config = E-Mailer-Inrichten +config.mailer_enabled = Anknipst +config.mailer_enable_helo = HELO anknipsen +config.mailer_name = Naam +config.mailer_smtp_addr = SMTP-Host +config.mailer_smtp_port = SMTP-Poort +config.mailer_user = Bruker +config.mailer_use_sendmail = Sendmail bruken +config.mailer_sendmail_path = Sendmail-Padd +config.mailer_sendmail_args = Wiedere Argumenten för Sendmail +config.mailer_sendmail_timeout = Sendmail-Tied-Överweggahn +config.test_email_placeholder = E-Mail (to’n Bispööl test@example.com) +config.send_test_mail = Test-E-Mail schicken +config.send_test_mail_submit = Schicken +config.test_mail_failed = Kunn keene Test-E-Mail an »%s« schicken: %v +config.test_mail_sent = Eene Test-E-Mail is an »%s« schickt worden. +config.oauth_config = OAuth-Inrichten +config.oauth_enabled = Anknipst +config.cache_config = Tüskenspieker-Inrichten +config.cache_adapter = Tüskenspieker-Anpasser +config.cache_interval = Tüskenspieker-Tiedofstand +config.cache_conn = Tüskenspieker-Verbinnen +config.cache_test = Tüskenspieker testen +config.cache_test_failed = Kunn de Tüskenspieker nich nakieken: %v. +config.cache_test_succeeded = Tüskenspieker-Test daankregen, hett eene Antwoord in %s kregen. +config.session_config = Sitzungs-Inrichten +config.mailer_use_dummy = Muster +config.cache_item_ttl = Tüskenspieker-Ding-TTL +config.session_provider = Sitzungs-Anbeder +config.provider_config = Anbeder-Inrichten +config.cookie_name = Kookje-Naam +config.gc_interval_time = GC-Tiedofstand +config.session_life_time = Sitzungs-Levenstied +config.https_only = Blots HTTPS +config.cookie_life_time = Kookje-Levenstied +config.picture_config = Bill- und Kontobill-Inrichten +config.picture_service = Billdeenst +config.disable_gravatar = Gravatar utknipsen +config.enable_federated_avatar = Verdeelte Kontobillers anknipsen +config.git_config = Git-Inrichten +config.git_disable_diff_highlight = Syntax-Vörheven im Unnerscheed utknipsen +config.git_max_diff_lines = Hoogste Unnerscheeds-Riegen pro Datei +config.git_max_diff_line_characters = Hoogste Unnerscheeds-Bookstavens pro Rieg +config.git_max_diff_files = Hoogste Tahl vun Unnerscheeds-Dateien wiest +config.git_gc_args = GC-Argumenten +config.git_migrate_timeout = Umtreck-Tied-Överweggahn +config.git_mirror_timeout = Spegel-Vernejens-Tied-Överweggahn +config.git_clone_timeout = Klonen-Tied-Överweggahn +config.git_pull_timeout = Haal-Tied-Överweggahn +config.git_gc_timeout = GC-Tied-Överweggahn +config.log_config = Utgaav-Inrichten +config.logger_name_fmt = Utgever: %s +config.disabled_logger = Utknipst +config.access_log_mode = Utgaav-Togrieps-Aard +config.access_log_template = Utgaav-Togrieps-Vörlaag +config.xorm_log_sql = SQL utgeven +monitor.stats = Statistiken +monitor.cron = Tiedplaan-Upgaven +monitor.name = Naam +monitor.schedule = Tiedplaan +monitor.next = Anner Maal +monitor.previous = Lestes Maal +monitor.process = Lopend Prozessen +monitor.stacktrace = Stapelspoor +monitor.processes_count = %d Prozessen +monitor.download_diagnosis_report = Faststellens-Bericht runnerladen +monitor.desc = Beschrieven +monitor.start = Begünn-Tied +monitor.execute_time = Looptied +monitor.last_execution_result = Resultaat +monitor.process.cancel = Prozess ofbreken +monitor.process.cancel_desc = Wenn een Prozess ofbroken word, könen Daten verloren gahn +monitor.process.cancel_notices = Ofbreken: %s? +monitor.process.children = Kinners +monitor.queues = Slangen +monitor.queue = Slang: %s +monitor.queue.name = Naam +monitor.queue.activeworkers = Aktiiv Rieters +monitor.queue.maxnumberworkers = Hoogste Tahl vun Rieters +monitor.queue.numberinqueue = Tahl in de Slang +monitor.queue.review_add = Rieters nakieken / hentofögen +monitor.queue.settings.title = Vörraad-Instellens +monitor.queue.settings.maxnumberworkers = Hoogste Tahl vun Rieters +monitor.queue.settings.maxnumberworkers.placeholder = Stedenwies %[1]d +monitor.queue.settings.maxnumberworkers.error = Hoogste Tahl vun Rieters mutt eene Tahl wesen +monitor.queue.settings.submit = Instellens vernejen +monitor.queue.settings.changed = Instellens verneeit +monitor.queue.settings.remove_all_items = All wegdoon +notices.system_notice_list = Systeem-Narichtens +notices.operations = Doon +notices.select_all = All utkören +notices.deselect_all = All nich utkören +notices.inverse_selection = Utkören umdreihen +notices.delete_selected = Utköört wegdoon +notices.delete_all = All Narichtens wegdoon +notices.type = Aard +notices.type_1 = Repositorium +notices.type_2 = Upgaav +notices.desc = Beschrieven +notices.op = Up. +monitor.queue.exemplar = Musteraard +notices.view_detail_header = Naricht-Informatioonen +self_check.no_problem_found = Noch keen Probleem funnen. +self_check.database_collation_mismatch = Verwacht, dat de Datenbank deese Kollatioon bruukt: %s +self_check.database_collation_case_insensitive = Datenbank bruukt eene Kollatioon %s, wat eene unklünige Kollatioon is. Forgejo kann twaar daarmit warken, aver dat kann rare Fallen geven, waar dat nich so warkt as verwacht. +self_check.database_fix_mysql = Brukers vun MySQL of MariaDB könen de Oorder »forgejo doctor convert« bruken, um de Kollatioons-Problemen oftohelpen, of du kannst dat Probleem ofhelpen, indeem du vun Hand de SQL-Oorders »ALTER … COLLATE …« bruukst. +self_check.database_inconsistent_collation_columns = Datenbank bruukt Kollatioon %s, aver deese Striepen bruken unpassend Kollatioonen. Dat kann unverwachte Problemen maken. +auths.sspi_auto_create_users_helper = Verlöövt de SSPI-Anmellens-Aard, automatisk een Konto för Brukers to maken, well sik tum eersten Maal anmellen +config.log_file_root_path = Utgaav-Padd +config.reset_password_code_lives = Ofloops-Düür vun de Torügghalens-Teken +config.allow_dots_in_usernames = Brukers verlöven, Punkten in hör Brukernamen to bruken. Ännert nix an bestahn Konten. +monitor.queue.numberworkers = Tahl vun Rieters +config.set_setting_failed = Instellen %s to setten fehlslagen +monitor.execute_times = Utföhrens +monitor.queue.settings.desc = Vörraden wassen as nödig, wenn hör Rieters-Slang blockeert. +auths.tip.openid_connect = Bruuk de Utförsken-URL för OpenID-Verbinnen (/.well-known/openid-configuration), um de Ennpunkten antogeven +auths.login_source_of_type_exist = Eenen Anmellens-Quell vun deeser Aard gifft dat al. +config.mailer_protocol = Protokoll +auths.tip.facebook = Vermark een nejes Programm up %s un föög dat Produkt »Facebook-Anmellen« hento +config.custom_conf = Inricht-Dateipadd +config.app_data_path = Programmdatenpadd +config.service_config = Deenst-Inrichten +config.enable_openid_signup = OpenID-Sülvst-Registreren anknipsen +config.cache_test_slow = Tüskenspieker-Test daankregen, aver de Antwoord is langsaam: %s. +monitor.queue.type = Aard +monitor.queue.settings.remove_all_items_done = All Dingen in de Slang sünd wegdaan worden. +auths.tip.mastodon = Giff eene eegene Instanz-URL för de Mastodon-Instanz, mit wat du anmellen willst, in (of bruuk de Normaalweert) +notices.delete_success = De Systeem-Narichtens sünd wegdaan worden. +auths.sspi_strip_domain_names = Domään-Namen vun Brukernamen lösken +auths.sspi_strip_domain_names_helper = Wenn dat anknipst is, worden Domään-Namen automatisk vun Anmell-Namen lösket (to’n Bispööl worden »DOMAIN\bruker« un »bruker@example.org« beide blots »bruker«). +auths.sspi_default_language_helper = Normaal-Spraak för Brukers, wat vun de SSPI-Anmellens-Aard automatisk maakt worden. Laat dat leeg, wenn du willst, dat de Spraak automatisk utköört word. +config.repo_root_path = Repositoriums-Ruut-Padd +config.allow_only_internal_registration = Registreren blots dör Forgejo sülvst verlöven +config.allow_only_external_registration = Registreren blots dör frömde Deensten verlöven +config.ssh_keygen_path = Slötelmakens-Padd (»ssh-keygen«) +config.open_with_editor_app_help = De »Mit … opmaken«-Bewarkers im Kloon-Menü. Wenn du dat leeg lettst, word de Normaalweert bruukt. Verwieder, um de Normaalweert antokieken. +auths.tip.yandex = Maak een nejes Programm up %s. Köör deese Verlöövnissen ut de Deel »Yandex.Passport API« ut: »Togriep up E-Mail-Adress«, »Togriep up Bruker-Kontobill« un »Togriep up Brukernaam, Vörnaam un Achternaam, Geschlecht« +monitor.duration = Düür (s) + +[action] +rename_repo = hett een Repositorium vun %[1]s na %[3]s umbenöömt +create_issue = `hett Gefall %[3]s #%[2]s opmaakt` +close_issue = `hett Gefall %[3]s #%[2]s dichtmaakt` +reopen_issue = `hett Gefall %[3]s #%[2]s weer opmaakt` +create_pull_request = `hett Haalvörslag %[3]s #%[2]s opmaakt` +reopen_pull_request = `hett Haalvörslag %[3]s #%[2]s weer opmaakt` +comment_issue = `hett up Gefall %[3]s #%[2]s kommenteert` +comment_pull = `hett up Haalvörslag %[3]s #%[2]s kommenteert` +auto_merge_pull_request = `hett Haalvörslag %[3]s #%[2]s automatisk tosamenföhrt` +transfer_repo = hett Repositorium %s na %s överdragen +delete_branch = hett Twieg %[2]s vun %[3]s lösket +compare_branch = Verglieken +compare_commits = %d Kommitterens verglieken +compare_commits_general = Kommitterens verglieken +mirror_sync_create = hett nejen Beteekner %[3]s na %[4]s spegelt +approve_pull_request = `hett %[3]s#%[2]s tostimmt` +reject_pull_request = `hett um Ännerns in %[3]s#%[2]s beden` +review_dismissed = `hett dat Nakieken vun %[4]s för %[3]s#%[2]s ofseggt` +review_dismissed_reason = Grund: +starred_repo = hett up %[2]s eenen Steern sett +merge_pull_request = `hett Haalvörslag %[3]s #%[2]s tosamenföhrt` +create_branch = hett Twieg %[3]s in %[4]s maakt +delete_tag = hett Mark %[2]s vun %[3]s lösket +push_tag = hett Mark %[3]s na %[4]s schuven +publish_release = `hett %[4]s in %[3]s publik maakt` +commit_repo = hett to %[3]s in %[4]s schuven +close_pull_request = `hett Haalvörslag %[3]s #%[2]s dichtmaakt` +create_repo = hett dat Repositorium %s maakt +mirror_sync_push = hett Kommitterens na %[3]s in %[4]s spegelt +mirror_sync_delete = hett Beteekner %[2]s in %[3]s spegelt un lösket +watched_repo = hett begunnen, %[2]s to beluren + +[tool] +future = in Tokunft +1s = 1 Sekünn +1m = 1 Menüüt +1d = 1 Dag +1w = 1 Week +1mon = 1 Maant +1y = 1 Jahr +seconds = %d Sekünnen +hours = %d Stünnen +days = %d Dagen +weeks = %d Weken +months = %d Maanten +years = %d Jahren +raw_seconds = Sekünnen +raw_minutes = Menüten +minutes = %d Menüten +now = nu +1h = 1 Stünn + +[munits.data] +b = B +kib = KiB +mib = MiB +gib = GiB +tib = TiB +pib = PiB +eib = EiB + +[dropzone] +default_message = Laat Dateien hier fallen of klick hier tum Upladen. +invalid_input_type = Du kannst deese Aard vun Dateien nich upladen. +file_too_big = Dateigrött ({{filesize}} MB) is boven de hoogste Dateigrött vun {{maxFilesize}} MB. +remove_file = Datei wegdoon + +[notification] +notifications = Narichtens +unread = Nich lesen +read = Lesen +no_unread = Keene nejen Narichtens. +no_read = Keene lesen Narichtens. +pin = Naricht faststeken +mark_as_read = As lesen markeren +mark_as_unread = As nich lesen markeren +mark_all_as_read = All as lesen markeren +subscriptions = Abonneerens +watching = Beluren +no_subscriptions = Nix abonneert + +[gpg] +default_key = Mit normaalem Slötel unnerschrieven +error.extract_sign = Kunn Unnerschrift nich uttrecken +error.generate_hash = Kunn Prüfsumm vum Kommitteren nich bereken +error.no_committer_account = Keen Konto mit de Kommitterer-E-Mail-Adress verbunnen +error.no_gpg_keys_found = Keen bekannter Slötel för deese Unnerschrift in de Datenbank funnen +error.not_signed_commit = Kommitteren is nich unnerschrieven +error.failed_retrieval_gpg_keys = Kunn keenen Slötel halen, wat mit de Konto vum Kommitterer verbunnen is +error.probable_bad_signature = WAHRSCHAU! Ofschoonst een Slötel mit deeser ID in de Datenbank is, wiest dat deeses Kommitteren nich ut! Deeses Kommitteren is VERDÄCHTIG. +error.probable_bad_default_signature = WAHRSCHAU! Ofschoonst de normaal-Slötel deese ID hett, wiest dat deeses Kommitteren nich ut! Deeses Kommitteren is VERDÄCHTIG. + +[install] +install = Installeren +title = Eerstinrichten +docker_helper = Wenn du Forgejo in Docker utföhrst, lees bidde de Dokumenteren, ehr du eets Instellens ännerst. +require_db_desc = Forgejo bruukt MySQL, PostgreSQL, SQLite3 of TiDB (MySQL-Protokoll). +db_title = Datenbank-Instellens +db_type = Datenbank-Aard +host = Host +user = Brukernaam +password = Passwoord +db_name = Datenbank-Naam +db_schema = Schema +db_schema_helper = Leeg laten, um de Normaalweert för de Datenbank to bruken (»public«). +path = Padd +reinstall_error = Du versöchst, in eene bestahn Forgejo-Datenbank to installeren +reinstall_confirm_check_2 = De Repositoriums un Instellens mutten villicht verneeit worden. Indeem du deese Kist utköörst, stimmst du to, dat du de Hakens för de Repositoriums un de authorized_keys-Datei vun Hand vernejen worst. Du wiest ut, dat du wiss maken worst, dat de Repositoriums- un Spegel-Instellens all recht sünd. +err_empty_db_path = De SQLite3-Datenbank-Padd kann nich leeg wesen. +no_admin_and_disable_registration = Du kannst Bruker-Sülvst-Registreren nich utknipsen, sünner eerst een Chef-Konto to maken. +err_empty_admin_password = Dat Chef-Passwoord kann nich leeg wesen. +err_empty_admin_email = De Chef-E-Mail-Adress kann nich leeg wesen. +err_admin_name_is_reserved = Chef-Brukernaam is ungültig, Brukernaam is vörbehollen +general_title = Allgemeene Instellens +app_name = Instanz-Titel +app_slogan = Instanz-Motto +repo_path = Repositoriums-Ruut-Padd +lfs_path = Git-LFS-Ruut-Padd +lfs_path_helper = Dateien, wat vun Git LFS verfolgt worden, worden in deesem Verteeknis sekert. Leeg laten, um dat uttoknipsen. +run_user = Bruker för ’t Utföhren +domain = Server-Domään +domain_helper = Domään of Hostadress för de Server. +ssh_port = SSH-Server-Poort +http_port = HTTP-Tohören-Poort +http_port_helper = Poort-Tahl, wat de Forgejo-Internett-Server bruken word. +ssh_port_helper = Poort-Tahl, wat de SSH-Server bruken word. Leeg laten, um de SSH-Server uttoknipsen. +log_root_path = Utgaav-Padd +log_root_path_helper = Utgaav-Dateien worden in deeses Verteeknis schreven. +email_title = E-Mail-Instellens +smtp_addr = SMTP-Host +smtp_port = SMTP-Poort +smtp_from = E-Mail schicken as +smtp_from_invalid = De »E-Mail schicken as«-Adress is ungültig +smtp_from_helper = E-Mail-Adress, wat Forgejo bruken word. Giff eene slichte E-Mail-Adress in of bruuk dat Formaat »"Naam" «. +mailer_user = SMTP-Brukernaam +mailer_password = SMTP-Passwoord +register_confirm = E-Mail-Utwiesen bi’m Registreren verlangen +mail_notify = E-Mail-Narichtens anknipsen +server_service_title = Instellens för de Server un Frömdanbeder-Deensten +offline_mode = Stedenwies-Modus anknipsen +disable_gravatar = Gravatar utknipsen +federated_avatar_lookup = Verdeelte Kontobillers anknipsen +federated_avatar_lookup.description = Kontobillers över Libravatar söken. +disable_registration = Sülvst-Registreren utknipsen +disable_registration.description = Blots Instanz-Chefs könen neje Brukerkonten maken. Dat word nödig anraden, dat Registreren uttoknipsen, wenn du nich vörhest, eene publike Instanz för alle Lüü to hosten un paraat büst, mit mennig Oolkert-Konten klaartoworden. +allow_only_external_registration = Registreren blots över frömde Deenste verlöven +allow_only_external_registration.description = Brukers könen neje Konten blots över inricht frömde Deensten maken. +openid_signin.description = Brukers verlöven, sik över OpenID antomellen. +openid_signup.description = Brukers verlöven, Konten över OpenID to maken, wenn Sülvst-Registreren anknipst is. +enable_captcha = CAPTCHA bi’m Registreren anknipsen +require_sign_in_view = Anmellen verlangen, um Instanz-Inholl to wiesen +default_keep_email_private = E-Mail-Adressen normaal verbargen +default_keep_email_private.description = Dat Verbargen vun de E-Mail-Adress för neje Brukers anknipsen, sodat deese Informatioon na de Registreren nich stracks dörsickert. +default_enable_timetracking = Tied-Erfaten normaal anknipsen +default_enable_timetracking.description = Nejen Repositoriums stracks verlöven, Tied-Erfatens to bruken. +admin_title = Chefkonto-Instellens +admin_setting.description = Du mutts nich vun Nood een Chefkonto inrichten. De eerste registreert Bruker word automatisk een Chef. +admin_name = Chef-Brukernaam +admin_password = Passwoord +confirm_password = Passwoord utwiesen +install_btn_confirm = Forgejo installeren +invalid_db_setting = De Datenbank-Instellens sünd ungültig: %v +invalid_db_table = De Datenbank-Tabell »%s« is ungültig: %v +invalid_repo_path = De Repositoriums-Ruut-Padd is ungültig: %v +invalid_app_data_path = De Programm-Daten-Padd is ungültig: %v +run_user_not_match = De »Bruker för ’t Utföhren«-Brukernaam is nich de stedenwies Brukernaam: %s → %s +internal_token_failed = Kunn binneres Teken nich maken: %v +secret_key_failed = Kunn geheemen Slötel nich maken: %v +err_admin_name_pattern_not_allowed = Chef-Brukernaam is ungültig, de Brukernaam passt up een vörbehollen Muster +run_user_helper = De Bedrievssysteem-Brukernaam, as wat Forgejo löppt. Wees wiss, dat deeser Bruker Togriep to de Repositoriums-Ruut-Padd hebben mutt. +optional_title = Nich nödige Instellens +openid_signin = OpenID-Anmellen anknipsen +openid_signup = OpenID-Sülvst-Registreren anknipsen +save_config_failed = Kunn Inrichten nich sekern: %v +enable_update_checker_helper_forgejo = Dat söcht alltied weer na nejen Forgejo-Versioonen, indeem een TXT-DNS-Upteken unner release.forgejo.org ankiekt word. +app_slogan_helper = Giff hier dat Motto för diene Instanz in. Leeg laten, um dat uttoknipsen. +ssl_mode = SSL +reinstall_confirm_message = Neei-installeren mit eener bestahn Forgejo-Datenbank kann mennig Problemen geven. Meesttiedens is dat beter, du bruukst diene bestahn »app.ini«, um Forgejo uttoföhren. Wenn du weetst, wat do doost, wies dat hier ut: +sqlite_helper = Dateipadd för de SQLite3-Datenbank.
      Giff eenen absoluuten Padd in, wenn du Forgejo as Deenst utföhrst. +reinstall_confirm_check_1 = De Daten, wat vun de SECRET_KEY in app.ini verslötelt sünd, könen verloren gahn: Brukes könen sik villicht nich mehr mit 2FA/OTP anmellen un Spegels sün villicht kaputt. Wenn du deese Kist utköörst, stimmst du to, dat de stedenwies app.ini de rechten SECRET_KEY enthollt. +repo_path_helper = Frömde Git-Repositoriums worden in deesem Verteeknis sekert. +offline_mode.description = Frömdanbeder-Inholls-Levern-Nettwarken utknipsen un all Objekten stedenwies levern. +require_sign_in_view.description = Blots anmellt Brukers verlöven Togriep to eets Inhollen verlöven. Gasten könen nix as de Anmell-Sieden sehn. +default_allow_create_organization = Normaal verlöven, Vereenigungen to maken +default_allow_create_organization.description = Nejen Brukers stracks verlöven, Vereenigungen to maken. Wenn deese Instellen utknipst is, mutt een Chef nejen Brukers eerst dat Recht geven, Vereenigungen to maken. +config_location_hint = Deese Inricht-Instellens worden sekert in: +reinstall_confirm_check_3 = Du wiest ut, dat du heel un dall wiss büst, dat Forgejo mit de rechten app.ini-Stee löppt un dat du wiss büst, dat du würrelk neei installeren muttst. Du wiest ut, dat du de Gefahren boven annimmst. +err_admin_name_is_invalid = Chef-Brukernaam is ungültig +app_name_helper = Giff hier dienen Instanz-Naam in. Dat word up elkeen Sied wiest. +disable_gravatar.description = Gravatar un anner Frömdanbeder-Kontobill-Quellen utknipsen. Dat Normaalbill word för Bruker-Kontobillers bruukt, wenn se nich hör eegen Kontobill to de Instanz upladen. +test_git_failed = Kunn »git«-Oorder nich testen: %v +sqlite3_not_available = Deese Forgejo-Versioon unnerstütt SQLite3 nich. Bidde laad de offizielle Binäärversioon vun %s runner (nich de »gobuild«-Versioon). +app_url = Grund-URL +app_url_helper = Grund-Adress för HTTP(S)-Kloon-URLs un E-Mail-Narichtens. +enable_captcha.description = Verlangen, dat Brukers een CAPTCHA ofsluten, um Konten to maken. +admin_email = E-Mail-Adress +allow_dots_in_usernames = Brukers verlöven, Punkten in hör Brukernamen to bruken. Ännert nix an bestahn Konten. +no_reply_address = Verburgen E-Mail-Domään +no_reply_address_helper = Domään-Naam för Brukers mit eener verburgen E-Mail-Adrees. To’n Bispööl word de Brukernaam »fiete« in Git as »fiete@noreply.example.org« vermarkt, wenn de verbargen E-Mail-Domään as »noreply.example.org« sett is. +invalid_admin_setting = Chefkonto-Instellen is ungültig: %v +invalid_log_root_path = De Utgaav-Padd is ungültig: %v +password_algorithm = Passwoord-Prüfsumm-Funktioon +enable_update_checker = Vernejens-Nakieker anknipsen +env_config_keys = Umgevens-Inrichten +env_config_keys_prompt = Deese Umgevens-Variaabeln worden ok up diene Instellens-Datei anwennt: +password_algorithm_helper = Sett de Passwoord-Prüfsumm-Funktioon. Funktioonen hebben verscheden Vörutsettens un Starkden. De argon2-Funktioon is bannig seker, aver se bruukt mennig Spieker un is för lütte Systeemen villicht nich gadelk. +invalid_password_algorithm = Ungültige Passwoord-Prüfsumm-Funktioon + +[units] +unit = Eenheid +error.no_unit_allowed_repo = Du hest nich dat Recht, to elkeen Deel vun deesem Repositorium totogriepen. +error.unit_not_allowed = Du hest nich dat Recht, up deese Deel vum Repositorium totogriepen. + +[packages] +title = Paketen +desc = Repositorium-Paketen verwalten. +empty = Dat gifft noch keene Paketen. +filter.type = Aard +filter.type.all = All +filter.container.tagged = Markt +filter.container.untagged = Nich markt +published_by = %[1]s vun %[3]s publizeert +installation = Installeren +about = Över deeses Paket +requirements = Bruukt +dependencies = Ofhangens +keywords = Slötelwoorden +details = Mehr Informatioonen +details.author = Autor +details.project_site = Projekt-Internett-Sied +details.repository_site = Repositoriums-Internett-Sied +details.documentation_site = Dokumenterens-Internett-Sied +details.license = Lizenz +assets = Objekten +versions = Versioonen +versions.view_all = All wiesen +dependency.id = ID +dependency.version = Versioon +alpine.registry.info = Köör $branch un $repository ut de List unnern ut. +alpine.repository = Repositoriums-Informatioon +alpine.repository.branches = Twiegen +alpine.repository.repositories = Repositoriums +arch.version.properties = Versioon-Eegenskuppen +arch.version.provides = Stellt paraat +arch.version.groups = Grupp +arch.version.depends = Hangt of vun +arch.version.optdepends = Hangt nich nödig of vun +arch.version.makedepends = Bau-Ofhangens +arch.version.checkdepends = Överprüfens-Ofhangens +arch.version.conflicts = Unverdragelkheiden +arch.version.replaces = Staht liek för +composer.dependencies = Ofhangens +composer.dependencies.development = Entwicklens-Ofhangens +conan.details.repository = Repositorium +container.labels = Vermarkens +container.labels.key = Slötel +container.labels.value = Weert +cran.install = Um dat Paket to installeren, föhr deese Oorder ut: +debian.install = Um dat Paket to installeren, föhr deese Oorder ut: +debian.repository = Repositoriums-Informatioon +debian.repository.distributions = Verdeelens +debian.repository.components = Delen +debian.repository.architectures = Architekturen +helm.install = Um dat Paket to installeren, föhr deese Oorder ut: +npm.dependencies.development = Entwicklens-Ofhangens +npm.dependencies.bundle = Mitbrocht Ofhangens +npm.dependencies.peer = Maten-Ofhangens +npm.dependencies.optional = Nich nödige Ofhangens +npm.details.tag = Mark +pypi.requires = Bruukt Python +rpm.repository = Repositoriums-Informatioon +rpm.repository.architectures = Architekturen +rubygems.dependencies.runtime = Looptied-Ofhangens +rubygems.dependencies.development = Entwicklens-Ofhangens +rubygems.required.ruby = Bruukt Ruby-Versioon +rubygems.required.rubygems = Bruukt RubyGem-Versioon +swift.install2 = un föhr deese Oorder ut: +settings.link.description = Wenn du een Paket mit eenem Repositorium verbinnst, word dat Paket in de Paketlist vum Repositorium wiest. +settings.link.select = Repositorium utkören +settings.link.error = Kunn de Repositoriums-Verwies nich vernejen. +settings.delete = Paket lösken +settings.delete.description = Een Paket to lösken is för all Tieden un kann nich torüggnohmen worden. +settings.delete.success = Dat Paket is lösket worden. +settings.delete.error = Kunn dat Paket nich lösken. +owner.settings.cargo.initialize = Index inrichten +owner.settings.cargo.initialize.error = Kunn Cargo-Index nich inrichten: %v +owner.settings.cargo.initialize.success = De Cargo-Index is inricht worden. +owner.settings.cargo.rebuild = Index neei bauen +owner.settings.cargo.rebuild.error = Kunn Cargo-Index nich neei bauen: %v +owner.settings.cargo.rebuild.success = De Cargo-Index is neei baut worden. +owner.settings.cleanuprules.title = Schoonmakens-Örders +owner.settings.cleanuprules.add = Schoonmakens-Örder hentofögen +owner.settings.cleanuprules.edit = Schoonmakens-Örder bewarken +owner.settings.cleanuprules.none = Dat gifft noch keene Schoonmakens-Örders. +owner.settings.cleanuprules.preview = Schoonmakens-Örder-Utkiek +owner.settings.cleanuprules.preview.none = Schoonmakens-Örder passt up keene Paketen. +owner.settings.cleanuprules.enabled = Anknipst +owner.settings.cleanuprules.pattern_full_match = Muster up de kumplete Paketnaam anwennen +owner.settings.cleanuprules.keep.count = De neeiste behollen +owner.settings.cleanuprules.keep.count.1 = 1 Versioon pro Paket +owner.settings.cleanuprules.keep.count.n = %d Versioonen pro Paket +owner.settings.cleanuprules.keep.pattern = Versioonen behollen, wat passen +owner.settings.cleanuprules.remove.title = Versioonen, wat up deese Örders passen, worden lösket, wenn dat keene Örder boven gifft, wat seggt, dat se behollt worden mutten. +owner.settings.cleanuprules.remove.days = Versioonen oller as dat lösken +owner.settings.cleanuprules.remove.pattern = Versioonen lösken, wat passen +owner.settings.cleanuprules.success.update = Schoonmakens-Örder is verneeit worden. +filter.no_result = Dien Filter gifft keene Resultaten. +alpine.repository.architectures = Architekturen +settings.link.button = Repositoriums-Verwies vernejen +alpine.install = Um dat Paket to installeren, föhr deese Oorder ut: +arch.version.description = Beschrieven +published_by_in = %[1]s vun %[3]s in %[5]s publizeert +settings.link.success = Repositoriums-Verwies is verneeit worden. +settings.delete.notice = Du willst %s (%s) lösken. Dat kann nich torüggnohmen worden, willst du dat würrelk? +owner.settings.cleanuprules.preview.overview = %d Paketen sünd tum Lösken vörmarkt. +owner.settings.cleanuprules.success.delete = Schoonmakens-Örder is wegdaan worden. +owner.settings.cargo.rebuild.no_index = Kann nich neei bauen, keen Index is inricht. +npm.dependencies = Ofhangens +rpm.install = Um dat Paket to installeren, föhr deese Oorder ut: +settings.link = Verbinn deeses Paket mit eenem Repositorium +owner.settings.cleanuprules.keep.title = Versioonen, wat up deese Örders passen, worden behollt, ok wenn se up eene Löskens-Örder unnern passen. +empty.documentation = För mehr Informatioonen över de Paketlist, kiek de Dokumenteren an. +empty.repo = Hest du een Paket upladen, aver dat word hier nich wiest? Gah to de Paket-Instellens un verbinn dat mit deesem Repo. +registry.documentation = För mehr Informatioonen över de %s-Paketlist, kiek de Dokumenteren an. +alpine.registry = Richt deese Paketlist in, indeem du de URL in diene /etc/apk/repositories-Datei inföögst: +alpine.registry.key = Laad de publiken RSA-Slötel vun de Paketlist in dat Verteeknis /etc/apk/keys/ runner, um de Index-Unnerschrift uttowiesen: +arch.pacman.helper.gpg = Föög dat Vertroens-Zertifikaat för Pacman hento: +arch.pacman.repo.multi = %s hett in mennig Verdeelens de sülve Versioon. +arch.pacman.repo.multi.item = Inrichten för %s +arch.pacman.conf = Föög de Server mit de verwandt Verdeelen un Architektuur to de /etc/pacman.conf hento: +arch.pacman.sync = Verneei dat Paket mit Pacman: +arch.version.backup = Sekerheids-Kopie +cargo.registry = Richt deese Paketlist in de Cargo-Instellens-Datei in (to’n Bispööl ~/.cargo/config.toml): +cargo.install = Um dat Paket mit Cargo to installeren, föhr deese Oorder ut: +chef.install = Um dat Paket to installeren, föhr deese Oorder ut: +chef.registry = Richt deese Paketlist in diener ~/.chef/config.rb-Datei in: +composer.registry = Richt deese Paketlist in diener ~/.composer/config.json-Datei in: +conan.registry = Richt deese Paketlist vun de Oorderreeg in: +conda.registry = Richt deese Paketlist as een Conda-Repositorium in diener ~/.condarc-Datei in: +composer.install = Um dat Paket mit Composer to installeren, föhr deese Oorder ut: +conda.install = Um dat Paket mit Conda to installeren, föhr deese Oorder ut: +container.details.type = Avbill-Aard +container.details.platform = Plattfoorm +container.pull = Haal deeses Avbill vun de Oorderreeg: +container.digest = Prüüfsumm +container.multi_arch = BS / Arch +container.layers = Avbill-Schichten +cran.registry = Richt deese Paketlist in diener Rprofile.site-Datei in: +debian.registry = Richt deese Paketlist vun de Oorderreeg in: +debian.registry.info = Köör $distribution un $component ut de unnern List ut. +generic.download = Laad deeses Paket vun de Oorderreeg runner: +go.install = Installeer dat Paket vun de Oorderreeg: +helm.registry = Richt deese Paketlist vun de Oorderreeg in: +maven.registry = Richt deese Paketlist in diener pom.xml-Datei in: +maven.install2 = Vun de Oorderreeg utföhren: +maven.download = Um de Ofhangen runnertoladen, föhr in de Oorderreeg ut: +nuget.registry = Richt deese Paketlist vun de Oorderreeg in: +nuget.install = Um dat Paket mit NuGet to installeren, föhr deese Oorder ut: +nuget.dependency.framework = Enn-Rahmwark +npm.registry = Richt deese Paketlist in de .npmrc-Datei vun dienem Projekt in: +maven.install = Um dat Paket to bruken, giff in de dependencies-Deel vun de pom.xml-Datei dat an: +npm.install = Um dat Paket mit npm to installeren, föhr deese Oorder ut: +npm.install2 = of föög dat to de »package.json«-Datei hento: +pub.install = Um dat Paket mit Dart to installeren, föhr deese Oorder ut: +pypi.install = Um dat Paket mit pip to installeren, föhr deese Oorder ut: +rpm.registry = Richt deese Paketlist vun de Oorderreeg in: +rpm.distros.redhat = Up Verdeelens mit RedHat as Grundlaag +rpm.distros.suse = Up Verdeelens mit SUSE as Grundlaag +rpm.repository.multiple_groups = Deeses Paket is in mennig Gruppen verföögbaar. +rubygems.install = Um dat Paket mit gem to installeren, föhr deese Oorder ut: +rubygems.install2 = of föög dat to de »Gemfile«-Datei hento: +swift.registry = Richt deese Paketlist vun de Oorderreeg in: +swift.install = Föög dat Paket in diener Package.swift-Datei hento: +vagrant.install = Um eene Vagrant-Kist hentotofögen, föhr deese Oorder ut: +owner.settings.cargo.title = Cargo-Paketlist-Index +owner.settings.cargo.initialize.description = Een besünners Index-Git-Repositorium is nödig, um de Cargo-Paketlist to bruken. Deese Instellen word dat Repositorium (neei) maken un automatisk inrichten. +owner.settings.cargo.rebuild.description = Neeibauen kann nüttelk wesen, wenn de Index nich to de lagert Cargo-Paketen passt. +owner.settings.cleanuprules.keep.pattern.container = De latest-Versioon word för Behälter-Paketen alltieden behollen. +owner.settings.chef.title = Chef-Paketlist +owner.settings.chef.keypair = Slötelpaar maken +owner.settings.chef.keypair.description = Een Slötelpaar is nödig, um sik bi de Chef-Paketlist antomellen. Wenn du al een Slötelpaar maakt hest, word dat olle Slötelpaar wegdaan, wenn du een nejes Slötelpaar maakst. +conan.install = Um dat Paket mit Conan to installeren, föhr deese Oorder ut: +container.images.title = Avbillers +search_in_external_registry = In %s söken +alt.setup = Föög een Repositorium to de List vun verbunnen Repositoriums hento (köör de nödige Architektuur in Stee vun »_arch_« ut): +alt.registry.install = Um dat Paket to installeren, föhr deese Oorder ut: +alt.repository.architectures = Architekturen +alt.repository.multiple_groups = Deeses Paket is in mennig Gruppen verföögbaar. +alt.registry = Richt deese Paketlist vun de Oorderreeg in: +alt.install = Paket installeren +alt.repository = Repositoriums-Informatioon + +[secrets] +secrets = Geheemsten +description = Geheemsten worden an wisse Aktioonen övergeven un könen anners nich lesen worden. +none = Dat gifft noch keene Geheemsten. +creation = Geheemst hentofögen +creation.success = Dat Geheemst »%s« is hentoföögt worden. +creation.failed = Kunn Geheemst nich hentofögen. +deletion = Geheemst wegdoon +deletion.success = Dat Geheemst is wegdaan worden. +deletion.failed = Kunn Geheemst nich wegdoon. +management = Geheemsten verwalten +creation.value_placeholder = Giff elkeen Inholl in. Leegtekens am Begünn un Enn worden ofsneden. +deletion.description = Een Geheemst wegtodoon is för all Tieden un kann nich torüggnohmen worden. Wiedermaken? +creation.name_placeholder = Blots alphanumerisk Bookstavens (’t word nich tüsken Groot- un Kleenbookstavens unnerscheden) un Unnerstrekens; kann nich mit GITEA_ of GITHUB_ begünnen + +[actions] +actions = Aktioonen +status.unknown = Unbekannt +status.waiting = Wacht +status.running = Löppt +status.success = Daankregen +status.failure = Fehlslagen +status.cancelled = Ofbroken +status.skipped = Översprungen +runners = Lopers +runners.runner_manage_panel = Lopers verwalten +runners.new = Nejen Loper maken +runners.new_notice = Wo man eenen Loper start +runners.status = Tostand +runners.id = ID +runners.name = Naam +runners.owner_type = Aard +runners.description = Beschrieven +runners.labels = Vermarkens +runners.runner_title = Loper +runners.task_list = Leste Upgaven up deesem Loper +runners.task_list.no_tasks = Dat gifft noch keene Upgaav. +runners.task_list.run = Utföhren +runners.task_list.status = Tostand +runners.task_list.repository = Repositorium +runners.task_list.commit = Kommitteren +runners.task_list.done_at = Daan um +runners.edit_runner = Loper bewarken +runners.update_runner_success = Loper verneeit +runners.update_runner_failed = Kunn Loper nich vernejen +runners.delete_runner = Deesen Loper wegdoon +runners.delete_runner_success = Loper wegdaan +runners.delete_runner_failed = Kunn Loper nich wegdoon +runners.delete_runner_header = Wies ut, dat du deesen Loper wegdoon willst +runners.none = Keene Lopers verföögbaar +runners.status.unspecified = Unbekannt +runners.status.idle = Nix to doon +runners.status.active = Aktiiv +runners.status.offline = Nich verbunnen +runners.version = Versioon +runners.reset_registration_token = Registrerens-Teken torüggsetten +runners.reset_registration_token_success = Loper-Registrerens-Teken torüggsett +runs.all_workflows = All Warkwiesen +runs.commit = Kommitteren +runs.scheduled = Na Tiedplaan +runs.pushed_by = schuven vun +runs.workflow = Warkwies +runs.invalid_workflow_helper = Warkwies-Instellens-Datei is ungültig. Bidde kiek diene Instellens-Datei na: %s +runs.no_matching_online_runner_helper = Keen verbunnen Loper, wat passt, mit de Vermark funnen: %s +runs.no_job = De Warkwies mutt tominnst eene Upgaav enthollen +runs.actor = Aktöör +runs.status = Tostand +runs.actors_no_select = All Aktören +runs.status_no_select = All Tostanden +runs.no_results = Keene Resultaten passen. +runs.no_workflows = Dat gifft noch keene Warkwiesens. +runs.no_runs = Deese Warkwies is noch nich utföhrt worden. +runs.empty_commit_message = (lege Kommitterens-Naricht) +runs.expire_log_message = Utgaav is wegdaan worden, denn se weer to oll. +workflow.enable = Warkwies anknipsen +workflow.enable_success = Warkwies »%s« is anknipst worden. +workflow.disabled = Warkwies is utknipst. +workflow.dispatch.trigger_found = Deese Warkwies hett eenen workflow_dispatch-Vörfall-Utlööser. +workflow.dispatch.use_from = Warkwies bruken vun +workflow.dispatch.run = Warkwies utföhren +workflow.dispatch.input_required = Weert för Ingaav »%s« nödig. +workflow.dispatch.invalid_input_type = Ungültige Ingaav-Aard »%s«. +workflow.dispatch.warn_input_limit = Blots de eersten %d Ingaven worden wiesen. +need_approval_desc = Warkwiesen vun eenem Haalvörslag ut eener Gabel mutten eerst tostimmt worden. +variables = Variaabeln +variables.management = Variaabeln verwalten +variables.none = Dat gifft noch keene Variaabeln. +variables.deletion = Variaabel wegdoon +variables.description = Variaabeln worden an wisse Aktioonen övergeven un könen anners nich lesen worden. +variables.id_not_exist = Variaabel mit ID %d gifft dat nich. +variables.edit = Variaabel bewarken +variables.deletion.failed = Kunn Variaabel nich wegdoon. +variables.deletion.success = De Variaabel is wegdaan worden. +variables.creation.failed = Kunn Variaabel nich hentofögen. +variables.creation.success = De Variaabel »%s« is hentoföögt worden. +variables.update.success = De Variaabel is bewarkt worden. +workflow.disable = Warkwies utknipsen +variables.creation = Variaabel hentofögen +variables.update.failed = Kunn Variaabel nich bewarken. +status.blocked = Blockeert +runners.delete_runner_notice = Wenn eene Upgaav up deesem Loper löppt, word se ofbroken un as fehlslagen markeert. Dat kann Bau-Warkwiesen stören. +runners.last_online = Tolest verbunnen +runners.update_runner = Ännerns vernejen +workflow.disable_success = Warkwies »%s« is utknipst worden. +runs.no_job_without_needs = De Warkwies mutt tominnst eene Upgaav sünner Ofhangen enthollen. +workflow.dispatch.success = Warkwies-Utföhren is vörmarkt worden. +variables.deletion.description = Eene Variaabel wegtodoon is för all Tieden un kann nich torüggnohmen worden. Wiedermaken? +unit.desc = Verwalt integreerte CI-/CD-Affolgens mit Forgejo-Aktioonen. +runs.no_workflows.quick_start = Weetst du nich, wo man mit Forgejo-Aktioonen begünnt? Kiek de fixe Inföhren an. +runs.no_workflows.documentation = För mehr Informatioonen över Forgejo-Aktioonen, kiek de Dokumenteren an. +runs.no_workflows.help_write_access = Weetst du nich, wo man mit Forgejo-Aktioonen begünnen sall? Kiek de Fixanwies in de Bruker-Dokumenteren an, um diene eerste Warkwies to schrieven, un richt dann dienen eersten Forgejo-Loper in, um diene Upgavens uttoföhren. +runs.no_workflows.help_no_write_access = Um mehr över Forgejo-Aktioonen to lehren, kiek de Dokumenteren an. +variables.not_found = Kunn de Variaabel nich finnen. + +[projects] +deleted.display_name = Lösket Projekt +type-1.display_name = Enkelt Projekt +type-2.display_name = Repositoriums-Projekt +type-3.display_name = Vereenigungs-Projekt + +[git.filemode] +changed_filemode = %[1]s → %[2]s +directory = Verteeknis +normal_file = Normaale Datei +executable_file = Utföhrbaare Datei +symbolic_link = Symbolisk Verwies +submodule = Unnermoduul + +[markup] +filepreview.lines = Riegen %[1]d bit %[2]d in %[3]s +filepreview.truncated = Utkiek is ofsneden worden +filepreview.line = Rieg %[1]d in %[2]s + +[translation_meta] +test = Moin! diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index baec116282..f68f738729 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -4,14 +4,14 @@ dashboard=Overzicht explore=Verkennen help=Help logo=Logo -sign_in=Inloggen +sign_in=Aanmelden sign_in_or=of sign_out=Uitloggen sign_up=Registreren link_account=Account Koppelen register=Registreren version=Versie -powered_by=Aangedreven door %s +powered_by=Mogelijk gemaakt door %s page=Pagina template=Sjabloon language=Taal @@ -28,24 +28,24 @@ username=Gebruikersnaam email=E-mailadres password=Wachtwoord access_token=Toegangstoken -re_type=Verifieer wachtwoord +re_type=Bevestig wachtwoord captcha=CAPTCHA twofa=Twee-factor authenticatie twofa_scratch=Twee-factor krascode -passcode=PIN +passcode=Code webauthn_insert_key=Voer uw beveiligingssleutel in -webauthn_sign_in=Druk op de knop van uw beveiligingssleutel. Als uw beveiligingssleutel geen knop heeft, voeg deze dan opnieuw in. +webauthn_sign_in=Druk op de knop van uw beveiligingssleutel. Als uw beveiligingssleutel geen knop heeft, voer deze dan opnieuw in. webauthn_press_button=Druk alstublieft op de knop van uw beveiligingssleutel… webauthn_use_twofa=Gebruik een twee-factor code van uw telefoon webauthn_error=Kon uw beveiligingssleutel niet lezen. webauthn_unsupported_browser=Uw browser ondersteunt momenteel geen WebAuthn. webauthn_error_unknown=Er is een onbekende fout opgetreden. Probeer het opnieuw. -webauthn_error_insecure=WebAuthn ondersteunt alleen beveiligde verbindingen. Om te testen via HTTP, kan je de oorsprong "localhost" of "127.0.0.1" gebruiken +webauthn_error_insecure=WebAuthn ondersteunt alleen beveiligde verbindingen. Om te testen via HTTP, kan je als systeemnaam "localhost" of "127.0.0.1" gebruiken webauthn_error_unable_to_process=De server kon uw verzoek niet verwerken. -webauthn_error_duplicated=De beveiligingssleutel is niet toegestaan voor dit verzoek. Zorg er alstublieft voor dat de sleutel niet al geregistreerd is. +webauthn_error_duplicated=De beveiligingssleutel is voor dit verzoek niet toegestaan. Controleer alstublieft of de sleutel niet al is geregistreerd. webauthn_error_empty=U moet een naam voor deze sleutel instellen. -webauthn_error_timeout=Time-out bereikt voordat uw sleutel kon worden gelezen. Laad deze pagina opnieuw en probeer het opnieuw. +webauthn_error_timeout=Time-out bereikt voordat uw sleutel kon worden gelezen. Herlaad deze pagina en probeer het opnieuw. webauthn_reload=Vernieuwen repository=Repository @@ -56,9 +56,9 @@ new_migrate=Nieuwe migratie new_mirror=Nieuwe mirror new_fork=Nieuwe repository fork new_org=Nieuwe organisatie -new_project=Nieuwe project +new_project=Nieuw project manage_org=Beheer organisaties -admin_panel=Website administratie +admin_panel=Site beheer account_settings=Accountinstellingen settings=Instellingen your_profile=Profiel @@ -66,12 +66,12 @@ your_starred=Favoriet your_settings=Instellingen all=Alles -sources=Bronnen +sources=Broncode mirrors=Mirrors -collaborative=Samenwerkend +collaborative=Samenwerkende forks=Forks -activities=Activiteiten +activities=Activiteit pull_requests=Pull requests issues=Issues milestones=Mijlpalen @@ -83,7 +83,7 @@ add=Toevoegen add_all=Alles toevoegen remove=Verwijder remove_all=Alles verwijderen -edit=Bewerk +edit=Wijzig enabled=Ingeschakeld disabled=Uitgeschakeld @@ -99,7 +99,7 @@ preview=Voorbeeld loading=Laden… error=Fout -error404=De pagina die u probeert te bereiken bestaat niet of u bent niet gemachtigd om het te bekijken. +error404=De pagina die u probeert te bereiken bestaat niet, is verwijderd of u bent niet bevoegd om deze te bekijken. never=Nooit @@ -115,8 +115,8 @@ concept_user_organization=Organisatie name=Naam -sign_in_with_provider = Log in met %s -tracked_time_summary = Overzicht van geregistreerde tijd op basis van filters van probleemlijst +sign_in_with_provider = Aanmelden met %s +tracked_time_summary = Overzicht van geregistreerde tijd op basis van filters van issuelijst enable_javascript = Deze website vereist JavaScript. retry = Probeer opnieuw rerun_all = Alle taken opnieuw uitvoeren @@ -140,9 +140,9 @@ confirm_delete_selected = Bevestigen om alle geselecteerde items te verwijderen? copy_type_unsupported = Dit bestandstype kan niet worden gekopieerd pin = Vastpinnen unpin = Ontpinnen -remove_label_str = Verwijder punt "%s" +remove_label_str = Verwijder item "%s" confirm_delete_artifact = Weet u zeker dat u het artefact "%s" wilt verwijderen? -toggle_menu = Menu schakelen +toggle_menu = Menu aan/uit filter.clear = Filter wissen filter.is_archived = Gearchiveerd filter.is_fork = Forks @@ -159,13 +159,14 @@ more_items = Meer items invalid_data = Ongeldige data: %v copy_generic = Kopieer naar klembord test = Test -error413 = U heeft al uw quotum opgebruikt. +error413 = U heeft uw hele quotum gebruikt. new_migrate.title = Nieuwe migratie new_org.title = Nieuwe organisatie new_repo.link = Nieuwe repository new_repo.title = Nieuwe repository new_migrate.link = Nieuwe migratie new_org.link = Nieuwe organisatie +copy_path = Kopieer bestandspad [aria] navbar = Navigatiebalk @@ -199,6 +200,16 @@ buttons.list.task.tooltip = Een lijst met taken toevoegen buttons.disable_monospace_font = Lettertype monospace uitschakelen buttons.indent.tooltip = Items één niveau lager plaatsen buttons.unindent.tooltip = Items één niveau hoger plaatsen +buttons.new_table.tooltip = Tabel toevoegen +table_modal.header = Tabel toevoegen +table_modal.placeholder.header = Kop +table_modal.placeholder.content = Inhoud +table_modal.label.rows = Rijen +table_modal.label.columns = Kolommen +link_modal.header = Link toevoegen +link_modal.url = Url +link_modal.description = Beschrijving +link_modal.paste_reminder = Tip: Als u een URL op uw klembord heeft, kun u deze direct in de editor plakken om een koppeling te maken. [filter] string.asc = A - Z @@ -227,7 +238,7 @@ install_desc = Draai gewoon documentatie voordat je een instelling aanpast. +docker_helper=Als je Forgejo draait in Docker, Lees eerst de documentatie voordat je een instelling aanpast. require_db_desc=Forgejo vereist MySQL, PostgreSQL, SQLite3 of TiDB (MySQL protocol). db_title=Database-instellingen db_type=Database-type @@ -250,7 +261,7 @@ no_admin_and_disable_registration=U kunt zelf-registratie van de gebruiker niet err_empty_admin_password=Het administrator-wachtwoord mag niet leeg zijn. err_empty_admin_email=Het e-mailadres van Het beheerder mag niet leeg zijn. err_admin_name_is_reserved=Gebruikersnaam van beheerder is ongeldig, gebruikersnaam is gereserveerd -err_admin_name_pattern_not_allowed=Gebruikersnaam van beheerder is ongeldig, de gebruikersnaam is gereserveerd +err_admin_name_pattern_not_allowed=Gebruikersnaam van beheerder is ongeldig, de gebruikersnaam komt overeen met een gereserveerd patroon err_admin_name_is_invalid=Gebruikersnaam van beheerder is ongeldig general_title=Algemene instellingen @@ -269,7 +280,7 @@ http_port=HTTP luisterpoort http_port_helper=Poortnummer dat zal worden gebruikt door de Forgejo webserver. app_url=Basis URL app_url_helper=Basisadres voor HTTP(S) kloon URL's en e-mailmeldingen. -log_root_path=Log-pad +log_root_path=Logboek-pad log_root_path_helper=Logboekbestanden worden geschreven naar deze map. optional_title=Optionele instellingen @@ -476,6 +487,8 @@ hint_register = Heb je een account nodig? Registreer nu. sign_up_button = Registreer nu. back_to_sign_in = Terug naar aanmelden sign_in_openid = Ga verder met OpenID +unauthorized_credentials = Je inloggegevens zijn foutief of vervallen. Probeer opnieuw of zie %s voor meer informatie +use_onetime_code = Gebruik een eenmalige code [mail] view_it_on=Bekijk het op %s @@ -546,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. @@ -658,7 +671,7 @@ unable_verify_ssh_key = Kan de SSH-sleutel niet verifiëren, controleer deze voo still_own_repo = Uw account is eigenaar van één of meer repositories, verwijder of draag deze eerst over. admin_cannot_delete_self = U kan uzelf niet verwijderen als u een beheerder bent. Verwijder eerst uw beheerdersrechten. username_error_no_dots = ` kan alleen alfanumerieke karakters ("0-9","a-z","A-Z"), streepje ("-") en liggend streepje ("_") bevatten. Niet-alfanumerieke karakters aan het begin of eind zijn verboden en aaneenvolgende niet alfanumerieke karakters zijn ook verboden.` -invalid_group_team_map_error = ` mapping is ongeldig: %s" +invalid_group_team_map_error = ` mapping is ongeldig: %s` org_still_own_repo = Deze organisatie is eigenaar van één of meer repositories, verwijder of draag deze eerst over. org_still_own_packages = Deze organisatie is eigenaar van één of meer pakketten, verwijder deze eerst. unset_password = De inloggebruiker heeft het wachtwoord niet ingesteld. @@ -672,6 +685,8 @@ To = Branch naam Website = Website AccessToken = Toegangstoken Pronouns = Voornaamwoorden +username_claiming_cooldown = De gebruikersnaam kan niet opgeëist worden, omdat de afkoelperiode nog niet voorbij is. Hij kan worden opgeëist op %[1]s. +email_domain_is_not_allowed = Het domein van het e-mailadres van de gebruiker %s is in strijd met EMAIL_DOMAIN_ALLOWLIST of EMAIL_DOMAIN_BLOCKLIST. Controleer of u het e-mailadres correct hebt ingesteld. [user] @@ -715,6 +730,7 @@ public_activity.visibility_hint.self_public = Uw activiteiten zijn zichtbaar voo public_activity.visibility_hint.admin_public = Deze activiteit is zichtbaar voor iedereen, maar als beheerder kun je ook interacties in privéruimtes zien. public_activity.visibility_hint.self_private = Uw activiteiten zijn alleen zichtbaar voor jou en de beheerders van de instantie. Configureer. public_activity.visibility_hint.admin_private = Deze activiteit is zichtbaar voor u omdat u een beheerder bent, maar de gebruiker wil dat het privé blijft. +public_activity.visibility_hint.self_private_profile = Uw activiteit is alleen zichtbaar voor u en de beheerders van de instantie omdat uw profiel privé is. Aanpassen. [settings] @@ -783,14 +799,14 @@ update_password=Wachtwoord bijwerken old_password=Huidige wachtwoord new_password=Nieuw wachtwoord password_incorrect=Het wachtwoord is niet correct. -change_password_success=Je wachtwoord is bijgewerkt. Log vanaf nu in met je nieuwe wachtwoord. +change_password_success=Uw wachtwoord is bijgewerkt. Log vanaf nu in met uw nieuwe wachtwoord. password_change_disabled=Niet-lokale gebruikers kunnen hun wachtwoord niet in de webinterface van Forgejo wijzigen. emails=E-mailadressen manage_emails=E-mailadressen beheren manage_themes=Standaardthema manage_openid=OpenID-adressen -theme_desc=Dit zal het standaardthema worden op de gehele site. +theme_desc=Dit thema wordt gebruikt voor de webinterface wanneer je bent aangemeld. primary=Primair activated=Geactiveerd requires_activation=Vereist activering @@ -976,8 +992,8 @@ visibility.limited=Beperkt visibility.private=Privé blocked_users = Geblokkeerde gebruikers uid = UID -biography_placeholder = Vertel ons iets over uzelf! (U kunt van Markdown gebruik maken) -profile_desc = Controleer hoe uw profiel aan andere gebruikers wordt getoond. Uw primaire e-mailadres zal worden gebruikt voor notificaties, wachtwoord herstel en web-gebaseerde Git-operaties. +biography_placeholder = Vertel anderen een beetje over uzelf! (Markdown is ondersteund) +profile_desc = Over u update_language_not_found = Taal "%s" is niet beschikbaar. change_username_prompt = Opmerking: Het veranderen van uw gebruikersnaam zal ook de URL van uw account veranderen. change_username_redirect_prompt = De oude gebruikersnaam zal worden doorverwezen totdat iemand deze opeist. @@ -1010,7 +1026,7 @@ at_least_one_permission = Je moet minstens één machtiging kiezen om een token permission_write = Lees en schrijf oauth2_client_secret_hint = Dit geheim zal niet meer worden getoond nadat u deze pagina heeft verlaten of vernieuwd. Zorg ervoor dat u het heeft opgeslagen. revoke_oauth2_grant_success = Toegang succesvol ingetrokken. -keep_email_private_popup = Dit zal je e-mailadres verbergen van uw profielpagina. Het zal niet langer de standaard zijn voor commits die via de webinterface gemaakt worden, zoals bestandsuploads en bewerkingen, en het zal niet gebruikt worden voor samenvoeg commits. In plaats daarvan kan een speciaal adres %s gebruikt worden om commits met je account te associëren. Merk op dat het veranderen van deze optie geen effect heeft op bestaande commits. +keep_email_private_popup = Uw e-mailadres zal niet getoond worden op uw profiel en zal niet de standaard zijn voor commits die via de webinterface gemaakt worden, zoals bestandsuploads, bewerkingen en samenvoeg commits. In plaats daarvan kan een speciaal adres %s gebruikt worden om commits aan uw account te koppelen. Deze optie zal bestaande commits niet beïnvloeden. create_oauth2_application_success = U heeft met succes een OAuth2 applicatie gecreëerd. permissions_access_all = Alle (publiek, privé en gelimiteerd) oauth2_application_remove_description = Door een OAuth2-applicatie te verwijderen, krijgt deze geen toegang meer tot geautoriseerde gebruikersaccounts op deze instantie. Doorgaan? @@ -1021,12 +1037,12 @@ webauthn_key_loss_warning = Als u uw beveiligingssleutels verliest, zal u toegan repos_none = U bezit geen repositories. hooks.desc = Voeg webhooks toe die door alle repositories waarvan u eigenaar bent aangeroept kunnen worden. visibility.public_tooltip = Zichtbaar voor iedereen -visibility.limited_tooltip = Alleen zichtbaar voor geauthenticeerde gebruikers +visibility.limited_tooltip = Alleen zichtbaar voor ingelogde gebruikers visibility.private_tooltip = Alleen zichtbaar voor leden van organisaties waarbij u bent aangesloten user_unblock_success = De gebruiker is succesvol gedeblokkeerd. user_block_success = De gebruiker is succesvol geblokkeerd. blocked_since = Geblokkeerd sinds %s -access_token_desc = Geselecteerde token machtigingen beperken autorisatie alleen tot de bijbehorende API routes. Lees de documentatie voor meer informatie. +access_token_desc = Geselecteerde token machtigingen beperken autorisatie alleen tot de bijbehorende API routes. Lees de documentatie voor meer informatie. oauth2_confidential_client = Vertrouwelijke client. Selecteer deze optie voor apps die het geheim bewaren, zoals webapps. Niet selecteren voor native apps, waaronder desktop- en mobiele apps. authorized_oauth2_applications_description = Je hebt deze applicaties van derden toegang verleend tot je persoonlijke Forgejo-account. Trek de toegang in voor applicaties die niet langer in gebruik zijn. hidden_comment_types.ref_tooltip = Reacties waarbij naar deze issue werd verwezen vanuit een ander issue/commit/… @@ -1038,7 +1054,7 @@ additional_repo_units_hint = Stel voor om extra repositorie units in te schakele update_hints = Tips bijwerken update_hints_success = Tips zijn bijgewerkt. hints = Tips -additional_repo_units_hint_description = Toon een "Voeg meer eenheden toe..." knop voor repositories die niet alle beschikbare eenheden hebben ingeschakeld. +additional_repo_units_hint_description = Toon een “Meer activeren†hint voor repositories die niet alle beschikbare eenheden hebben ingeschakeld. pronouns = Persoonlijke voornaamwoord pronouns_custom = Aangepast pronouns_unspecified = Ongedefinieerd @@ -1046,6 +1062,36 @@ language.title = Standaard taal keep_activity_private.description = Uw publieke activiteit zal alleen zichtbaar zijn voor u en de beheerders van de instantie. language.description = Deze taal wordt opgeslagen in uw account en wordt als standaardtaal gebruikt nadat u zich heeft aangemeld. language.localization_project = Help ons Forgejo in uw taal te vertalen! Leer meer. +user_block_yourself = U kunt niet zichzelf blokkeren. +pronouns_custom_label = Aangepaste voornaamwoorden +change_username_redirect_prompt.with_cooldown.few = De oude gebruikersnaam zal voor iedereen beschikbaar zijn na een afkoelperiode van %[1]d dagen. U kunt de oude gebruikersnaam nog steeds opeisen tijdens de afkoelperiode. +change_username_redirect_prompt.with_cooldown.one = De oude gebruikersnaam zal voor iedereen beschikbaar zijn na een afkoelperiode van %[1]d dag. U kunt de oude gebruikersnaam nog steeds opeisen tijdens de afkoelperiode. +keep_pronouns_private = Toon voornaamwoorden alleen aan geauthenticeerde gebruikers +keep_pronouns_private.description = Dit verbergt uw voornaamwoorden voor bezoekers die niet zijn ingelogd. +quota.rule.exceeded.helper = De totale grootte van objecten voor deze regel heeft de quota overschreden. +quota.sizes.repos.private = Privé repositories +storage_overview = Opslagoverzicht +quota = Quotum +quota.applies_to_user = De volgende quotaregels zijn van toepassing op uw account +quota.applies_to_org = De volgende quotaregels zijn van toepassing op deze organisatie +quota.rule.exceeded = Overschreden +quota.rule.no_limit = Onbeperkt +quota.sizes.all = Alle +quota.sizes.repos.all = Repositories +quota.sizes.repos.public = Openbare repositories +quota.sizes.git.all = Git inhoud +quota.sizes.git.lfs = Git LFS +quota.sizes.assets.all = Bezittingen +quota.sizes.assets.attachments.all = Bijlagen +quota.sizes.assets.attachments.issues = Issue bijlagen +quota.sizes.assets.attachments.releases = Release bijlagen +quota.sizes.assets.artifacts = Artefacten +quota.sizes.assets.packages.all = Pakketten +quota.sizes.wiki = Wiki +access_token_regeneration = Toegangstoken opnieuw genereren +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? [repo] owner=Eigenaar @@ -1083,11 +1129,11 @@ issue_labels=Labels issue_labels_helper=Selecteer een labelset license=Licentie license_helper=Selecteer een licentie bestand -license_helper_desc=Een licentie bepaalt wat anderen wel en niet met je code kunnen doen. Niet zeker welke juist is voor jouw project? Zie Kies een licentie. +license_helper_desc=Een licentie bepaalt wat anderen wel en niet met je code kunnen doen. Niet zeker welke juist is voor jouw project? Zie Kies een licentie. readme=README readme_helper=Selecteer een README-bestandssjabloon readme_helper_desc=Dit is de plek waar je een volledige beschrijving van je project kunt schrijven. -auto_init=Initialiseer repository (voegt .gitignore, License en README toe) +auto_init=Initialiseer repository trust_model_helper=Selecteer het vertrouwensmodel voor handtekeningverificatie. Mogelijke opties zijn: trust_model_helper_collaborator=Samenwerker: Vertrouw handtekeningen door samenwerker trust_model_helper_committer=Committer: Vertrouw handtekeningen die overeenkomen met de committers @@ -1117,7 +1163,7 @@ forks=Forks reactions_more=en %d meer unit_disabled=De sitebeheerder heeft deze repositorie sectie uitgeschakeld. language_other=Andere -adopt_search=Voer gebruikersnaam in om te zoeken naar niet-geadopteerde repositories... (laat leeg om alles te vinden) +adopt_search=Voer gebruikersnaam in om te zoeken naar niet-geadopteerde repositories… (laat leeg om alles te vinden) adopt_preexisting_label=Bestanden adopteren adopt_preexisting=Bestaamde bestanden adopteren adopt_preexisting_content=Maak een repository van %s @@ -1151,8 +1197,8 @@ template.issue_labels=Issue labels template.one_item=Moet ten minste één sjabloon selecteren template.invalid=Moet een sjabloon repository selecteren -archive.issue.nocomment=Deze repo is gearchiveerd. U kunt niet reageren op problemen. -archive.pull.nocomment=Deze repo is gearchiveerd. U kunt niet reageren op pull requests. +archive.issue.nocomment=Deze repository is gearchiveerd. U kunt niet reageren op problemen. +archive.pull.nocomment=Deze repository is gearchiveerd. U kunt niet reageren op pull requests. form.reach_limit_of_creation_1=U heeft al uw limiet van %d repository bereikt. form.reach_limit_of_creation_n=U heeft al uw limiet van %d repositories bereikt. @@ -1186,13 +1232,13 @@ migrate.migrate_items_options=Toegangstoken is vereist om extra items te migrere migrated_from=Gemigreerd van %[2]s migrated_from_fake=Gemigreerd van %[1]s migrate.migrate=Migreer van %s -migrate.migrating=Migreren van %s... +migrate.migrating=Migreren van %s… migrate.migrating_failed=Migreren van %s is mislukt. migrate.migrating_failed_no_addr=Migratie is mislukt. migrate.github.description=Migreer gegevens van github.com of GitHub Enterprise server. migrate.git.description=Migreer een repositorie van elke Git service. migrate.gitlab.description=Gegevens migreren van gitlab.com of andere GitLab-instanties. -migrate.gitea.description=Gegevens overzetten van gitea.com of andere Gitea/Forgejo instanties. +migrate.gitea.description=Gegevens overzetten van gitea.com of andere Gitea instanties. migrate.gogs.description=Gegevens overzetten van notabug.org of andere Gogs instanties. migrate.onedev.description=Gegevens overzetten van code.onedev.io of andere OneDev instanties. migrate.codebase.description=Gegevens migreren van codebasehq.com. @@ -1239,7 +1285,7 @@ tags=Labels issues=Issues pulls=Pull requests project_board=Projecten -packages=Paketten +packages=Pakketten labels=Labels org_labels_desc=Organisatielabel dat gebruikt kan worden met alle repositories onder deze organisatie org_labels_desc_manage=beheren @@ -1270,6 +1316,7 @@ view_git_blame=Bekijk git blame video_not_supported_in_browser=Uw browser ondersteunt de HTML5 "video" element niet. audio_not_supported_in_browser=Uw browser ondersteunt de HTML5 "audio" element niet. stored_lfs=Opgeslagen met Git LFS +stored_annex=Opgeslagen met Git Annex symbolic_link=Symbolische link commit_graph=Commit grafiek commit_graph.select=Selecteer branches @@ -1288,6 +1335,7 @@ editor.upload_file=Upload bestand editor.edit_file=Bewerk bestand editor.preview_changes=Voorbeeld tonen editor.cannot_edit_lfs_files=LFS-bestanden kunnen niet worden bewerkt in de webinterface. +editor.cannot_edit_annex_files=Annex-bestanden kunnen niet worden bewerkt in de webinterface. editor.cannot_edit_non_text_files=Binaire bestanden kunnen niet worden bewerkt in de webinterface. editor.edit_this_file=Bewerk bestand editor.this_file_locked=Bestand is vergrendeld @@ -1301,20 +1349,21 @@ editor.or=of editor.cancel_lower=Annuleer editor.commit_signed_changes=Commit ondertekende wijzigingen editor.commit_changes=Wijzigingen doorvoeren -editor.add_tmpl="" toevoegen +editor.add_tmpl="<%s>" toevoegen +editor.add_tmpl.filename = bestandsnaam editor.patch=Patch toepassen editor.patching=Patchen: editor.new_patch=Nieuwe patch editor.commit_message_desc=Voeg een optionele uitgebreide omschrijving toe… editor.signoff_desc=Voeg een Signed-off-by toe aan het einde van het commit logbericht. -editor.commit_directly_to_this_branch=Commit direct naar de branch '%s'. +editor.commit_directly_to_this_branch=Commit direct naar de branch %[1]s. editor.create_new_branch=Maak een nieuwe branch voor deze commit en start van een pull request. editor.create_new_branch_np=Maak een nieuwe branch voor deze commit. editor.propose_file_change=Stel bestandswijziging voor editor.new_branch_name_desc=Nieuwe branch naam… editor.cancel=Annuleer editor.filename_cannot_be_empty=Bestandsnaam mag niet leeg zijn. -editor.file_changed_while_editing=De bestandsinhoud is veranderd sinds je bent begonnen met bewerken. Klik hier om ze te zien, of commit de veranderingen opnieuw om ze te overschrijven. +editor.file_changed_while_editing=De inhoud van het bestand is gewijzigd sinds u het bestand hebt geopend. Klik hier om ze te zien, of commit de veranderingen opnieuw om ze te overschrijven. editor.commit_empty_file_header=Commit een leeg bestand editor.commit_empty_file_text=Het bestand dat u wilt committen is leeg. Doorgaan? editor.no_changes_to_show=Er zijn geen wijzigingen om weer te geven. @@ -1356,7 +1405,7 @@ commit.cherry-pick-content=Selecteer een branch om te cherry-pick op: commitstatus.error=Fout commitstatus.pending=In behandeling -ext_issues=Toegang tot externe issues +ext_issues=Externe issues ext_issues.desc=Koppelen aan een externe kwestie-tracker. projects=Projecten @@ -1503,9 +1552,9 @@ issues.context.quote_reply=Citeer antwoord issues.context.reference_issue=Verwijs in een nieuwe issue issues.context.edit=Bewerken issues.context.delete=Verwijder -issues.close_comment_issue=Reageer en sluit +issues.close_comment_issue=Sluit met commentaar issues.reopen_issue=Heropen -issues.reopen_comment_issue=Reageer en heropen +issues.reopen_comment_issue=Heropen met commentaar issues.create_comment=Reageer issues.closed_at=`heeft dit probleem gesloten %[2]s` issues.reopened_at=`heropende dit probleem %[2]s` @@ -1597,7 +1646,7 @@ issues.error_modifying_due_date=Deadline aanpassen mislukt. issues.error_removing_due_date=Deadline verwijderen mislukt. issues.push_commit_1=toegevoegd %d commit %s issues.push_commits_n=toegevoegd %d commits %s -issues.force_push_codes=`force-push %[1]s van %[2]s naar %[4]s %[6]s` +issues.force_push_codes=`force-push %[1]s van %[2]s naar %[4]s %[6]s` issues.force_push_compare=Vergelijk issues.due_date_form=jjjj-mm-dd issues.due_date_form_add=Vervaldatum toevoegen @@ -1646,9 +1695,9 @@ issues.review.left_comment=heeft een reactie achtergelaten issues.review.content.empty=Je moet een reactie achterlaten die de gewenste verandering(en) beschrijft. issues.review.reject=aangevraagde wijzigingen %s issues.review.wait=is gevraagd voor review %s -issues.review.add_review_request=heeft een review aangevraagd van %s %s -issues.review.remove_review_request=beoordelingsaanvraag voor %s %s verwijderd -issues.review.remove_review_request_self=beoordeling geweigerd %s +issues.review.add_review_request=beoordeling gevraagd van %[1]s %[2]s +issues.review.remove_review_request=beoordelingsaanvraag voor %[1]s %[2]s verwijderd +issues.review.remove_review_request_self=weigerde te beoordelen %s issues.review.pending=In behandeling issues.review.review=Review issues.review.reviewers=Beoordelaars @@ -1694,7 +1743,7 @@ pulls.nothing_to_compare=Deze branches zijn gelijk. Er is geen pull request nodi pulls.nothing_to_compare_and_allow_empty_pr=Deze branches zijn gelijk. Deze pull verzoek zal leeg zijn. pulls.has_pull_request=`Een pull-verzoek tussen deze branches bestaat al: %[2]s#%[3]d` pulls.create=Pull request aanmaken -pulls.title_desc_few=wilt %[1]d commits van %[2]s samenvoegen met %[3]s +pulls.title_desc_few=wilt %[1]d commits van %[2]s samenvoegen met %[3]s pulls.merged_title_desc_few=heeft %[1]d commits samengevoegd van %[2]s naar %[3]s %[4]s pulls.change_target_branch_at='doelbranch aangepast van %s naar %s %s' pulls.tab_conversation=Discussie @@ -1811,7 +1860,7 @@ milestones.filter_sort.most_issues=Meeste problemen milestones.filter_sort.least_issues=Minste problemen -ext_wiki=Toegang tot externe wiki +ext_wiki=Externe wiki ext_wiki.desc=Koppelen aan een externe wiki. wiki=Wiki @@ -1902,8 +1951,7 @@ activity.git_stats_and_deletions=en activity.git_stats_deletion_1=%d verwijdering activity.git_stats_deletion_n=%d verwijderingen -contributors.contribution_type.commits=Commits - +contributors.contribution_type.commits = Commits search=Zoek search.search_repo=Zoek repository search.fuzzy=Vergelijkbaar @@ -2048,29 +2096,29 @@ settings.event_repository_desc=Repository gemaakt of verwijderd. settings.event_header_issue=Issue gebeurtenissen settings.event_issues=Issues settings.event_issues_desc=Issue geopend, gesloten, heropend of bewerkt. -settings.event_issue_assign=issue toegekend +settings.event_issue_assign=Toewijzing settings.event_issue_assign_desc=Issue toegewezen of niet-toegewezen. -settings.event_issue_label=Issue gelabeld -settings.event_issue_label_desc=Issue-labels bijgewerkt of verwijderd. -settings.event_issue_milestone=Issue gemilestoned -settings.event_issue_milestone_desc=Issue gemilestoned of gedemilestoned. -settings.event_issue_comment=Issue reactie +settings.event_issue_label=Labels +settings.event_issue_label_desc=Issue labels toegevoegd of verwijderd. +settings.event_issue_milestone=Mijlpalen +settings.event_issue_milestone_desc=Mijlpaal toegevoegd, verwijderd of gewijzigd. +settings.event_issue_comment=Opmerkingen settings.event_issue_comment_desc=Issue reactie aangemaakt, bewerkt of verwijderd. settings.event_header_pull_request=Pull request gebeurtenissen -settings.event_pull_request=Pull request +settings.event_pull_request=Wijziging settings.event_pull_request_desc=Pull request geopend, gesloten, heropend of bewerkt. -settings.event_pull_request_assign=Pull request toegewezen +settings.event_pull_request_assign=Toewijzing settings.event_pull_request_assign_desc=Pull request toegewezen of niet-toegewezen. -settings.event_pull_request_label=Pull request gelabeld -settings.event_pull_request_label_desc=Pull request labels bijgewerkt of gewist. -settings.event_pull_request_milestone=Pull Request gemilestoned -settings.event_pull_request_milestone_desc=Pull Reguest gemilestoned of gedemilestoned. -settings.event_pull_request_comment=Pull request reactie +settings.event_pull_request_label=Labels +settings.event_pull_request_label_desc=Pull request labels toegevoegd of verwijderd. +settings.event_pull_request_milestone=Mijlpalen +settings.event_pull_request_milestone_desc=Mijlpaal toegevoegd, verwijderd of gewijzigd. +settings.event_pull_request_comment=Opmerkingen settings.event_pull_request_comment_desc=Pull request commentaar gemaakt, bewerkt of verwijderd. -settings.event_pull_request_review=Pull request gereviewed -settings.event_pull_request_review_desc=Pull request goedgekeurd, afgewezen of review commentaar. -settings.event_pull_request_sync=Pull request gesynchroniseerd -settings.event_pull_request_sync_desc=Pull request gesynchroniseerd. +settings.event_pull_request_review=Beoordelingen +settings.event_pull_request_review_desc=Pull request goedgekeurd, afgewezen of opmerkingen over beoordeling toegevoegd. +settings.event_pull_request_sync=Gesynchroniseerd +settings.event_pull_request_sync_desc=Branch automatisch bijgewerkt met doel branch. settings.branch_filter=Branch filter settings.active=Actief settings.active_helper=Informatie over geactiveerde gebeurtenissen wordt naar deze webhook URL gestuurd. @@ -2184,8 +2232,8 @@ settings.archive.header=Archiveer deze repo settings.archive.success=De repo is succesvol gearchiveerd. settings.archive.error=Er is een fout opgetreden tijdens het archiveren van de repo. Zie het logboek voor meer informatie. settings.archive.error_ismirror=U kunt geen gespiegelde repository archiveren. -settings.archive.branchsettings_unavailable=Branch instellingen zijn niet beschikbaar als de repo is gearchiveerd. -settings.archive.tagsettings_unavailable=Labelinstellingen zijn niet beschikbaar als de repo is gearchiveerd. +settings.archive.branchsettings_unavailable=Branchinstellingen zijn niet beschikbaar in gearchiveerde repo's. +settings.archive.tagsettings_unavailable=Tag-instellingen zijn niet beschikbaar in gearchiveerde repo's. settings.update_avatar_success=De repository avatar is bijgewerkt. settings.lfs=LFS settings.lfs_filelist=LFS bestanden opgeslagen in deze repository @@ -2201,7 +2249,7 @@ settings.lfs_invalid_locking_path=Ongeldig pad: %s settings.lfs_invalid_lock_directory=Kan map %s niet vergrendelen settings.lfs_lock_already_exists=Vergrendeling bestaat al: %s settings.lfs_lock=Vergrendel -settings.lfs_lock_path=Bestandspad om te vergrendelen... +settings.lfs_lock_path=Bestandspad om te vergrendelen… settings.lfs_locks_no_locks=Geen locks settings.lfs_lock_file_no_exist=Vergrendeld bestand bestaat niet in de standaard branch settings.lfs_force_unlock=Forceer ontgrendelen @@ -2280,7 +2328,7 @@ release.draft=Concept release.prerelease=Voorlopige release release.stable=Stabiel release.compare=Vergelijk -release.edit=bewerken +release.edit=Bewerken release.ahead.commits=%d commits release.ahead.target=aan %s sinds deze release release.source_code=Broncode @@ -2379,8 +2427,8 @@ find_file.no_matching = Geen overeenkomstige bestanden gevonden error.csv.too_large = Kan dit bestand niet renderen omdat het te groot is. error.csv.unexpected = Kan dit bestand niet renderen omdat het een onverwacht karakter bevat in regel %d en kolom %d. error.csv.invalid_field_count = Kan dit bestand niet renderen omdat het een verkeerd aantal velden heeft in regel %d. -issues.comment.blocked_by_user = U kunt geen reactie op deze issue plaatsen omdat u geblokkeerd bent door de eigenaar van de repository of door de persoon die de issue heeft gepost. -issues.blocked_by_user = U kunt geen issue op deze repository maken omdat u geblokkeerd bent door de eigenaar van de repository. +issues.comment.blocked_by_user = U kunt niet reageren op deze issue omdat u geblokkeerd bent door de eigenaar van de repository of de poster van de issue. +issues.blocked_by_user = U kunt geen issues aanmaken in deze repository omdat u geblokkeerd bent door de eigenaar van deze repository. issues.label_archived_filter = Gearchiveerde labels bekijken issues.label_archive_tooltip = Gearchiveerde labels zijn standaard uitgezonderd van de suggesties als men op een label zoekt. issues.max_pinned = U kunt geen issues meer vastpinnen @@ -2398,7 +2446,7 @@ issues.review.option.hide_outdated_comments = Verouderde reacties verbergen pulls.expand_files = Alle bestanden uitklappen pulls.collapse_files = Alle bestanden inklappen pulls.show_all_commits = Alle commits weergeven -new_repo_helper = Een repository bevat alle projectbestanden, inclusief revisiegeschiedenis. Host je er al ergens anders een? Repository migreren. +new_repo_helper = Een repository bevat alle projectbestanden, inclusief revisiegeschiedenis. Host je er al ergens anders een? Repository migreren. editor.fail_to_update_file = Mislukt bij het bijwerken/creëren van bestand "%s". editor.file_is_a_symlink = `"%s" is een symbolische link. Symbolische links kunnen niet worden bewerkt in de webeditor` editor.filename_is_a_directory = Bestandsnaam "%s" wordt al gebruikt als naam van een map in deze repository. @@ -2468,8 +2516,8 @@ tree_path_not_found_tag = Pad %[1]s bestaat niet in tag %[2]s transfer.no_permission_to_reject = Je hebt geen rechten om deze overdracht af te wijzen. settings.transfer_owner = Nieuwe eigenaar mirror_address_protocol_invalid = De opgegeven URL is ongeldig. Alleen http(s):// of git:// locaties kunnen gebruikt worden voor spiegelen. -archive.title = Deze repo is gearchiveerd. Je kunt bestanden bekijken en klonen, maar geen issues of pull requests pushen of openen. -archive.title_date = Deze repository is gearchiveerd op %s. Je kunt bestanden bekijken en klonen, maar je kunt niet pushen of issues of pull requests openen. +archive.title = Deze repository is gearchiveerd. U kunt bestanden bekijken en klonen, maar u kunt geen wijzigingen aanbrengen aan de status, zoals het pushen en aanmaken van nieuwe issues, pull requests of opmerkingen. +archive.title_date = Deze repository is gearchiveerd op %s. U kunt bestanden bekijken en klonen, maar u kunt geen wijzigingen aanbrengen aan de status, zoals het pushen en aanmaken van nieuwe issues, pull requests of opmerkingen. migrate_options_lfs_endpoint.placeholder = Als dit leeg gelaten wordt, zal het eindpunt afgeleid worden van de kloon URL invisible_runes_description = `Dit bestand bevat onzichtbare Unicode-tekens die voor mensen niet te onderscheiden zijn, maar door een computer anders verwerkt kunnen worden. Als je denkt dat dit opzettelijk is, kun je deze waarschuwing gerust negeren. Gebruik de Escape knop om ze te onthullen.` ambiguous_runes_header = `Dit bestand bevat dubbelzinnige Unicode-tekens` @@ -2600,7 +2648,7 @@ settings.remove_protected_branch_success = Branchbescherming voor regel "%s" is settings.remove_protected_branch_failed = Verwijderen van branchbeschermings regel "%s" is mislukt. settings.merge_style_desc = Samenvoegstijl settings.thread_id = Thread ID -settings.archive.mirrors_unavailable = Mirrors zijn niet beschikbaar als de repo is gearchiveerd. +settings.archive.mirrors_unavailable = Mirrors zijn niet beschikbaar in gearchiveerde repo's. settings.unarchive.header = Deze repo uit het archief halen settings.unarchive.text = Het uit het archief halen van de repo zal het vermogen herstellen om commits en pushes te ontvangen, evenals nieuwe issues en pull requests. settings.unarchive.error = Er is een fout opgetreden bij het uit het archief halen van de repo. Bekijk de logs voor meer details. @@ -2679,7 +2727,7 @@ settings.pulls.default_allow_edits_from_maintainers = Standaard bewerkingen van settings.trust_model.collaboratorcommitter.desc = Geldige handtekeningen van samenwerkers van dit archief zullen "vertrouwd" gemarkeerd worden als ze overeenkomen met de committer. Anders zullen geldige handtekeningen gemarkeerd worden als "niet vertrouwd" als de handtekening overeenkomt met de committer en "niet gematcht" anders. Dit zal Forgejo dwingen om gemarkeerd te worden als de committer op ondertekende commits met de werkelijke committer gemarkeerd als Co-Authored-By: en Co-Committed-By: aanhanger in de commit. De standaard Forgejo sleutel moet overeenkomen met een gebruiker in de database. settings.branch_filter_desc = Branch whitelist for push, branch creation and branch deletion events, specified as glob pattern. Indien leeg of *, worden gebeurtenissen voor alle takken gerapporteerd. Zie %[2]s documentatie voor syntax. Voorbeelden: master, {master,release*}. contributors.contribution_type.filter_label = Soort bijdrage: -settings.event_pull_request_review_request = Pull request beoordeling aangevraagd +settings.event_pull_request_review_request = Beoordelingsverzoeken pulls.recently_pushed_new_branches = Je hebt op branch gepusht %[1]s %[2]s settings.protect_enable_merge_desc = Iedereen met schrijftoegang mogen pull requests samenvoegen in deze branch. settings.add_web_hook_desc = Integreer %s in uw repository. @@ -2692,14 +2740,13 @@ settings.wiki_rename_branch_main_notices_2 = Dit zal de interne branch van %s's settings.trust_model.collaborator.desc = Geldige handtekeningen van samenwerkers van deze repository worden als "vertrouwd" gemarkeerd - (of ze nu overeenkomen met de committer of niet). Anders worden geldige handtekeningen gemarkeerd als "niet-vertrouwd" als de handtekening overeenkomt met de committer en "niet-gematcht" als dat niet het geval is. settings.trust_model.committer.desc = Geldige handtekeningen zullen alleen "vertrouwd" gemarkeerd worden als ze overeenkomen met de committer, anders zullen ze gemarkeerd worden als "ongeëvenaard". Dit dwingt Forgejo om de committer te zijn op ondertekende commits met de werkelijke committer gemarkeerd als Co-authored-by: en Co-committed-by: aanhanger in de commit. De standaard Forgejo sleutel moet overeenkomen met een gebruiker in de database. settings.pulls.enable_autodetect_manual_merge = Handmatig samenvoegen met autodetectie inschakelen (Opmerking: In sommige speciale gevallen kunnen hierdoor verkeerde beoordelingen optreden) -settings.protect_protected_file_patterns_desc = Beschermde bestanden mogen niet direct gewijzigd worden, zelfs als de gebruiker rechten heeft om bestanden in deze branch toe te voegen, te bewerken of te verwijderen. Meerdere patronen kunnen gescheiden worden met een puntkomma (";"). Zie github.com/gobwas/glob documentatie voor patroon syntax. Voorbeelden: .drone.yml, /docs/**/*.txt. +settings.protect_protected_file_patterns_desc = Beschermde bestanden mogen niet direct gewijzigd worden, zelfs als de gebruiker rechten heeft om bestanden in deze branch toe te voegen, te bewerken of te verwijderen. Meerdere patronen kunnen gescheiden worden met een puntkomma (";"). Zie %s documentatie voor patroon syntax. Voorbeelden: .drone.yml, /docs/**/*.txt. wiki.delete_page_notice_1 = Het verwijderen van de wikipagina "%s" kan niet ongedaan worden gemaakt. Doorgaan? wiki.reserved_page = De wikipaginanaam "%s" is gereserveerd. activity.navbar.pulse = Puls wiki.original_git_entry_tooltip = Bekijk het originele Git bestand in plaats van een vriendelijke link te gebruiken. activity.navbar.contributors = Samenwerkers contributors.contribution_type.additions = Toevoegingen -contributors.contribution_type.commits = Commits contributors.contribution_type.deletions = Verwijderingen settings.mirror_settings.docs.doc_link_pull_section = het gedeelte "Pullen uit een externe repository" in de documentatie. settings.mirror_settings.docs.doc_link_title = Hoe kan ik repositories spiegelen? @@ -2707,13 +2754,13 @@ settings.mirror_settings.docs.pull_mirror_instructions = Raadpleeg voor het inst settings.mirror_settings.docs.more_information_if_disabled = Hier vindt u meer informatie over duw- en pull mirrors: settings.mirror_settings.docs.pulling_remote_title = Pullen uit een externe repository settings.mirror_settings.pushed_repository = Gepusht repository -settings.units.units = Repository-eenheden +settings.units.units = Eenheden settings.mirror_settings.push_mirror.remote_url = Git externe repository URL settings.units.overview = Overzicht settings.mirror_settings.push_mirror.edit_sync_time = Synchronisatie-interval van mirror bewerken settings.push_mirror_sync_in_progress = Wijzigingen worden momenteel naar de externe %s gepusht. settings.pull_mirror_sync_in_progress = Haalt momenteel wijzigingen op van de externe %s. -settings.units.add_more = Meer toevoegen... +settings.units.add_more = Meer activeren settings.update_mirror_settings = Mirrorinstellingen bijwerken settings.branches.switch_default_branch = Wissel standaard branch settings.branches.add_new_rule = Voeg nieuwe regel toe @@ -2743,7 +2790,7 @@ activity.navbar.code_frequency = Code frequentie activity.navbar.recent_commits = Recente commits file_follow = Volg symlink error.broken_git_hook = it hooks van deze repository lijken kapot te zijn. Volg alsjeblieft de documentatie om ze te repareren, push daarna wat commits om de status te vernieuwen. -pulls.title_desc_one = wilt %[1]d commit van %[2]s samenvoegen in %[3]s +pulls.title_desc_one = wilt %[1]d commit van %[2]s samenvoegen in %[3]s open_with_editor = Open met %s commits.search_branch = Deze branch pulls.merged_title_desc_one = heeft %[1]d commit van %[2]s samengevoegd in %[3]s %[4]s @@ -2821,17 +2868,65 @@ mirror_public_key = Publieke SSH-sleutel mirror_use_ssh.helper = Forgejo zal deze repository mirroren via Git over SSH en een sleutelpaar voor je aanmaken als je deze optie selecteert. Je moet ervoor zorgen dat de gegenereerde publieke sleutel geautoriseerd is om naar het doel-repository te pushen. Je kunt geen wachtwoord-gebaseerde autorisatie gebruiken als je dit selecteert. settings.mirror_settings.push_mirror.none_ssh = Geen mirror_use_ssh.not_available = SSH-authenticatie is niet beschikbaar. +issues.new.assign_to_me = Aan mij toewijzen +issues.all_title = Alles +settings.discord_icon_url.exceeds_max_length = Icoon-URL moet 2048 tekens of minder zijn +issues.review.add_review_requests = beoordelingen gevraagd van %[1]s %[2]s +issues.review.remove_review_requests = verwijderde beoordelingsverzoeken voor %[1]s %[2]s +issues.review.add_remove_review_requests = vraagde beoordelingen van %[1]s en verwijderde beoordelingsverzoeken voor %[2]s %[3]s +pulls.delete_after_merge.head_branch.is_default = De hoofdbranch die u wilt verwijderen is de standaard branch en kan niet verwijderd worden. +pulls.delete_after_merge.head_branch.is_protected = De hoofdbranch die u wilt verwijderen is een beschermde branch en kan niet verwijderd worden. +pulls.delete_after_merge.head_branch.insufficient_branch = Je hebt geen toestemming om de hoofdbranch te verwijderen. +issues.filter_sort.relevance = Relevantie +diff.git-notes.add = Notitie toevoegen +diff.git-notes.remove-header = Notitie verwijderen +diff.git-notes.remove-body = Deze notitie zal worden verwijderd. +issues.summary_card_alt = Overzichtskaart van een issue met de titel "%s" in repository %s +issues.num_reviews_one = %d beoordeling +issues.num_reviews_few = %d beoordelingen +settings.default_update_style_desc = Standaard update stijl gebruikt voor het updaten van pull requests die achter de basis branch liggen. +pulls.sign_in_require = Aanmelden om een nieuwe pull request aan te maken. +new_advanced = Geavanceerde instellingen +new_advanced_expand = Klik om uit te breiden +new_from_template_description = Je kunt een bestaand repositorysjabloon op deze instantie selecteren en de instellingen toepassen. +new_from_template = Een sjabloon gebruiken +auto_init_description = De Git geschiedenis starten met een README en optioneel License en .gitignore bestanden toevoegen. +issues.reaction.add = Reactie toevoegen +issues.reaction.alt_few = %[1]s reageerde %[2]s. +issues.reaction.alt_add = Voeg %[1]s reactie toe aan commentaar. +issues.context.menu = Commentaar menu +summary_card_alt = Overzichtskaart van repository %s +release.summary_card_alt = Samenvattende kaart van een release met de titel "%s" in repository %s +issues.reaction.alt_remove = Verwijder %[1]s reactie van bericht. +issues.reaction.alt_many = %[1]s en %[2]d meer gereageerd %[3]s. +editor.commit_email = Commit e-mail +archive.pull.noreview = Deze repository is gearchiveerd. U kunt geen pull requests beoordelen. +commits.view_single_diff = Bekijk de veranderingen aan dit bestand die in deze commit zijn geïntroduceerd +pulls.editable_explanation = Deze pull request staat bewerkingen toe van beheerders. Je kunt er direct aan bijdragen. +pulls.editable = Bewerkbaar +issues.reopen.blocked_by_user = U kunt deze issue niet heropenen omdat u geblokkeerd bent door de eigenaar van de repository of de poster van de issue. +pulls.comment.blocked_by_user = U kunt niet reageren op deze pull request omdat u geblokkeerd bent door de eigenaar van de repository of de poster van de issue. +issues.filter_no_results_placeholder = Probeer uw zoekfilters aan te passen. +issues.filter_no_results = Geen resultaten [graphs] +component_loading_info = Dit kan even duren… +component_failed_to_load = Er is een onverwachte fout opgetreden. +contributors.what = bijdragen +component_loading_failed = %s kon niet worden geladen +component_loading = Bezig met laden van %s… +code_frequency.what = code frequentie +recent_commits.what = recente commits + [org] org_name_holder=Organisatienaam org_full_name_holder=Volledige naam organisatie org_name_helper=Organisatienamen horen kort en memorabel zijn. create_org=Nieuwe organisatie aanmaken -repo_updated=Geupdate %s +repo_updated=Geüpdatet %s members=Leden teams=Teams lower_members=leden @@ -2890,7 +2985,7 @@ members.invite_desc=Voeg nieuw lid toe aan %s: members.invite_now=Nu uitnodigen teams.join=Lid worden -teams.leave=Vertlaat +teams.leave=Verlaat teams.can_create_org_repo=Maak repositories teams.can_create_org_repo_helper=Leden kunnen nieuwe repositories aanmaken in de organisatie. De maker krijgt beheerder toegang tot de nieuwe repository. teams.read_access=Gelezen @@ -2947,10 +3042,12 @@ teams.invite.description = Klik op onderstaande knop om u bij het team aan te sl teams.invite.by = Uitgenodigd door %s teams.all_repositories_admin_permission_desc = Dit team verleent Administrator permissies tot alle repositories: leden kunnen lezen, pushen naar en samenwerkers toevoegen aan repositories. settings.change_orgname_prompt = Merk op: Het wijzigen van de organisatienaam zal ook de URL van uw organisatie veranderen en de oude naam vrijgeven. -settings.visibility.limited = Beperkt (alleen zichtbaar voor geauthenticeerde gebruikers) +settings.visibility.limited = Beperkt (alleen zichtbaar voor ingelogde gebruikers) teams.add_nonexistent_repo = De repository die u probeert toe te voegen bestaat niet, maak deze eerst aan alstublieft. teams.all_repositories_write_permission_desc = Dit team verleent Schrijf permissies tot alle repositories: leden kunnen lezen en pushen naar repositories. open_dashboard = Open dashboard +settings.change_orgname_redirect_prompt.with_cooldown.one = De oude organisatienaam zal voor iedereen beschikbaar zijn na een afkoelperiode van %[1]d dag. U kunt de oude naam nog steeds opeisen tijdens de afkoelperiode. +settings.change_orgname_redirect_prompt.with_cooldown.few = De oude organisatienaam zal voor iedereen beschikbaar zijn na een afkoelperiode van %[1]d dagen. U kunt de oude naam nog steeds opeisen tijdens de afkoelperiode. [admin] dashboard=Overzicht @@ -3033,7 +3130,7 @@ dashboard.gc_times=GC verwerkingen dashboard.delete_old_system_notices=Verwijder alle oude systeemmededelingen uit de database users.user_manage_panel=Gebruikersaccounts beheren -users.new_account=Nieuw account aanmaken +users.new_account=Gebruikersaccount aanmaken users.name=Gebruikersnaam users.full_name=Volledige naam users.activated=Geactiveerd @@ -3183,7 +3280,7 @@ auths.tip.github=Registreer een nieuwe OAuth toepassing op %s auths.tip.gitlab=Registreer een nieuwe applicatie op https://gitlab.com/profile/applicaties auths.tip.google_plus=Verkrijg OAuth2 client referenties van de Google API console op %s auths.tip.openid_connect=Gebruik de OpenID Connect Discovery URL (/.well-known/openid-configuration) om de eindpunten op te geven -auths.tip.yandex=`Maak een nieuwe applicatie aan op %s. Selecteer de volgende machtigingen van de "Yandex". assport API sectie: "Toegang tot e-mailadres", "Toegang tot avatar" en "Toegang tot gebruikersnaam, voornaam en achternaam, geslacht"` +auths.tip.yandex=Maak een nieuwe toepassing op %s. Selecteer de volgende rechten in het gedeelte “Yandex.Passport APIâ€: “Toegang tot e-mailadresâ€, ‘Toegang tot gebruikersavatar’ en ‘Toegang tot gebruikersnaam, voor- en achternaam, geslacht’ auths.edit=Authenticatiebron bewerken auths.activated=Deze authenticatiebron is geactiveerd auths.update_success=De authenticatie-bron is bijgewerkt. @@ -3404,10 +3501,10 @@ auths.oauth2_required_claim_value_helper = Stel deze waarde in om het aanmelden users.remote = Externe users.list_status_filter.not_2fa_enabled = 2FA uitgeschakeld users.reserved = Gereserveerd -defaulthooks.desc = Webhooks doen automatisch HTTP POST verzoeken naar een server wanneer bepaalde Forgejo gebeurtenissen zich voordoen. Webhooks die hier gedefinieerd zijn, zijn standaard en worden gekopieerd naar alle nieuwe repositories.. Lees meer in de webhooks gids. +defaulthooks.desc = Webhooks doen automatisch HTTP POST verzoeken naar een server wanneer bepaalde Forgejo gebeurtenissen zich voordoen. Webhooks defined here are defaults and will be copied into all new repositories. Read more in the webhooks guide. auths.verify_group_membership = Controleer het groepslidmaatschap in LDAP (laat het filter leeg om over te slaan) dashboard.rebuild_issue_indexer = Herbouw issue indexer -systemhooks.desc = Webhooks doen automatisch HTTP POST verzoeken naar een server wanneer bepaalde Forgejo gebeurtenissen zich voordoen. Webhooks die hier gedefinieerd zijn, werken op alle repositories op het systeem, dus houd rekening met mogelijke gevolgen voor de prestaties. Lees meer in de webhooks gids. +systemhooks.desc = Webhooks doen automatisch HTTP POST verzoeken naar een server wanneer bepaalde Forgejo gebeurtenissen zich voordoen. Webhooks die hier gedefinieerd zijn, werken op alle repositories op het systeem, dus houd rekening met mogelijke gevolgen voor de prestaties. Lees meer in de webhooks guide. hooks = Webhooks integrations = Integraties dashboard.new_version_hint = Forgejo %s is nu beschikbaar, u gebruikt versie %s. Zie de blog voor meer details. @@ -3444,7 +3541,7 @@ self_check.database_inconsistent_collation_columns = Database gebruikt collatie monitor.stacktrace = Stacktrace monitor.download_diagnosis_report = Diagnoserapport downloaden self_check.database_collation_case_insensitive = Database gebruikt collatie %s, wat een ongevoelige collatie is. Hoewel Forgejo ermee kan werken, kunnen er enkele zeldzame gevallen zijn die niet werken zoals verwacht. -self_check.database_fix_mysql = Voor MySQL/MariaDB gebruikers zou je het "gitea doctor convert" commando kunnen gebruiken om de collatieproblemen op te lossen, of je zou het probleem ook kunnen oplossen door "ALTER ... COLLATE ..." SQL's handmatig op te lossen. +self_check.database_fix_mysql = Voor MySQL/MariaDB gebruikers zou je het "forgejo doctor convert" commando kunnen gebruiken om de collatieproblemen op te lossen, of je zou het probleem ook kunnen oplossen door "ALTER ... COLLATE ..." SQL's handmatig op te lossen. dashboard.gc_lfs = LFS meta-objecten afval opruimen auths.map_group_to_team = Breng LDAP-groepen in kaart voor organisatieteams (laat het veld leeg om over te slaan) auths.oauth2_required_claim_name = Verplichte claimnaam @@ -3455,7 +3552,7 @@ auths.oauth2_icon_url = Pictogram URL auths.pam_email_domain = PAM e-maildomein (optioneel) auths.tip.gitea = Registreer een nieuwe OAuth2-toepassing. De handleiding is te vinden op %s auths.tip.discord = Registreer een nieuwe toepassing op %s -auths.tip.bitbucket = Registreer een nieuwe OAuth consumer op %s +auths.tip.bitbucket = Registreer een nieuwe OAuth consumer op %s en voeg de rechten “Account†- “Read†toe auths.tips.oauth2.general.tip = Bij het registreren van een nieuwe OAuth2-authenticatie moet de callback/redirect URL zijn: config.ssh_domain = SSH-server domein auths.login_source_of_type_exist = Er bestaat al een authenticatiebron van dit type. @@ -3508,6 +3605,7 @@ emails.delete_desc = Weet u zeker dat u deze e-mailadres wilt verwijderen? emails.delete_primary_email_error = U kunt de primaire e-mail niet verwijderen. emails.delete = E-mail verwijderen emails.deletion_success = Het e-mailadres is verwijderd. +monitor.duration = Duur (s) [action] @@ -3633,16 +3731,16 @@ cargo.install = Voer de volgende opdracht uit om het pakket met Cargo te install chef.install = Voer het volgende commando uit om het pakket te installeren: composer.registry = Stel dit register in je ~/.composer/config.json bestand: composer.dependencies = Afhankelijkheden -composer.dependencies.development = Ontwikkelings Afhankelijkheden +composer.dependencies.development = Ontwikkelings afhankelijkheden conan.registry = Stel dit register in vanaf de terminal: conan.install = Voer het volgende commando uit om het pakket met Conan te installeren: conda.registry = Stel dit register in als een Conda repository in je .condarc bestand: -container.details.type = Afbeelding Type +container.details.type = Afbeelding type container.details.platform = Platform container.pull = Haal de afbeelding op vanaf de terminal: -container.digest = Digest: +container.digest = Digest container.multi_arch = Besturingssysteem / Arch -container.layers = Afbeelding Lagen +container.layers = Afbeelding lagen container.labels = Labels container.labels.key = Sleutel debian.repository = Repository informatie @@ -3664,7 +3762,7 @@ rpm.repository.architectures = Architecturen rpm.repository.multiple_groups = Dit pakket is beschikbaar in meerdere groepen. rubygems.install = Voer het volgende commando uit om het pakket met gem te installeren: rubygems.install2 = of voeg het toe aan het Gemfile: -rubygems.dependencies.development = Ontwikkelings Dependencies +rubygems.dependencies.development = Ontwikkelings dependencies swift.registry = Stel dit register in vanaf de terminal: swift.install = Voeg het pakket toe in je Package.swift bestand: swift.install2 = en voer het volgende commando uit: @@ -3682,7 +3780,7 @@ nuget.install = Voer het volgende commando uit om het pakket met NuGet te instal npm.install = Voer het volgende commando uit om het pakket met npm te installeren: npm.install2 = of voeg het toe aan het package.json bestand: npm.dependencies = Afhankelijkheden -npm.dependencies.development = Ontwikkelings Afhankelijkheden +npm.dependencies.development = Ontwikkelings afhankelijkheden npm.dependencies.peer = Peer afhankelijkheden npm.dependencies.optional = Optionele afhankelijkheden owner.settings.cargo.title = Cargo register index @@ -3704,7 +3802,7 @@ owner.settings.cleanuprules.keep.count = Bewaar de meest recente owner.settings.cleanuprules.keep.count.1 = 1 versie per pakket owner.settings.cleanuprules.keep.count.n = %d versies per pakket pub.install = Voer het volgende commando uit om het pakket met Dart te installeren: -rubygems.dependencies.runtime = Runtime Dependencies +rubygems.dependencies.runtime = Runtime dependencies settings.delete.error = Het verwijderen van het pakket is mislukt. alpine.registry = Stel dit register in door de url toe te voegen aan je /etc/apk/repositories bestand: maven.registry = Stel dit register in het pom.xml bestand van je project: @@ -3768,6 +3866,15 @@ arch.version.conflicts = Conflicten arch.version.replaces = Vervangt arch.version.backup = Back-up arch.version.makedepends = Maken is afhankelijk van +container.images.title = Afbeeldingen +search_in_external_registry = Zoeken in %s +alt.registry.install = Voer het volgende commando uit om het pakket te installeren: +alt.repository = Repository info +alt.repository.architectures = Architecturen +alt.repository.multiple_groups = Dit pakket is beschikbaar in meerdere groepen. +alt.registry = Stel dit register in vanaf de opdrachtregel: +alt.install = Pakket installeren +alt.setup = Voeg een repository toe aan de lijst met gekoppelde repositories (kies de benodigde architectuur in plaats van "_arch_"): [secrets] secrets = Geheimen @@ -3785,9 +3892,6 @@ creation.name_placeholder = hoofdlettergevoelig, alleen alfanumerieke tekens of deletion.failed = Mislukt om geheim te verwijderen. [actions] - - - runners.name=Naam runners.owner_type=Type runners.description=Omschrijving @@ -3862,7 +3966,7 @@ runs.actors_no_select = Alle acteurs runs.status_no_select = Alle statussen runs.no_results = Geen resultaten gevonden. runs.no_workflows = Er zijn nog geen workflows. -unit.desc = Beheer geïntegreerde CI/CD-pijplijnen met Forgejo Actions +unit.desc = Beheer geïntegreerde CI/CD-pijplijnen met Forgejo Actions. runs.no_workflows.documentation = Voor meer informatie over Forgejo acties, zie de documentatie. workflow.disable_success = Workflow "%s" is succesvol uitgeschakeld. variables.none = Er zijn nog geen variabelen. @@ -3883,6 +3987,9 @@ workflow.dispatch.warn_input_limit = Alleen de eerste %d invoeren worden weergeg workflow.dispatch.invalid_input_type = Ongeldig invoertype “%sâ€. workflow.dispatch.input_required = Waarde vereist voor invoer “%sâ€. runs.expire_log_message = Logs zijn verwijderd omdat ze te oud waren. +runs.no_workflows.help_no_write_access = Om meer te weten te komen over Forgejo Acties, zie de documentatie. +runs.no_workflows.help_write_access = Weet je niet hoe je moet beginnen met Forgejo Actions? Bekijk de snelstart in de gebruikersdocumentatie om je eerste workflow te schrijven en stel vervolgens een Forgejo runner in om je jobs uit te voeren. +variables.not_found = De variabele kon niet gevonden worden. @@ -3894,7 +4001,6 @@ type-3.display_name = Organisatie project deleted.display_name = Verwijderd project [git.filemode] -; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … symbolic_link=Symbolische link submodule = Submodule changed_filemode = %[1]s → %[2]s @@ -3904,31 +4010,21 @@ executable_file = Uitvoerbaar bestand -[graphs] -component_loading_info = Dit kan even duren… -component_failed_to_load = Er is een onverwachte fout opgetreden. -contributors.what = bijdragen -component_loading_failed = %s kon niet worden geladen -component_loading = Bezig met laden van %s... -code_frequency.what = code frequentie -recent_commits.what = recente commits - - [search] -search = Zoek... +search = Zoek… fuzzy = Fuzzy match = Overeenkomen match_tooltip = Alleen resultaten opnemen die exact overeenkomen met de zoekterm -repo_kind = Zoek repos... -user_kind = Zoek gebruikers... -org_kind = Zoek orgs... -team_kind = Zoek teams... -code_kind = Zoek code... -package_kind = Zoek pakketten... -project_kind = Zoek projecten... -branch_kind = Zoek branches... -commit_kind = Zoek commits... -runner_kind = Zoek runners... +repo_kind = Zoek repos… +user_kind = Zoek gebruikers… +org_kind = Zoek orgs… +team_kind = Zoek teams… +code_kind = Zoek code… +package_kind = Zoek pakketten… +project_kind = Zoek projecten… +branch_kind = Zoek branches… +commit_kind = Zoek commits… +runner_kind = Zoek runners… no_results = Geen overeenkomende resultaten gevonden. type_tooltip = Zoektype fuzzy_tooltip = Neem resultaten op die ook sterk overeenkomen met de zoekterm @@ -3937,11 +4033,13 @@ keyword_search_unavailable = Zoeken op trefwoord is momenteel niet beschikbaar. code_search_by_git_grep = Huidige code zoekresultaten worden geleverd door "git grep". Er kunnen betere resultaten zijn als de sitebeheerder code indexer inschakelt. exact = Exact exact_tooltip = Bevat alleen resultaten die de exacte zoekterm bevatten -issue_kind = Zoek issues... -pull_kind = Zoek pulls... +issue_kind = Zoek issues… +pull_kind = Zoek pulls… union = Trefwoorden union_tooltip = Neem resultaten op die overeenkomen met een van de trefwoorden gescheiden door spaties milestone_kind = Zoek mijlpalen... +regexp_tooltip = Interpreteer de zoekterm als een reguliere expressie +regexp = RegExp [munits.data] b = B @@ -3959,4 +4057,24 @@ filepreview.truncated = Voorbeeld is ingekort [translation_meta] -test = Oké \ No newline at end of file +test = Oké + +[repo.permissions] +code.write = Schrijven: Push naar de repositorie, maak branches en tags. +code.read = Lezen: Toegang en clone de code van de repository. +issues.read = Lezen: Lees en maak issues en commentaren. +pulls.read = Lezen: Lezen en pull requests maken. +releases.read = Lezen: Bekijk en download releases. +ext_issues = Toegang tot de link naar een externe issue tracker. De rechten worden extern beheerd. +ext_wiki = Toegang tot de link naar een externe wiki. De rechten worden extern beheerd. +actions.write = Write: Handmatig starten, herstarten, annuleren of goedkeuren van hangende CI/CD-pijplijnen. +pulls.write = Schrijven: Sluit pull requests af en beheer metadata zoals labels, mijlpalen, verantwoordelijken, vervaldatums en afhankelijkheden. +releases.write = Schrijven: Publiceren, bewerken en verwijderen van releases en hun assets. +wiki.read = Lezen: Lees de geïntegreerde wiki en zijn geschiedenis. +wiki.write = Schrijven: Pagina's maken, bijwerken en verwijderen in de geïntegreerde wiki. +projects.read = Lezen: Toegang tot projectboards van repository's. +projects.write = Schrijven: Projecten en kolommen maken en bewerken. +packages.read = Lezen: Bekijk en download pakketten die aan de repository is toegewezen. +packages.write = Schrijven: Publiceer en verwijder pakketten die aan de repository is toegewezen. +actions.read = Lezen: Bekijk geïntegreerde CI/CD-pijplijnen en hun logboeken. +issues.write = Schrijven: Sluit issues af en beheer metadata zoals labels, mijlpalen, verantwoordelijken, vervaldatums en afhankelijkheden. diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index e9e3b62254..f7bb6f3294 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -29,8 +29,8 @@ password=HasÅ‚o access_token=Token dostÄ™pu re_type=Potwierdź hasÅ‚o captcha=CAPTCHA -twofa=Autoryzacja dwuskÅ‚adnikowa -twofa_scratch=Kod jednorazowy weryfikacji dwuetapowej +twofa=Uwierzytelnianie dwuskÅ‚adnikowe +twofa_scratch=Kod jednorazowy uwierzytelniania dwuskÅ‚adnikowego passcode=Kod dostÄ™pu webauthn_insert_key=Podłącz swój klucz bezpieczeÅ„stwa @@ -128,7 +128,7 @@ retry = Ponów view = Widok go_back = Wróć filter = Filtr -confirm_delete_artifact = JesteÅ› penwy że chcesz usunąć artefakt "%s"? +confirm_delete_artifact = JesteÅ› pewny(-na) że chcesz usunąć artefakt "%s"? concept_system_global = Globalne concept_user_individual = Indywidualny filter.clear = Wyczyść filtry @@ -148,10 +148,10 @@ filter.public = Publiczne filter.private = Prywatne copy_generic = Skopiuj do schowka toggle_menu = Przełącz menu -tracked_time_summary = Podsumowanie Å›ledzonego czasu na podstawie filtrów listy problemów +tracked_time_summary = Podsumowanie Å›ledzonego czasu na podstawie filtrów listy zgÅ‚oszeÅ„ show_timestamps = Pokaż znaczniki czasu filter.not_archived = Nie zarchiwizowane -filter.not_mirror = Nie mirror +filter.not_mirror = Bez kopii lustrzanych filter.not_template = Nie szablony filter.is_archived = Zarchiwizowane filter.is_mirror = Kopie lustrzane @@ -166,21 +166,22 @@ new_repo.link = Nowe repozytorium new_migrate.link = Nowa migracja new_org.link = Nowa organizacja filter.not_fork = Nie forki +copy_path = Skopiuj Å›cieżkÄ™ [aria] navbar = Pasek nawigacji footer = Stopka -footer.software = O oprogramowaniu +footer.software = O tym oprogramowaniu footer.links = Linki [heatmap] -contributions_format = {contributions} w dniu {month} {day}, {year} +contributions_format = {contributions} w dniu {day} {month} {year} less = Mniej more = WiÄ™cej number_of_contributions_in_the_last_12_months = %s kontrybucji w ciÄ…gu ostatnich 12 miesiÄ™cy contributions_zero = Brak kontrybucji -contributions_one = WkÅ‚ad -contributions_few = WkÅ‚ady +contributions_one = kontrybucja +contributions_few = kontrybucji [editor] buttons.heading.tooltip = Dodaj nagłówek @@ -195,9 +196,16 @@ buttons.list.task.tooltip = Dodaj listÄ™ zadaÅ„ buttons.ref.tooltip = Dodaj odniesienie do zgÅ‚oszenia lub pull requestu buttons.mention.tooltip = Dodaj wzmiankÄ™ o użytkowniku lub zespole buttons.switch_to_legacy.tooltip = Zamiast tego użyj starego edytora -buttons.disable_monospace_font = Wyłącz czcionkÄ™ monospace -buttons.enable_monospace_font = Włącz czcionkÄ™ monospace -buttons.indent.tooltip = Zagnieżdż elementy o jeden poziom +buttons.disable_monospace_font = Wyłącz czcionkÄ™ o staÅ‚ej szerokoÅ›ci +buttons.enable_monospace_font = Włącz czcionkÄ™ o staÅ‚ej szerokoÅ›ci +buttons.indent.tooltip = Zagnieźdź elementy o jeden poziom +buttons.new_table.tooltip = Dodaj tabelÄ™ +table_modal.header = Dodaj tabelÄ™ +table_modal.placeholder.header = Nagłówek +table_modal.placeholder.content = Zawartość +table_modal.label.rows = Wiersze +table_modal.label.columns = Kolumny +buttons.unindent.tooltip = UsuÅ„ jeden poziom zagnieżdżenia [filter] string.asc = A - Z @@ -248,7 +256,7 @@ err_empty_db_path=Åšcieżka do bazy danych SQLite3 nie może być pusta. no_admin_and_disable_registration=Nie możesz wyłączyć możliwoÅ›ci samodzielnej rejestracji kont użytkowników bez stworzenia konta administratora. err_empty_admin_password=HasÅ‚o administratora nie może być puste. err_empty_admin_email=Pole adresu e-mail administratora nie może być puste. -err_admin_name_is_reserved=Nazwa użytkownika administratora jest nieprawidÅ‚owa, pseudonim jest zastrzeżony +err_admin_name_is_reserved=Nazwa użytkownika administratora jest nieprawidÅ‚owa, nazwa użytkownika jest zarezerwowana err_admin_name_pattern_not_allowed=Nazwa użytkownika administratora jest nieprawidÅ‚owa, pseudonim zawiera zastrzeżone znaki err_admin_name_is_invalid=Nazwa użytkownika administratora jest nieprawidÅ‚owa @@ -289,7 +297,7 @@ disable_gravatar.description=Wyłącz Gravatar i inne usÅ‚ugi zewnÄ™trzne awatar federated_avatar_lookup=Włącz zewnÄ™trzne awatary federated_avatar_lookup.description=Wyszukuj awatary za pomocÄ… Libravatar. disable_registration=Wyłącz samodzielnÄ… rejestracjÄ™ -disable_registration.description=Tylko administratorzy instancji bÄ™dÄ… mogli tworzyć nowe konta użytkowników. Zaleca siÄ™ pozostawienie rejestracji wyłączonej, chyba że zamierzasz hostować publicznÄ… instancjÄ™ dla wszystkich i jesteÅ› gotowy na radzenie sobie z dużą iloÅ›ciÄ… kont spamerskich. +disable_registration.description=Tylko administratorzy instancji bÄ™dÄ… mogli tworzyć nowe konta użytkowników. Zaleca siÄ™ pozostawienie rejestracji wyłączonej, chyba że zamierzasz hostować publicznÄ… instancjÄ™ dla wszystkich i jesteÅ› gotowy(-a) na radzenie sobie z dużą iloÅ›ciÄ… kont spamerskich. allow_only_external_registration.description=Użytkownicy bÄ™dÄ… mogli tworzyć nowe konta tylko za pomocÄ… skonfigurowanych usÅ‚ug zewnÄ™trznych. openid_signin=Włącz logowanie za pomocÄ… OpenID openid_signin.description=Zezwól użytkownikom na logowanie siÄ™ przez OpenID. @@ -321,12 +329,12 @@ default_keep_email_private.description=DomyÅ›lnie włącz ukrywanie adresu e-mai default_allow_create_organization=DomyÅ›lne zezwolenie na tworzenie organizacji default_allow_create_organization.description=DomyÅ›lnie zezwalaj nowym użytkownikom na tworzenie organizacji. Gdy ta opcja jest wyłączona, administrator bÄ™dzie musiaÅ‚ przyznać uprawnienia do tworzenia organizacji nowym użytkownikom. default_enable_timetracking=DomyÅ›lnie włącz Å›ledzenie czasu -default_enable_timetracking.description=DomyÅ›lne zezwól na korzystanie z funkcji Å›ledzenia czasu dla nowych repozytoriów. -no_reply_address=Ukryta domena e-mail +default_enable_timetracking.description=DomyÅ›lnie zezwól na korzystanie z funkcji Å›ledzenia czasu dla nowych repozytoriów. +no_reply_address=Domena ukrytych e-maili no_reply_address_helper=Nazwa domeny dla użytkowników z ukrytym adresem e-mail. PrzykÅ‚adowo, użytkownik "jan" bÄ™dzie zalogowany na Git'cie jako "jan@noreply.example.org", jeÅ›li domena ukrytego adresu e-mail jest ustawiona na "noreply.example.org". password_algorithm=Algorytm hashowania haseÅ‚ invalid_db_table = Tabela bazy danych "%s" jest nieprawidÅ‚owa: %v -allow_dots_in_usernames = Zezwolenie użytkownikom na używanie kropek w nazwach użytkowników. Nie ma to wpÅ‚ywu na istniejÄ…ce konta. +allow_dots_in_usernames = Zezwól użytkownikom na używanie kropek w nazwach użytkowników. Nie ma to wpÅ‚ywu na istniejÄ…ce konta. invalid_password_algorithm = NieprawidÅ‚owy algorytm hashowania haseÅ‚ smtp_from_invalid = Adres "WyÅ›lij e-mail jako" jest nieprawidÅ‚owy env_config_keys_prompt = NastÄ™pujÄ…ce zmienne Å›rodowiskowe zostanÄ… również zastosowane do pliku konfiguracyjnego: @@ -342,7 +350,7 @@ app_slogan = Slogan instancji app_slogan_helper = Wprowadź tutaj slogan swojej instancji. Pozostaw puste, aby wyłączyć. [home] -uname_holder=Nazwa użytkownika lub adres email +uname_holder=Nazwa użytkownika lub adres e-mail password_holder=HasÅ‚o switch_dashboard_context=Przełącz kontekst pulpitu my_repos=Repozytoria @@ -399,10 +407,10 @@ remember_me=ZapamiÄ™taj to urzÄ…dzenie forgot_password_title=ZapomniaÅ‚em hasÅ‚a forgot_password=ZapomniaÅ‚eÅ› hasÅ‚a? sign_up_now=Potrzebujesz konta? Zarejestruj siÄ™ teraz. -confirmation_mail_sent_prompt=Nowa wiadomość e-mail z potwierdzeniem zostaÅ‚a wysÅ‚ana do %s. Aby zakoÅ„czyć proces rejestracji, sprawdź swojÄ… skrzynkÄ™ odbiorczÄ… i kliknij podany link w ciÄ…gu najbliższych %s. JeÅ›li wiadomość email jest nieważna, możesz siÄ™ zalogować i poprosić o wysÅ‚anie kolejnej wiadomoÅ›ci email z potwierdzeniem na inny adres. +confirmation_mail_sent_prompt=Nowa wiadomość e-mail z potwierdzeniem zostaÅ‚a wysÅ‚ana do %s. Aby zakoÅ„czyć proces rejestracji, sprawdź swojÄ… skrzynkÄ™ odbiorczÄ… i kliknij podany link w ciÄ…gu najbliższych %s. JeÅ›li wiadomość e-mail jest nieważna, możesz siÄ™ zalogować i poprosić o wysÅ‚anie kolejnej wiadomoÅ›ci e-mail z potwierdzeniem na inny adres. must_change_password=Zaktualizuj swoje hasÅ‚o allow_password_change=Użytkownik musi zmienić hasÅ‚o (zalecane) -reset_password_mail_sent_prompt=Wiadomość email z potwierdzeniem zostaÅ‚a wysÅ‚ana do %s. Aby zakoÅ„czyć proces odzyskiwania konta, sprawdź swojÄ… skrzynkÄ™ odbiorczÄ… i kliknij podany link w ciÄ…gu najbliższych %s. +reset_password_mail_sent_prompt=Wiadomość e-mail z potwierdzeniem zostaÅ‚a wysÅ‚ana do %s. Aby zakoÅ„czyć proces odzyskiwania konta, sprawdź swojÄ… skrzynkÄ™ odbiorczÄ… i kliknij podany link w ciÄ…gu najbliższych %s. active_your_account=Aktywuj swoje konto account_activated=Konto zostaÅ‚o aktywowane prohibit_login=Konto jest zawieszone @@ -410,7 +418,7 @@ resent_limit_prompt=Zażądano już wiadomoÅ›ci aktywacyjnej. Zaczekaj 3 minuty has_unconfirmed_mail=Witaj, %s, masz niepotwierdzony adres e-mail (%s). JeÅ›li nie otrzymaÅ‚eÅ› wiadomoÅ›ci e-mail z potwierdzeniem lub potrzebujesz wysÅ‚ać nowÄ…, kliknij na poniższy przycisk. resend_mail=Kliknij tutaj, aby wysÅ‚ać e-mail aktywacyjny email_not_associate=Adres e-mail nie jest powiÄ…zany z żadnym kontem. -send_reset_mail=WyÅ›lij email odzyskiwania +send_reset_mail=WyÅ›lij e-mail odzyskiwania reset_password=Odzyskiwanie konta invalid_code=Twój kod potwierdzajÄ…cy jest nieprawidÅ‚owy lub wygasÅ‚. reset_password_helper=Odzyskaj konto @@ -451,17 +459,17 @@ sign_up_successful = Konto zostaÅ‚o pomyÅ›lnie utworzone. Witamy! prohibit_login_desc = Twoje konto zostaÅ‚o zawieszone i nie może wchodzić w interakcje z instancjÄ…. Skontaktuj siÄ™ z administratorem instancji, aby odzyskać dostÄ™p. change_unconfirmed_email_summary = ZmieÅ„ adres e-mail, na który zostanie wysÅ‚ana wiadomość aktywacyjna. manual_activation_only = Skontaktuj siÄ™ z administratorem witryny, aby dokoÅ„czyć aktywacjÄ™. -change_unconfirmed_email = JeÅ›li podczas rejestracji podaÅ‚eÅ› nieprawidÅ‚owy adres e-mail, możesz go zmienić poniżej, a potwierdzenie zostanie wysÅ‚ane na nowy adres. +change_unconfirmed_email = JeÅ›li podczas rejestracji podaÅ‚eÅ›(-aÅ›) nieprawidÅ‚owy adres e-mail, możesz go zmienić poniżej, a potwierdzenie zostanie wysÅ‚ane na nowy adres. openid_signin_desc = Wprowadź swój identyfikator URI OpenID. Na przykÅ‚ad: alice.openid.example.org lub https://openid.example.org/alice. -authorization_failed_desc = Autoryzacja nie powiodÅ‚a siÄ™, ponieważ wykryliÅ›my nieprawidÅ‚owe żądanie. Skontaktuj siÄ™ z autorem aplikacji, którÄ… próbowaÅ‚eÅ› autoryzować. +authorization_failed_desc = Autoryzacja nie powiodÅ‚a siÄ™, ponieważ wykryliÅ›my nieprawidÅ‚owe żądanie. Skontaktuj siÄ™ z autorem aplikacji, którÄ… próbowaÅ‚eÅ›(-aÅ›) autoryzować. password_pwned = Wybrane hasÅ‚o znajduje siÄ™ na liÅ›cie skradzionych haseÅ‚, które zostaÅ‚y wczeÅ›niej ujawnione w wyniku publicznego naruszenia danych. Spróbuj ponownie z innym hasÅ‚em i rozważ zmianÄ™ tego hasÅ‚a również w innych miejscach. last_admin = Nie można usunąć ostatniego administratora. Musi istnieć co najmniej jeden administrator. tab_signin = Zaloguj oauth.signin.error = WystÄ…piÅ‚ błąd podczas przetwarzania żądania autoryzacji. JeÅ›li ten błąd nadal wystÄ™puje, skontaktuj siÄ™ z administratorem witryny. -change_unconfirmed_email_error = Nie udaÅ‚o się zmienić adresu email: %v +change_unconfirmed_email_error = Nie udaÅ‚o siÄ™ zmienić adresu e-mail: %v invalid_code_forgot_password = Twój kod potwierdzajÄ…cy jest niepoprawny lub wygasÅ‚. NaciÅ›nij tutajâ£, aby rozpocząć nową sesjÄ™. invalid_password = Twoje hasÅ‚o nie zgadza siÄ™ z hasÅ‚em, które zostaÅ‚o użyte do stworzenia konta. -reset_password_wrong_user = Jesteś zalogowany jako %s, ale link odzyskujÄ…cy jest dla %s +reset_password_wrong_user = JesteÅ› zalogowany(-a) jako %s, ale link odzyskujÄ…cy jest dla %s tab_signup = Zarejestruj oauth.signin.error.access_denied = Wniosek o autoryzacjÄ™ zostaÅ‚ odrzucony. oauth.signin.error.temporarily_unavailable = Autoryzacja nie powiodÅ‚a siÄ™, ponieważ serwer uwierzytelniania jest tymczasowo niedostÄ™pny. Spróbuj ponownie później. @@ -470,6 +478,8 @@ back_to_sign_in = Wróć do logowania sign_in_openid = Kontynuuj z OpenID hint_login = Masz już konto? Zaloguj siÄ™ teraz! sign_up_button = Zarejestruj siÄ™. +use_onetime_code = Użyj kodu jednorazowego +unauthorized_credentials = Dane uwierzytelniajÄ…ce sÄ… nieprawidÅ‚owe lub wygasÅ‚y. Spróbuj ponownie wykonać polecenie lub zobacz %s, aby uzyskać wiÄ™cej informacji [mail] view_it_on=Zobacz na %s @@ -492,7 +502,7 @@ register_notify.text_3=JeÅ›li ktoÅ› inny utworzyÅ‚ dla ciebie to konto, musisz n reset_password=Odzyskaj swoje konto reset_password.title=%s, otrzymaliÅ›my proÅ›bÄ™ o odzyskanie konta -reset_password.text=JeÅ›li to byÅ‚eÅ› ty, kliknij poniższy link, aby odzyskać swoje konto w ciÄ…gu %s: +reset_password.text=JeÅ›li to byÅ‚eÅ›(-aÅ›) ty, kliknij poniższy link, aby odzyskać swoje konto w ciÄ…gu %s: register_success=Rejestracja powiodÅ‚a siÄ™ @@ -522,7 +532,7 @@ repo.transfer.to_you=ciebie repo.transfer.body=Aby zaakceptować lub odrzucić go, odwiedź %s lub po prostu go zignoruj. repo.collaborator.added.subject=%s dodaÅ‚ ciÄ™ do %s jako współtwórce -repo.collaborator.added.text=ZostaÅ‚eÅ› dodany jako współtwórca do repozytorium: +repo.collaborator.added.text=ZostaÅ‚eÅ›(-aÅ›) dodany jako współtwórca do repozytorium: issue.action.push_1 = @%[1]s pchnÄ…Å‚ %[3]d commit do %[2]s activate_email.title = %s, zweryfikuj swój adres e-mail admin.new_user.text = Kliknij tutaj, aby zarzÄ…dzać tym użytkownikiem z panelu administracyjnego. @@ -531,27 +541,28 @@ reply = lub odpowiedz bezpoÅ›rednio na ten e-mail admin.new_user.subject = WÅ‚aÅ›nie zarejestrowaÅ‚ siÄ™ nowy użytkownik %s admin.new_user.user_info = Informacje użytkownika issue.action.approve = @%[1]s zatwierdziÅ‚ ten pull request. -issue.action.reject = @%[1]s poprosiÅ‚ o zmiany w tym pull requescie. +issue.action.reject = @%[1]s poprosiÅ‚ o zmiany w tym pull requeÅ›cie. issue.action.review_dismissed = @%[1]s odrzuciÅ‚ ostatniÄ… analizÄ™ od %[2]s dla tego pull requesta. team_invite.subject = %[1]s zaprosiÅ‚ ciÄ™ do dołączenia do organizacji %[2]s primary_mail_change.subject = Twój główny mail zostaÅ‚ zmieniony -primary_mail_change.text_1 = Główny mail twojego konta zostaÅ‚ wÅ‚aÅ›nie zmieniony na %[1]s. To oznacza ze ten adres email nie bÄ™dzie już otrzymywaÅ‚ powiadomieÅ„ dla twojego konta. +primary_mail_change.text_1 = Główny mail twojego konta zostaÅ‚ wÅ‚aÅ›nie zmieniony na %[1]s. To oznacza ze ten adres e-mail nie bÄ™dzie już otrzymywaÅ‚ powiadomieÅ„ dla twojego konta. totp_disabled.subject = TOTP zostaÅ‚ wyłączony password_change.subject = Twoje hasÅ‚o zostaÅ‚o zmienione password_change.text_1 = HasÅ‚o do twojego konta zostaÅ‚o wÅ‚aÅ›nie zmienione. team_invite.text_1 = %[1]s zaprosiÅ‚ ciÄ™ do zespoÅ‚u %[2]s w organizacji %[3]s. removed_security_key.no_2fa = Nie ma już skonfigurowanych innych metod 2FA, co oznacza, że nie jest już konieczne logowanie siÄ™ do konta za pomocÄ… 2FA. -account_security_caution.text_2 = JeÅ›li to nie byÅ‚eÅ› Ty, Twoje konto padÅ‚o ofiarÄ… wÅ‚amania. Skontaktuj siÄ™ z administratorem tej strony. -account_security_caution.text_1 = JeÅ›li to byÅ‚eÅ› ty, możesz bezpiecznie zignorować tÄ™ wiadomość. -totp_enrolled.subject = AktywowaÅ‚eÅ› TOTP jako metodÄ™ 2FA -totp_enrolled.text_1.no_webauthn = WÅ‚aÅ›nie włączyÅ‚eÅ› TOTP dla swojego konta. Oznacza to, że dla wszystkich przyszÅ‚ych logowaÅ„ do konta musisz używać TOTP jako metody 2FA. -team_invite.text_3 = Uwaga: To zaproszenie byÅ‚o przeznaczone dla %[1]s. JeÅ›li nie spodziewaÅ‚eÅ› siÄ™ tego zaproszenia, możesz zignorować ten email. +account_security_caution.text_2 = JeÅ›li to nie byÅ‚eÅ›(-aÅ›) Ty, Twoje konto padÅ‚o ofiarÄ… wÅ‚amania. Skontaktuj siÄ™ z administratorem tej strony. +account_security_caution.text_1 = JeÅ›li to byÅ‚eÅ›(-aÅ›) ty, możesz bezpiecznie zignorować tÄ™ wiadomość. +totp_enrolled.subject = AktywowaÅ‚eÅ›(-aÅ›) TOTP jako metodÄ™ 2FA +totp_enrolled.text_1.no_webauthn = WÅ‚aÅ›nie włączyÅ‚eÅ›(-aÅ›) TOTP dla swojego konta. Oznacza to, że dla wszystkich przyszÅ‚ych logowaÅ„ do konta musisz używać TOTP jako metody 2FA. +team_invite.text_3 = Uwaga: To zaproszenie byÅ‚o przeznaczone dla %[1]s. JeÅ›li nie spodziewaÅ‚eÅ›(-aÅ›) siÄ™ tego zaproszenia, możesz zignorować ten e-mail. totp_disabled.text_1 = Jednorazowe hasÅ‚o czasowe (TOTP) zostaÅ‚o wÅ‚aÅ›nie wyłączone na twoim koncie. totp_disabled.no_2fa = Nie ma już skonfigurowanych innych metod 2FA, co oznacza, że nie jest już konieczne logowanie siÄ™ do konta za pomocÄ… 2FA. removed_security_key.subject = Klucz bezpieczeÅ„stwa zostaÅ‚ usuniÄ™ty removed_security_key.text_1 = Klucz bezpieczeÅ„stwa "%[1]s" zostaÅ‚ wÅ‚aÅ›nie usuniÄ™ty z twojego konta. -totp_enrolled.text_1.has_webauthn = WÅ‚aÅ›nie włączyÅ‚eÅ› TOTP dla swojego konta. Oznacza to, że dla wszystkich przyszÅ‚ych logowaÅ„ do konta możesz użyć TOTP jako metody 2FA lub użyć dowolnego klucza bezpieczeÅ„stwa. +totp_enrolled.text_1.has_webauthn = WÅ‚aÅ›nie włączyÅ‚eÅ›(-aÅ›) TOTP dla swojego konta. Oznacza to, że dla wszystkich przyszÅ‚ych logowaÅ„ do konta możesz użyć TOTP jako metody 2FA lub użyć dowolnego klucza bezpieczeÅ„stwa. team_invite.text_2 = Kliknij poniższy link, aby dołączyć do zespoÅ‚u: +issue.action.merge = @%[1]s połączyÅ‚(-Å‚a) #%[2]d z %[3]s. [modal] @@ -649,11 +660,22 @@ invalid_group_team_map_error = ` mapowanie jest nieprawidÅ‚owe: %s` url_error = `"%s" nie jest poprawnym adresem URL.` unset_password = Użytkownik nie ustawiÅ‚ hasÅ‚a. openid_been_used = Adres OpenID "%s" jest już używany. -organization_leave_success = PomyÅ›lnie opuÅ›ciÅ‚eÅ› organizacjÄ™ %s. +organization_leave_success = PomyÅ›lnie opuÅ›ciÅ‚eÅ›(-aÅ›) organizacjÄ™ %s. must_use_public_key = Podany klucz jest kluczem prywatnym. Nie przesyÅ‚aj nigdzie swojego klucza prywatnego. Zamiast tego użyj klucza publicznego. Location = Lokalizacja username_error_no_dots = ` może zawierać tylko znaki alfanumeryczne ("0-9", "a-z", "A-Z"), myÅ›lnik ("-") oraz podkreÅ›lenie ("_"). Nie może zaczynać siÄ™ ani koÅ„czyć znakami niealfanumerycznymi, a znaki niealfanumeryczne wystÄ™pujÄ…ce po sobie sÄ… również zabronione.` username_error = ` może zawierać tylko znaki alfanumeryczne ("0-9", "a-z", "A-Z"), myÅ›lnik ("-") oraz podkreÅ›lenie ("_"). Nie może zaczynać siÄ™ ani koÅ„czyć znakami niealfanumerycznymi, a znaki niealfanumeryczne wystÄ™pujÄ…ce po sobie sÄ… również zabronione.` +still_has_org = Twoje konto jest czÅ‚onkiem jednej bÄ…dź wielu organizacji, musisz je najpierw opuÅ›cić. +org_still_own_repo = Ta organizacja nadal jest wÅ‚aÅ›cicielem jednego lub wielu repozytoriów. Najpierw je usuÅ„ lub przenieÅ›. +admin_cannot_delete_self = Nie możesz usunąć siebie, gdy jesteÅ› administratorem. ProszÄ™ najpierw usunąć swoje uprawnienia administratora. +required_prefix = Pole musi zaczynać siÄ™ od "%s" +org_still_own_packages = Ta organizacja nadal jest wÅ‚aÅ›cicielem jednego lub wielu pakietów, musisz je najpierw usunąć. +unsupported_login_type = Ta forma logowania nie wspiera możliwoÅ›ci usuniÄ™cia konta. +include_error = ` musi zawierać podciÄ…g znaków "%s".` +still_own_packages = Twoje konto jest wÅ‚aÅ›cicielem jednego lub wiÄ™cej pakietów, musisz je najpierw usunąć. +username_claiming_cooldown = Nazwa użytkownika nie może być uzyskana, ponieważ okres ochrony jeszcze nie minÄ…Å‚. Może zostać uzyskana dopiero w %[1]s. +email_domain_is_not_allowed = Domena adresu e-mail użytkownika %s konfliktuje z EMAIL_DOMAIN_ALLOWLIST lub EMAIL_DOMAIN_BLOCKLIST. Upewnij siÄ™, że ustawiony adres e-mail jest poprawny. +invalid_ssh_principal = NieprawidÅ‚owy podmiot: %s [user] @@ -673,6 +695,30 @@ disabled_public_activity=Ten użytkownik wyłączyÅ‚ publiczne wyÅ›wietlanie jeg code = Kod block = Zablokuj unblock = Odblokuj +block_user.detail = PamiÄ™taj, że zablokowanie użytkownika powoduje inne skutki, takie jak: +block_user.detail_2 = Ten użytkownik nie bÄ™dzie mógÅ‚ wchodzić w interakcjÄ™ z repozytoriami, których jesteÅ› wÅ‚aÅ›cicielem, ani ze zgÅ‚oszeniami i komentarzami, które utworzyÅ‚eÅ›(-aÅ›). +settings = Ustawienia użytkownika +followers_one = %d obserwujÄ…cych +following_one = %d obserwowanych +followers.title.one = ObserwujÄ…cy +followers.title.few = ObserwujÄ…cy +following.title.one = Obserwowani +following.title.few = Obserwowani +email_visibility.limited = Twój adres e-mail jest widoczny dla wszystkich uwierzytelnionych użytkowników +block_user = Zablokuj użytkownika +block_user.detail_1 = Przestaniecie siÄ™ wzajemnie obserwować i nie bÄ™dziecie mogli siÄ™ wzajemnie obserwować. +follow_blocked_user = Nie możesz obserwować tego użytkownika, ponieważ go zablokowaÅ‚eÅ›(-aÅ›) lub ten użytkownik zablokowaÅ‚ Ciebie. +show_on_map = Pokaż to mejsce na mapie +joined_on = DołączyÅ‚ w %s +block_user.detail_3 = Nie bÄ™dziecie mogli dodać siebie jako współpracownicy repozytorium. +public_activity.visibility_hint.self_public = Twoja aktywność jest widoczna dla wszystkich, z wyjÄ…tkiem interakcji w przestrzeniach prywatnych. Konfiguruj. +public_activity.visibility_hint.admin_public = Twoja aktywność jest widoczna dla wszystkich, jednak jako administrator masz możliwość podejrzenia interakcji w przestrzeniach prywatnych. +public_activity.visibility_hint.self_private = Twoja aktywność jest widoczna tylko dla ciebie i administratorów tej instancji. Konfiguruj. +public_activity.visibility_hint.admin_private = Ta aktywność jest dla ciebie widoczna ponieważ jesteÅ› administratorem, ale użytkownik preferuje by ta aktywność byÅ‚a ukryta. +form.name_reserved = Nazwa użytkownika "%s" jest zarezerwowana. +form.name_pattern_not_allowed = Wzór "%s" nie jest dozwolony w nazwie użytkownika. +public_activity.visibility_hint.self_private_profile = Twoja aktywność jest widoczna tylko dla ciebie i administratorów tej instancji ponieważ twój profil jest prywatny. Konfiguruj. +form.name_chars_not_allowed = Nazwa użytkownika "%s" zawiera nieprawidÅ‚owe znaki. [settings] @@ -685,7 +731,7 @@ avatar=Awatar ssh_gpg_keys=Klucze SSH / GPG social=Konta spoÅ‚ecznoÅ›ciowe applications=Aplikacje -orgs=ZarzÄ…dzaj organizacjami +orgs=Organizacje repos=Repozytoria delete=UsuÅ„ konto twofa=Autoryzacja dwuetapowa @@ -698,7 +744,7 @@ password_username_disabled=Użytkownicy nielokalni nie mogÄ… zmieniać swoich na full_name=ImiÄ™ i nazwisko website=Strona location=Lokalizacja -update_theme=Zaktualizuj motyw +update_theme=ZmieÅ„ motyw update_profile=Zaktualizuj profil update_language_success=JÄ™zyk zostaÅ‚ zaktualizowany. update_profile_success=Twój profil zostaÅ‚ zaktualizowany. @@ -729,17 +775,17 @@ password_change_disabled=Konta niebÄ™dÄ…ce lokalnymi nie mogÄ… zmienić swojego emails=Adresy e-mail manage_emails=ZarzÄ…dzaj adresami e-mail -manage_themes=Wybierz motyw domyÅ›lny -manage_openid=ZarzÄ…dzanie adresami OpenID -theme_desc=BÄ™dzie to domyÅ›lny motyw na caÅ‚ej stronie. +manage_themes=DomyÅ›lny motyw +manage_openid=Adresy OpenID +theme_desc=Ten motyw bÄ™dzie użyty dla interfejsu przeglÄ…darkowego kiedy bÄ™dziesz zalogowany. primary=Podstawowy activated=Aktywowany requires_activation=Wymaga aktywacji primary_email=Ustaw jako podstawowy -activate_email=WyÅ›lij aktywacjÄ™ -activations_pending=Aktywacje oczekujÄ…ce +activate_email=WyÅ›lij e-mail aktywacyjny +activations_pending=OczekujÄ…ce aktywacje delete_email=UsuÅ„ -email_deletion=UsuÅ„ adres email +email_deletion=UsuÅ„ adres e-mail email_deletion_desc=Adres e-mail i powiÄ…zane informacje zostanÄ… usuniÄ™te z Twojego konta. Commity za pomocÄ… tego adresu e-mail pozostanÄ… niezmienione. Kontynuować? email_deletion_success=Adres e-mail zostaÅ‚ usuniÄ™ty. theme_update_success=Twój motyw zostaÅ‚ zaktualizowany. @@ -747,7 +793,7 @@ theme_update_error=Wybrany motyw nie istnieje. openid_deletion=UsuÅ„ adres OpenID openid_deletion_desc=UsuniÄ™cie tego adresu OpenID z Twojego konta uniemożliwi Ci logowanie siÄ™ za jego pomocÄ…. Kontynuować? openid_deletion_success=Adres OpenID zostaÅ‚ usuniÄ™ty. -add_new_email=Dodaj nowy e-mail +add_new_email=Dodaj e-mail add_new_openid=Dodaj nowy URI OpenID add_email=Dodaj adres e-mail add_openid=Dodaj OpenID URI @@ -760,13 +806,13 @@ openid_desc=OpenID pozwala na delegowanie uwierzytelniania do zewnÄ™trznego oper manage_ssh_keys=ZarzÄ…dzaj kluczami SSH manage_gpg_keys=ZarzÄ…dzaj kluczami GPG add_key=Dodaj klucz -ssh_desc=Te publiczne klucze SSH sÄ… powiÄ…zane z Twoim kontem. OdpowiadajÄ…ce im klucze prywatne umożliwiajÄ… peÅ‚ny dostÄ™p do Twoich repozytoriów. -gpg_desc=Te publiczne klucze GPG sÄ… powiÄ…zane z Twoim kontem. Dbaj o bezpieczeÅ„stwo kluczy prywatnych, gdyż pozwalajÄ… one na weryfikacjÄ™ commitów. +ssh_desc=Te publiczne klucze SSH sÄ… powiÄ…zane z Twoim kontem. OdpowiadajÄ…ce im klucze prywatne umożliwiajÄ… peÅ‚ny dostÄ™p do Twoich repozytoriów. Klucze SSH, które zostaÅ‚y zweryfikowane mogÄ… zostać użyte do weryfikacji commitów podpisanych kluczem SSH. +gpg_desc=Te publiczne klucze GPG sÄ… powiÄ…zane z Twoim kontem i bÄ™dÄ… używane do weryfikacji twoich commitów. Dbaj o bezpieczeÅ„stwo kluczy prywatnych, gdyż pozwalajÄ… one na podpisywanie commitów. ssh_helper=Potrzebujesz pomocy? Sprawdź na GitHubie przewodnik generowania kluczy SSH lub rozwiÄ…zywanie typowych problemów z SSH. gpg_helper=Potrzebujesz pomocy? Przeczytaj na GitHubie poradnik na temat GPG. add_new_key=Dodaj klucz SSH add_new_gpg_key=Dodaj klucz GPG -key_content_gpg_placeholder=Zaczyna siÄ™ od '-----BEGIN PGP PUBLICZNEJ BLOKI KLUCZOWEJ PGP---' +key_content_gpg_placeholder=Zaczyna siÄ™ od "-----BEGIN PGP PUBLIC KEY BLOCK-----" ssh_key_been_used=Ten klucz SSH zostaÅ‚ już dodany do tego serwera. ssh_key_name_used=Klucz SSH z tÄ… nazwÄ… zostaÅ‚ już dodany do Twojego konta. ssh_principal_been_used=Ten klucz SSH zostaÅ‚ już dodany do tego serwera. @@ -783,7 +829,7 @@ gpg_token=Token gpg_token_help=Możesz wygenerować podpis za pomocÄ…: gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=Wzmocniony podpis GPG -key_signature_gpg_placeholder=Zaczyna siÄ™ od '-----BEGIN PGP SIGNATURE-----' +key_signature_gpg_placeholder=Zaczyna siÄ™ od "-----BEGIN PGP SIGNATURE-----" ssh_key_verified=Zweryfikowany klucz ssh_key_verified_long=Klucz zostaÅ‚ zweryfikowany tokenem i może być użyty do weryfikacji zmian pasujÄ…cych do wszystkich aktywowanych adresów e-mail tego użytkownika. ssh_key_verify=Weryfikuj @@ -791,7 +837,7 @@ ssh_token_required=Musisz podać podpis poniższego tokenu ssh_token=Token ssh_token_help=Możesz wygenerować podpis używajÄ…c: ssh_token_signature=Wzmocniony podpis SSH -key_signature_ssh_placeholder=Zaczyna siÄ™ od '-----BEGIN SSH SIGNATURE-----' +key_signature_ssh_placeholder=Zaczyna siÄ™ od "-----BEGIN SSH SIGNATURE-----" subkeys=Podklucze key_id=ID klucza key_name=Nazwa klucza @@ -821,10 +867,10 @@ ssh_externally_managed=Ten klucz SSH jest zarzÄ…dzany zewnÄ™trznie dla tego uży manage_social=ZarzÄ…dzaj powiÄ…zanymi kontami spoÅ‚ecznoÅ›ciowymi unbind=Rozłącz -manage_access_token=ZarzÄ…dzaj tokenami dostÄ™pu +manage_access_token=Tokeny dostÄ™pu generate_new_token=Wygeneruj nowy token tokens_desc=Te tokeny dostÄ™pu udzielajÄ… dostÄ™pu do Twojego konta za pomocÄ… API Forgejo. -token_name=Nazwa tokena +token_name=Nazwa tokenu generate_token=Wygeneruj token generate_token_success=Twój nowy token zostaÅ‚ wygenerowany. Skopiuj go teraz, gdyż nie zostanie ujawniony ponownie. generate_token_name_duplicate=%s istnieje już jako nazwa aplikacji. Użyj nowej. @@ -854,15 +900,15 @@ oauth2_application_create_description=Aplikacje OAuth2 umożliwiajÄ… Twojej apli authorized_oauth2_applications=Autoryzowane aplikacje OAuth2 revoke_key=OdwoÅ‚aj -revoke_oauth2_grant=OdwoÅ‚aj dostÄ™p +revoke_oauth2_grant=Zabierz dostÄ™p revoke_oauth2_grant_description=OdwoÅ‚anie dostÄ™pu dla tej aplikacji uniemożliwi jej korzystanie z Twoich danych. Czy jesteÅ› pewny(-a)? twofa_desc=Weryfikacja dwuskÅ‚adnikowa zwiÄ™ksza bezpieczeÅ„stwo Twojego konta. twofa_is_enrolled=Twoje konto ma obecnie włączoną autoryzacjÄ™ dwuetapowÄ…. twofa_not_enrolled=Twoje konto obecnie nie ma włączonej autoryzacji dwuetapowej. twofa_disable=Wyłącz weryfikacjÄ™ dwuetapowÄ… -twofa_scratch_token_regenerate=Wygeneruj ponownie kod jednorazowy -twofa_enroll=Włącz weryfikacjÄ™ dwuskÅ‚adnikowÄ… +twofa_scratch_token_regenerate=Ponownie wygeneruj jednorazowy kod odzyskiwania +twofa_enroll=Włącz weryfikacjÄ™ dwuetapowÄ… twofa_disable_note=W każdej chwili możesz wyłączyć weryfikacjÄ™ dwuskÅ‚adnikowÄ…. twofa_disable_desc=Wyłączenie weryfikacji dwuetapowej sprawi, że Twoje konto bÄ™dzie mniej bezpieczne. Kontynuować? regenerate_scratch_token_desc=JeÅ›li zgubiÅ‚eÅ›(-aÅ›) lub zużyÅ‚eÅ›(-aÅ›) swój kod jednorazowy, możesz go wygenerować ponownie tutaj. @@ -878,7 +924,7 @@ webauthn_register_key=Dodaj klucz bezpieczeÅ„stwa webauthn_delete_key=UsuÅ„ klucz bezpieczeÅ„stwa webauthn_delete_key_desc=Jeżeli usuniesz klucz bezpieczeÅ„stwa, utracisz możliwość zalogowania się z jego użyciem. Kontynuować? -manage_account_links=ZarzÄ…dzaj powiÄ…zanymi kontami +manage_account_links=PowiÄ…zane konta manage_account_links_desc=Te konta zewnÄ™trzne sÄ… powiÄ…zane z Twoim kontem Forgejo. account_links_not_available=Obecnie nie ma żadnych zewnÄ™trznych kont powiÄ…zanych z tym kontem Forgejo. link_account=Powiąż konto @@ -893,7 +939,7 @@ delete_account=UsuÅ„ swoje konto delete_prompt=Ta operacja permanentnie usunie Twoje konto użytkownika i jest NIEODWRACALNA. delete_with_all_comments=Twoje konto jest mÅ‚odsze niż %s. Aby uniknąć faÅ‚szywych komentarzy, wszystkie komentarze zgÅ‚oszenia/PR zostanÄ… z nim usuniÄ™te. confirm_delete_account=Potwierdź usuniÄ™cie -delete_account_title=UsuÅ„ swoje konto +delete_account_title=UsuÅ„ konto użytkownika delete_account_desc=Czy na pewno chcesz permanentnie usunąć to konto użytkownika? email_notifications.enable=Włącz powiadomienia e-mail @@ -918,6 +964,96 @@ comment_type_group_dependency = Zależność permissions_list = Uprawnienia: hints = Wskazówki change_password = ZmieÅ„ hasÅ‚o +visibility.public_tooltip = Widoczne dla wszystkich +comment_type_group_review_request = ProÅ›ba o recenzjÄ™ +comment_type_group_lock = Status blokady +comment_type_group_pull_request_push = Dodane commity +keep_activity_private = Ukryj aktywność ze strony profilu +oauth2_application_locked = Forgejo rejestruje zawczasu kilka aplikacji OAuth2 podczas rozruchu jeżeli włączono takÄ… opcjÄ™ w konfiguracji. By zapobiec nieoczekiwanym zachowaniom, nie mogÄ… one zostać ani edytowane, ani usuniÄ™te. ProszÄ™ odnieÅ› siÄ™ do dokumentacji OAuth2 po wiÄ™cej informacji. +oauth2_client_secret_hint = Sekret nie bÄ™dzie pokazany ponownie po opuszczeniu lub odÅ›wieżeniu tej strony. ProszÄ™ upewnij siÄ™, że zostaÅ‚ zapisany. +email_desc = Twój główny adres e-mail bÄ™dzie użyty dla powiadomieÅ„, odzyskiwania hasÅ‚a i, chyba że jest ukryty, operacji Git w przeglÄ…darce. +key_content_ssh_placeholder = Rozpoczyna siÄ™ z "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com", lub "sk-ssh-ed25519@openssh.com" +repo_and_org_access = DostÄ™p do Repozytoriów i Organizacji +revoke_oauth2_grant_success = DostÄ™p cofniÄ™ty pomyÅ›lnie. +update_language = ZmieÅ„ jÄ™zyk +keep_email_private_popup = Twój adres e-mail nie bÄ™dzie pokazywany na twoim profilu i nie bÄ™dzie używany jako domyÅ›lny dla commitów utworzonych przez interfejs przeglÄ…darki, takich jak wgrywanie plików, edycje, commity scalajÄ…ce. Zamiast tego, specjalny adres %s może zostać użyty do powiÄ…zania commitów z twoim kontem. Ta opcja nie wpÅ‚ywa na commity już istniejÄ…ce. +repos_none = Nie posiadasz żadnych repozytoriów. +verify_gpg_key_success = Klucz GPG "%s" zostaÅ‚ zweryfikowany. +email_notifications.andyourown = Dodaj swoje wÅ‚asne powiadomienia +user_block_success = Użytkownik zablokowany pomyÅ›lnie. +change_username_prompt = Uwaga: Zmiana nazwy użytkownika również zmienia URL konta. +change_username_redirect_prompt = Stara nazwa użytkownika bÄ™dzie przekierowywać dopóki ktoÅ› jej nie przejmie. +hidden_comment_types = Rodzaje ukrytych komentarzy +pronouns_unspecified = NieokreÅ›lone +additional_repo_units_hint = Proponuj włączenie dodatkowych jednostek repozytorium +webauthn_desc = Klucze bezpieczeÅ„stwa to urzÄ…dzenia zawierajÄ…ce klucze kryptograficzne. MogÄ… zostać użyte do uwierzytelniania dwuskÅ‚adnikowego. Klucze bezpieczeÅ„stwa muszÄ… wspierać standard WebAuthn Authenticator. +uploaded_avatar_is_too_big = Rozmiar wgranego pliku (%d KiB) przekraczana rozmiar maksymalny (%d KiB). +retype_new_password = Potwierdź nowe hasÅ‚o +can_not_add_email_activations_pending = Aktywacja w toku, spróbuj ponownie w ciÄ…gu kolejnych kilku minut jeżeli chcesz dodać nowy e-mail. +location_placeholder = Podziel siÄ™ swoim poÅ‚ożeniem z innymi +select_permissions = Wybierz uprawnienia +permissions_access_all = Wszystkie (publiczne, prywatne i ograniczone) +oauth2_application_remove_description = UsuniÄ™cie aplikacji OAuth2 uniemożliwi dostÄ™p autoryzowanych kont użytkowników na tej instancji. Kontynuować? +authorized_oauth2_applications_description = PrzyznaÅ‚eÅ›(-aÅ›) dostÄ™p do swojego osobistego konta Forgejo tym aplikacjom stron trzecich. ProszÄ™ cofnij dostÄ™p dla aplikacji których już nie używasz. +twofa_scratch_token_regenerated = Twój jednorazowy klucz odzyskiwania to %s. Przechowuj go w bezpiecznym miejscu, gdyż nie bÄ™dzie już pokazywany ponownie. +hooks.desc = Dodaj webhooki które bÄ™dÄ… aktywowane dla wszystkich repozytoriów których jesteÅ› wÅ‚aÅ›cicielem. +visibility.private_tooltip = Widoczne tylko dla czÅ‚onków organizacji do których dołączyÅ‚eÅ›(-aÅ›) +visibility.limited_tooltip = Widoczne tylko dla zalogowanych użytkowników +blocked_since = Zablokowany od %s +add_key_success = Klucz SSH "%s" zostaÅ‚ dodany. +add_gpg_key_success = Klucz GPG "%s" zostaÅ‚ dodany. +valid_until_date = Ważne do %s +user_unblock_success = Użytkownik odblokowany pomyÅ›lnie. +create_oauth2_application_success = PomyÅ›lnie utworzyÅ‚eÅ›(-aÅ›) aplikacjÄ™ OAuth2. +blocked_users = Zablokowani użytkownicy +biography_placeholder = Powiedz innym coÅ› o sobie! (Markdown jest wspierany) +additional_repo_units_hint_description = WyÅ›wietl wskazówkÄ™ "Włącz wiÄ™cej" dla repozytoriów które nie majÄ… włączonych wszystkich jednostek. +hidden_comment_types.ref_tooltip = Komentarze które odniosÅ‚y siÄ™ do zgÅ‚oszenia z innego zgÅ‚oszenia/commitu/… +hidden_comment_types.issue_ref_tooltip = Komentarze gdzie użytkowników zmieniÅ‚ gałąź/tag powiÄ…zany ze zgÅ‚oszeniem +comment_type_group_time_tracking = Åšledzenie czasu +comment_type_group_issue_ref = Odniesienie do zgÅ‚oszenia +ssh_invalid_token_signature = Zapewniony klucz SSH, sygnatura lub token nie zgadzajÄ… siÄ™ lub token jest przedawniony. +added_on = Dodane w %s +ssh_signonly = SSH jest obecnie wyłączone wiÄ™c te klucze używane sÄ… wyłącznie do weryfikacji podpisów commitów. +access_token_deletion_desc = UsuniÄ™cie tokenu cofnie dostÄ™p do twojego konta aplikacjom które z niego korzystajÄ…. Ta operacja nie może zostać cofniÄ™ta. Kontynuować? +permissions_public_only = Wyłącznie publiczne +permission_no_access = Brak dostÄ™pu +permission_write = Odczyt i zapis +at_least_one_permission = Musisz wybrać przynajmniej jedno uprawnienie by utworzyć token +update_oauth2_application_success = PomyÅ›lnie zaktualizowaÅ‚eÅ›(-aÅ›) aplikacjÄ™ OAuth2. +oauth2_confidential_client = Poufny klient. Zaznacz dla aplikacji które korzystajÄ… z ukrytego sekretu, na przykÅ‚ad aplikacji przeglÄ…darkowych. Nie zaznaczaj dla aplikacji natywnych, w tym aplikacji mobilnych. +oauth2_redirect_uris = Przekierowania URI. ProszÄ™ użyj osobnej linii dla każdego URI. +blocked_users_none = Brak zablokowanych użytkowników. +update_user_avatar_success = Awatar użytkownika zostaÅ‚ zaktualizowany. +access_token_desc = Wybrane uprawnienia tokenu ograniczajÄ… autoryzacjÄ™ tylko dla nastÄ™pujÄ…cych Å›cieżek API. WiÄ™cej szczegółów znajdziesz w dokumentacji . +profile_desc = O tobie +pronouns = Zaimki +pronouns_custom = WÅ‚asne +saved_successfully = Twoje ustawienia zostaÅ‚y zapisane pomyÅ›lnie. +keep_activity_private.description = Twoja aktywność publiczna bÄ™dzie widoczna tylko dla ciebie i administratorów tej instancji. +add_email_confirmation_sent = E-mail z potwierdzeniem zostaÅ‚ wysÅ‚any do "%s". By potwierdzić swój adres e-mail, proszÄ™ sprawdź swojÄ… skrzynkÄ™ odbiorczÄ… i odwiedź dostarczony link w ciÄ…gu %s. +verify_ssh_key_success = Klucz SSH "%s" zostaÅ‚ zweryfikowany. +twofa_recovery_tip = Jeżeli zgubisz swoje urzÄ…dzenie, bÄ™dziesz mógÅ‚ użyć jednorazowego klucza odzyskiwania by odzyskać dostÄ™p do swojego konta. +webauthn_key_loss_warning = Jeżeli zgubisz swoje klucze bezpieczeÅ„stwa, utracisz dostÄ™p do swojego konta. +webauthn_alternative_tip = Możesz skonfigurować dodatkowÄ… metodÄ™ uwierzytelniania. +user_block_yourself = Nie możesz zablokować siebie. +pronouns_custom_label = WÅ‚asne zaimki +update_language_not_found = JÄ™zyk "%s" nie jest dostÄ™pny. +language.title = DomyÅ›lny jÄ™zyk +language.localization_project = Pomóż nam przetÅ‚umaczyć Forgejo na twój jÄ™zyk! Dowiedz siÄ™ wiÄ™cej. +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. +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. +add_new_principal = Dodaj podmiot +manage_ssh_principals = ZarzÄ…dzaj podmiotami certyfikatu SSH +principal_state_desc = Ten podmiot nie byÅ‚ używany w ciÄ…gu ostatnich 7 dni +add_principal_success = Podmiot certyfikatu SSH "%s" zostaÅ‚ dodany. +keep_pronouns_private = WyÅ›wietlaj zaimki tylko uwierzytelnionym użytkownikom +keep_pronouns_private.description = Spowoduje to ukrycie zaimków przed odwiedzajÄ…cymi, którzy nie sÄ… zalogowani. [repo] owner=WÅ‚aÅ›ciciel @@ -932,7 +1068,7 @@ template_description=Szablony repozytoriów pozwalajÄ… użytkownikom generować visibility=Widoczność visibility_description=Tylko wÅ‚aÅ›ciciel lub czÅ‚onkowie organizacji, jeÅ›li majÄ… odpowiednie uprawnienia, bÄ™dÄ… mogli to zobaczyć. visibility_helper_forced=Administrator strony wymaga, aby nowe repozytoria byÅ‚y prywatne. -visibility_fork_helper=(Zmiana tej wartoÅ›ci wpÅ‚ynie na wszystkie forki.) +visibility_fork_helper=(Zmiana tej wartoÅ›ci wpÅ‚ynie na widoczność wszystkich forków.) clone_helper=Potrzebujesz pomocy z klonowaniem? Odwiedź pomoc. fork_repo=Forkuj repozytorium fork_from=Forkuj z @@ -942,31 +1078,31 @@ clone_in_vsc=Klonuj w VS Code download_zip=Pobierz ZIP download_tar=Pobierz TAR.GZ download_bundle=Pobierz BUNDLE -generate_repo=Generuj repozytorium -generate_from=Generuj z +generate_repo=Wygeneruj repozytorium +generate_from=Wygeneruj z repo_desc=Opis repo_desc_helper=Wprowadź krótki opis (opcjonalnie) repo_lang=JÄ™zyk -repo_gitignore_helper=Wybierz szablony pliku .gitignore. -issue_labels=Etykiety zgÅ‚oszenia +repo_gitignore_helper=Wybierz szablony pliku .gitignore +issue_labels=Etykiety issue_labels_helper=Wybierz zestaw etykiet zgÅ‚oszeÅ„ license=Licencja license_helper=Wybierz plik licencji -license_helper_desc=Licencja reguluje co inni mogÄ… a czego nie mogÄ… zrobić z Twoim kodem. Nie jesteÅ› pewien, która licencja jest wÅ‚aÅ›ciwa dla Twojego projektu? Zobacz Wybór licencji. +license_helper_desc=Licencja reguluje co inni mogÄ… a czego nie mogÄ… zrobić z Twoim kodem. Nie jesteÅ› pewien(-na), która licencja jest wÅ‚aÅ›ciwa dla Twojego projektu? Zobacz Wybór licencji. readme=README readme_helper=Wybierz szablon pliku README readme_helper_desc=To jest miejsce, w którym możesz napisać peÅ‚ny opis swojego projektu. -auto_init=Inicjalizuj repozytorium (dodaje .gitignore, licencjÄ™ i README) +auto_init=Inicjalizuj repozytorium trust_model_helper_default=DomyÅ›lnie: Użyj domyÅ›lnego modelu zaufania dla tej instalacji create_repo=Utwórz repozytorium -default_branch=DomyÅ›lna gałąź +default_branch=DomyÅ›lny branch default_branch_helper=DomyÅ›lny branch jest podstawowym branch'em dla pull requestów i commit'ów kodu. mirror_prune=Wyczyść mirror_prune_desc=UsuÅ„ przestarzaÅ‚e odwoÅ‚ania do zdalnych Å›ledzeÅ„ mirror_interval_invalid=InterwaÅ‚ lustrzanej kopii jest niepoprawny. mirror_address=Sklonuj z adresu URL mirror_lfs=Duże przechowywanie plików (LFS) -mirror_lfs_endpoint=Punkt koÅ„cowy LFS +mirror_lfs_endpoint=Endpoint LFS mirror_lfs_endpoint_desc=Synchronizacja spróbuje użyć adresu URL klonowania, aby okreÅ›lić serwer LFS. Możesz również okreÅ›lić niestandardowy punkt koÅ„cowy, jeÅ›li dane repozytorium LFS sÄ… przechowywane gdzieÅ› indziej. mirror_last_synced=Ostatnio zsynchronizowano mirror_password_placeholder=(Nie zmieniono) @@ -1001,7 +1137,7 @@ desc.internal=WewnÄ™trzny desc.archived=Zarchiwizowane template.items=Elementy szablonu -template.git_content=Zawartość gita (domyÅ›lna gałąź) +template.git_content=Zawartość gita (DomyÅ›lna gałąź) template.git_hooks=Hooki Git template.webhooks=Webhooki template.topics=Tematy @@ -1011,7 +1147,7 @@ template.one_item=Musisz wybrać co najmniej jeden element szablonu template.invalid=Musisz wybrać repozytorium dla szablonu archive.issue.nocomment=To repozytorium jest zarchiwizowane. Nie możesz komentować zgÅ‚oszeÅ„. -archive.pull.nocomment=To repozytorium jest zarchiwizowane. Nie możesz komentować Pull Requestów. +archive.pull.nocomment=To repozytorium jest zarchiwizowane. Nie możesz komentować pull requestów. form.reach_limit_of_creation_1=OsiÄ…gnÄ…Å‚eÅ› już limit %d repozytorium. form.reach_limit_of_creation_n=OsiÄ…gnÄ…Å‚eÅ› już limit %d repozytoriów. @@ -1023,33 +1159,33 @@ migrate_options_lfs=Migruj pliki LFS migrate_options_lfs_endpoint.label=Punkt koÅ„cowy LFS migrate_options_lfs_endpoint.description=Migracja spróbuje użyć Git remote, aby okreÅ›lić serwer LFS. Możesz również okreÅ›lić niestandardowy punkt koÅ„cowy, jeÅ›li dane repozytorium LFS sÄ… przechowywane gdzieÅ› indziej. migrate_options_lfs_endpoint.description.local=ObsÅ‚ugiwana jest również lokalna Å›cieżka serwera. -migrate_items=SkÅ‚adniki migracji +migrate_items=Elementy migracji migrate_items_wiki=Wiki migrate_items_milestones=Kamienie milowe migrate_items_labels=Etykiety migrate_items_issues=ZgÅ‚oszenia -migrate_items_pullrequests=Pull Requesty -migrate_items_merge_requests=Merge Requests +migrate_items_pullrequests=Pull requesty +migrate_items_merge_requests=Requesty scalajÄ…ce migrate_items_releases=Wydania -migrate_repo=PrzenieÅ› repozytorium -migrate.clone_address=Migruj/klonuj z adresu URL +migrate_repo=Migruj repozytorium +migrate.clone_address=Migruj / Klonuj z adresu URL migrate.clone_address_desc=Adres HTTP(S) lub "klona" Gita istniejÄ…cego repozytorium migrate.clone_local_path=lub Å›cieżka lokalnego serwera migrate.permission_denied=Nie możesz importować lokalnych repozytoriów. migrate.permission_denied_blocked=Nie możesz importować z niedozwolonych hostów, poproÅ› administratora o sprawdzenie ustawieÅ„ ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS. migrate.invalid_lfs_endpoint=Punkt koÅ„cowy LFS jest nieprawidÅ‚owy. migrate.failed=Migracja nie powiodÅ‚a siÄ™: %v -migrate.migrate_items_options=Token dostÄ™pu jest wymagany, aby zmigrować dodatkowe elementy +migrate.migrate_items_options=Token dostÄ™pu jest wymagany, aby migrować dodatkowe elementy migrated_from=Zmigrowane z %[2]s -migrated_from_fake=Zmigrowane z %[1]s +migrated_from_fake=Migrowane z %[1]s migrate.migrate=Migracja z %s migrate.migrating=Migrowanie z %s... migrate.migrating_failed=Migrowanie z %s nie powiodÅ‚o siÄ™. migrate.migrating_failed_no_addr=Migracja nie powiodÅ‚a siÄ™. -migrate.github.description=Migracja danych z github.com lub innych instancji GitHub. +migrate.github.description=Migracja danych z github.com lub serwerów Github Enterprise. migrate.git.description=Migracja repozytorium tylko z dowolnej usÅ‚ugi Git. migrate.gitlab.description=Migruj dane z gitlab.com lub innych instancji GitLab. -migrate.gitea.description=Migruj dane z gitea.com lub innych instancji Gitea/Forgejo. +migrate.gitea.description=Migruj dane z gitea.com lub innych instancji Gitea. migrate.gogs.description=Migracja danych z notabug.org lub innych instancji Gogs. migrate.onedev.description=Migracja danych z code.onedev.io lub innych instancji OneDev. migrate.codebase.description=Migracja danych z codebasehq.com. @@ -1059,8 +1195,8 @@ migrate.migrating_topics=Migracja tematów migrate.migrating_milestones=Migracja kamieni milowych migrate.migrating_labels=Migracja etykiet migrate.migrating_releases=Migracja wydaÅ„ -migrate.migrating_issues=Migracja problemów -migrate.migrating_pulls=Migracja Pull Requestów +migrate.migrating_issues=Migracja zgÅ‚oszeÅ„ +migrate.migrating_pulls=Migracja pull requestów mirror_from=kopia lustrzana forked_from=sforkowany z @@ -1077,7 +1213,7 @@ fork=Forkuj download_archive=Pobierz repozytorium no_desc=Brak opisu -quick_guide=Skrócona instrukcja +quick_guide=Szybki przewodnik clone_this_repo=Klonuj repozytorium create_new_repo_command=Tworzenie nowego repozytorium z linii poleceÅ„ push_exist_repo=Wypychanie istniejÄ…cego repozytorium z linii poleceÅ„ @@ -1093,7 +1229,7 @@ find_tag=Znajdź tag branches=Gałęzie tags=Tagi issues=ZgÅ‚oszenia -pulls=OczekujÄ…ce zmiany +pulls=Pull requesty project_board=Projekty labels=Etykiety org_labels_desc=Etykiety organizacji, które mogÄ… być używane z wszystkimi repozytoriami w tej organizacji @@ -1109,9 +1245,9 @@ released_this=wydaÅ‚ to file.title=%s w %s file_raw=Czysty file_history=Historia -file_view_source=Zobacz ŹródÅ‚o +file_view_source=Zobacz źródÅ‚o file_view_rendered=WyÅ›wietl renderowane -file_view_raw=Zobacz czysty +file_view_raw=Zobacz nieprzetworzony file_permalink=BezpoÅ›redni odnoÅ›nik file_too_large=Ten plik jest zbyt duży, aby go wyÅ›wietlić. @@ -1119,10 +1255,11 @@ file_copy_permalink=Kopiuj bezpoÅ›redni odnoÅ›nik video_not_supported_in_browser=Twoja przeglÄ…darka nie obsÅ‚uguje znacznika HTML5 "video". audio_not_supported_in_browser=Twoja przeglÄ…darka nie obsÅ‚uguje znacznika HTML5 "audio". stored_lfs=Przechowane za pomocÄ… Git LFS +stored_annex=Przechowane za pomocÄ… Git Annex symbolic_link=DowiÄ…zanie symboliczne commit_graph=Wykres commitów commit_graph.select=Wybierz gałęzie -commit_graph.hide_pr_refs=Ukryj Pull Requesty +commit_graph.hide_pr_refs=Ukryj pull requesty commit_graph.monochrome=Monochromatyczny commit_graph.color=Kolor blame=Wina @@ -1136,6 +1273,7 @@ editor.upload_file=WyÅ›lij plik editor.edit_file=Edytuj plik editor.preview_changes=PodglÄ…d zmian editor.cannot_edit_lfs_files=Pliki LFS nie mogÄ… być edytowane poprzez interfejs przeglÄ…darkowy. +editor.cannot_edit_annex_files=Pliki Annex nie mogÄ… być edytowane poprzez interfejs przeglÄ…darkowy. editor.cannot_edit_non_text_files=Pliki binarne nie mogÄ… być edytowane poprzez interfejs przeglÄ…darkowy. editor.edit_this_file=Edytuj plik editor.this_file_locked=Plik jest zablokowany @@ -1144,14 +1282,14 @@ editor.fork_before_edit=Musisz sforkować to repozytorium, aby nanieść lub zap editor.delete_this_file=UsuÅ„ plik editor.must_have_write_access=Musisz mieć uprawnienia do zapisu, aby nanieść lub zaproponować zmiany tego pliku. editor.name_your_file=Nazwij plik… -editor.filename_help=Utwórz katalog, poprzez wpisanie jego nazwy i dodanie ukoÅ›nika ('/'). UsuÅ„ katalog, wciskajÄ…c klawisz Backspace na poczÄ…tku pola tekstowego. +editor.filename_help=Utwórz katalog, poprzez wpisanie jego nazwy i dodanie ukoÅ›nika ("/"). UsuÅ„ katalog, wciskajÄ…c klawisz Backspace na poczÄ…tku pola tekstowego. editor.or=lub editor.cancel_lower=Anuluj editor.commit_signed_changes=Zatwierdź podpisane zmiany editor.commit_changes=Zatwierdź zmiany -editor.add_tmpl=Dodanie '' +editor.add_tmpl=Dodanie '<%s>' editor.commit_message_desc=Dodaj dodatkowy rozszerzony opis… -editor.commit_directly_to_this_branch=Zmieniaj bezpoÅ›rednio gałąź %s. +editor.commit_directly_to_this_branch=Zmieniaj bezpoÅ›rednio gałąź %[1]s. editor.create_new_branch=Stwórz nowÄ… gałąź dla tego commita i rozpocznij Pull Request. editor.create_new_branch_np=Stwórz nowÄ… gałąź dla tego commita. editor.propose_file_change=Zaproponuj zmiany w pliku @@ -1204,10 +1342,10 @@ projects.edit=Edytuj projekty projects.edit_subheader=Cele pozwalajÄ… na organizacjÄ™ zgÅ‚oszeÅ„ i Å›ledzenie postÄ™pów. projects.modify=Zaktualizuj projekt projects.type.none=Brak -projects.type.basic_kanban=Basic Kanban -projects.type.bug_triage=Bug Triage -projects.template.desc=Szablon projektu -projects.template.desc_helper=Wybierz szablon projektu do rozpoczÄ™cia +projects.type.basic_kanban=Podstawowy kanban +projects.type.bug_triage=Segregacja bugów +projects.template.desc=Szablon +projects.template.desc_helper=Wybierz szablon projektu by rozpocząć projects.type.uncategorized=Bez kategorii projects.column.edit_title=Nazwa projects.column.new_title=Nazwa @@ -1224,12 +1362,12 @@ issues.filter_reviewers=Filtruj recenzentów issues.new=Nowe zgÅ‚oszenie issues.new.title_empty=TytuÅ‚ nie może być pusty issues.new.labels=Etykiety -issues.new.no_label=Brak etykiety +issues.new.no_label=Brak etykiet issues.new.clear_labels=Wyczyść etykiety issues.new.projects=Projekty issues.new.clear_projects=Wyczyść projekty issues.new.no_projects=Brak projektu -issues.new.open_projects=Otwórz projekty +issues.new.open_projects=Otwarte projekty issues.new.closed_projects=ZamkniÄ™te projekty issues.new.no_items=Brak elementów issues.new.milestone=KamieÅ„ milowy @@ -1245,7 +1383,7 @@ issues.choose.get_started=Rozpocznij issues.choose.open_external_link=Otwórz issues.choose.blank=DomyÅ›lny issues.choose.blank_about=Utwórz problem z domyÅ›lnego szablonu. -issues.no_ref=Nie okreÅ›lono gałęzi/etykiety +issues.no_ref=Nie okreÅ›lono Gałęzi/Etykiety issues.create=Utwórz zgÅ‚oszenie issues.new_label=Nowa etykieta issues.new_label_placeholder=Nazwa etykiety @@ -1320,17 +1458,17 @@ issues.context.copy_link=Skopiuj link issues.context.quote_reply=Cytuj odpowiedź issues.context.edit=Edytuj issues.context.delete=UsuÅ„ -issues.close_comment_issue=Skomentuj i zamknij +issues.close_comment_issue=Zamknij z komentarzem issues.reopen_issue=Otwórz ponownie -issues.reopen_comment_issue=Skomentuj i otwórz ponownie +issues.reopen_comment_issue=Otwórz ponownie z komentarzem issues.create_comment=Skomentuj issues.closed_at=`zamknÄ…Å‚(-ęła) to zgÅ‚oszenie %[2]s` issues.reopened_at=`otworzyÅ‚(-a) ponownie to zgÅ‚oszenie %[2]s` issues.commit_ref_at=`wspomniaÅ‚(-a) to zgÅ‚oszenie z commita %[2]s` issues.ref_issue_from=`odwoÅ‚aÅ‚(-a) siÄ™ do tego zgÅ‚oszenia %[4]s %[2]s` issues.ref_pull_from=`odwoÅ‚aÅ‚(-a) siÄ™ do tego Pull Requesta %[4]s %[2]s` -issues.ref_closing_from=`odwoÅ‚aÅ‚(-a) siÄ™ do Pull Requesta %[4]s, który zamknie to zgÅ‚oszenie %[2]s` -issues.ref_reopening_from=`odwoÅ‚aÅ‚(-a) siÄ™ do Pull Requesta %[4]s, który otworzy na nowo to zgÅ‚oszenie %[2]s` +issues.ref_closing_from=`odwoÅ‚aÅ‚(-a) siÄ™ do pull requesta %[4]s, który zamknie to zgÅ‚oszenie %[2]s` +issues.ref_reopening_from=`odwoÅ‚aÅ‚(-a) siÄ™ z pull requesta %[4]s, który otworzy na nowo to zgÅ‚oszenie %[2]s` issues.ref_closed_from=`zamknÄ…Å‚(-ęła) to zgÅ‚oszenie %[4]s %[2]s` issues.ref_reopened_from=`ponownie otworzyÅ‚(-a) to zgÅ‚oszenie %[4]s %[2]s` issues.ref_from=`z %[1]s` @@ -1368,12 +1506,12 @@ issues.unlock=Odblokuj konwersacjÄ™ issues.lock.unknown_reason=Nie można zablokować zagadnienia bez żadnego powodu. issues.lock_duplicate=Zagadnienie nie może być zablokowane ponownie. issues.unlock_error=Nie można odblokować zagadnienia, które nie jest zablokowane. -issues.lock_with_reason=zablokowano jako %s i ograniczono konwersacjÄ™ do współtwórców %s -issues.lock_no_reason=zablokowano i ograniczono konwersacjÄ™ do współtwórców %s +issues.lock_with_reason=zablokowano jako %s i ograniczono konwersacjÄ™ do współpracowników %s +issues.lock_no_reason=zablokowano i ograniczono konwersacjÄ™ do współpracowników %s issues.unlock_comment=odblokowano tÄ™ konwersacjÄ™ %s issues.lock_confirm=Zablokuj issues.unlock_confirm=Odblokuj -issues.lock.notice_1=- Inni użytkownicy nie mogÄ… dodawać nowych komentarzy do tego zagadnienia. +issues.lock.notice_1=- Inni użytkownicy nie mogÄ… dodawać nowych komentarzy do tego zgÅ‚oszenia. issues.lock.notice_2=- Ty i inni współtwórcy z dostÄ™pem do tego repozytorium możecie dalej pozostawiać komentarze dla innych. issues.lock.notice_3=- Możesz zawsze odblokować to zagadnienie w przyszÅ‚oÅ›ci. issues.unlock.notice_1=- Wszyscy bÄ™dÄ… mogli ponownie umieszczać komentarze w tym zagadnieniu. @@ -1432,7 +1570,7 @@ issues.dependency.blocked_by_short=Zależy od issues.dependency.remove_header=UsuÅ„ zależność issues.dependency.issue_remove_text=Usunie to zależność z tego zgÅ‚oszenia. Kontynuować? issues.dependency.pr_remove_text=Usunie to tÄ™ zależność z tego Pull Requesta. Kontynuować? -issues.dependency.setting=Włącz zależnoÅ›ci dla zgÅ‚oszeÅ„ i Pull Requestów +issues.dependency.setting=Włącz zależnoÅ›ci dla zgÅ‚oszeÅ„ i pull requestów issues.dependency.add_error_same_issue=ZgÅ‚oszenie nie może być zależne od siebie samego. issues.dependency.add_error_dep_issue_not_exist=ZgÅ‚oszenie zależne nie istnieje. issues.dependency.add_error_dep_not_exist=Zależność nie istnieje. @@ -1471,8 +1609,8 @@ compare.compare_base=baza compare.compare_head=porównaj pulls.desc=Włącz Pull Requesty i recenzjonowanie kodu. -pulls.new=Nowy Pull Request -pulls.compare_changes=Nowy Pull Request +pulls.new=Nowy pull request +pulls.compare_changes=Nowy pull request pulls.compare_changes_desc=Wybierz gałąź, do której chcesz scalić oraz gałąź, z której pobrać zmiany. pulls.compare_base=scal do pulls.compare_compare=Å›ciÄ…gnij z @@ -1480,8 +1618,8 @@ pulls.filter_branch=Filtruj branch pulls.no_results=Nie znaleziono wyników. pulls.nothing_to_compare=Te gałęzie sÄ… sobie równe. Nie ma potrzeby tworzyć Pull Requesta. pulls.nothing_to_compare_and_allow_empty_pr=Te gałęzie sÄ… równe. Ten PR bÄ™dzie pusty. -pulls.create=Utwórz Pull Request -pulls.title_desc_few=chce scalić %[1]d commity/ów z %[2]s do %[3]s +pulls.create=Utwórz pull request +pulls.title_desc_few=chce scalić %[1]d commity/ów z %[2]s do %[3]s pulls.merged_title_desc_few=scala %[1]d commity/ów z %[2]s do %[3]s %[4]s pulls.change_target_branch_at=`zmienia gałąź docelowÄ… z %s na %s %s` pulls.tab_conversation=Dyskusja @@ -1505,7 +1643,7 @@ pulls.required_status_check_administrator=Jako administrator, możesz wciąż sc pulls.can_auto_merge_desc=Ten Pull Request może być automatycznie scalony. pulls.cannot_auto_merge_desc=Ten Pull Request nie może być automatycznie scalony z powodu konfliktów. pulls.cannot_auto_merge_helper=Scal rÄ™cznie, aby rozwiÄ…zać konflikty. -pulls.num_conflicting_files_1=%d plików zawierajÄ…cych konflikty +pulls.num_conflicting_files_1=%d plik zawierajÄ…cych konflikty pulls.num_conflicting_files_n=%d plików zawierajÄ…cych konflikty pulls.approve_count_1=%d zatwierdzenie pulls.approve_count_n=%d zatwierdzeÅ„ @@ -1567,7 +1705,7 @@ milestones.invalid_due_date_format=Format daty realizacji musi mieć wartość ' milestones.edit=Edytuj kamieÅ„ milowy milestones.edit_subheader=Cele pozwalajÄ… zorganizować zagadnienia i Å›ledzić postÄ™py. milestones.cancel=Anuluj -milestones.modify=Zaktualizuj cel +milestones.modify=Zaktualizuj kamieÅ„ milowy milestones.deletion=UsuÅ„ kamieÅ„ milowy milestones.deletion_desc=UsuniÄ™cie celu usuwa go z wszystkich pozostaÅ‚ych zagadnieÅ„. Kontynuować? milestones.deletion_success=Cel zostaÅ‚ usuniÄ™ty. @@ -1593,7 +1731,7 @@ wiki.last_commit_info=%s edytuje tÄ™ stronÄ™ %s wiki.edit_page_button=Edytuj wiki.new_page_button=Nowa strona wiki.file_revision=Wersja strony -wiki.wiki_page_revisions=Wersje stron wiki +wiki.wiki_page_revisions=Wersje strony wiki.back_to_wiki=Powrót do strony wiki wiki.delete_page_button=UsuÅ„ stronÄ™ wiki.page_already_exists=Strona Wiki o tej samej nazwie już istnieje. @@ -1610,39 +1748,39 @@ activity.period.quarterly=3 miesiÄ…ce activity.period.semiyearly=6 miesiÄ™cy activity.period.yearly=1 rok activity.overview=PrzeglÄ…d -activity.active_prs_count_1=%d aktywny Pull Request -activity.active_prs_count_n=%d aktywne Pull Requesty -activity.merged_prs_count_1=Scalono Pull Request -activity.merged_prs_count_n=Scalone Pull Requesty -activity.opened_prs_count_1=Proponowany Pull Request -activity.opened_prs_count_n=Proponowane Pull Requesty +activity.active_prs_count_1=%d aktywny pull request +activity.active_prs_count_n=%d aktywne pull requesty +activity.merged_prs_count_1=Scalono pull request +activity.merged_prs_count_n=Scalone pull requesty +activity.opened_prs_count_1=Proponowany pull request +activity.opened_prs_count_n=Proponowane pull requesty activity.title.user_1=%d użytkownik activity.title.user_n=%d użytkowników -activity.title.prs_1=%d Pull Request -activity.title.prs_n=%d Pull Requesty +activity.title.prs_1=%d pull request +activity.title.prs_n=%d pull requesty activity.title.prs_merged_by=%s zmergowane przez %s activity.title.prs_opened_by=%s zaproponowane przez %s activity.merged_prs_label=Scalone activity.opened_prs_label=Proponowane -activity.active_issues_count_1=%d Aktywne zgÅ‚oszenia -activity.active_issues_count_n=%d Aktywnych zgÅ‚oszeÅ„ +activity.active_issues_count_1=%d aktywne zgÅ‚oszenie +activity.active_issues_count_n=%d aktywne zgÅ‚oszenia activity.closed_issues_count_1=ZamkniÄ™te zgÅ‚oszenie activity.closed_issues_count_n=ZamkniÄ™te zgÅ‚oszenia -activity.title.issues_1=%d ZgÅ‚oszenie -activity.title.issues_n=%d ZgÅ‚oszenia +activity.title.issues_1=%d zgÅ‚oszenie +activity.title.issues_n=%d zgÅ‚oszenia activity.title.issues_created_by=%s utworzone przez %s activity.closed_issue_label=ZamkniÄ™ty activity.new_issues_count_1=Nowe zgÅ‚oszenie activity.new_issues_count_n=Nowe zgÅ‚oszenia activity.new_issue_label=Otwarte -activity.title.unresolved_conv_1=%d NierozstrzygniÄ™ta dyskusja -activity.title.unresolved_conv_n=%d NierozstrzygniÄ™tych dyskusji +activity.title.unresolved_conv_1=%d nierozstrzygniÄ™ta dyskusja +activity.title.unresolved_conv_n=%d nierozstrzygniÄ™tych dyskusji activity.unresolved_conv_desc=Te niedawno zmienione zagadnienia i Pull Requesty nie zostaÅ‚y jeszcze rozwiÄ…zane. activity.unresolved_conv_label=Otwarte -activity.title.releases_1=%d Wydanie -activity.title.releases_n=%d WydaÅ„ +activity.title.releases_1=%d wydanie +activity.title.releases_n=%d wydania activity.title.releases_published_by=%s opublikowane przez %s -activity.published_release_label=Opublikowane +activity.published_release_label=Wydanie activity.no_git_activity=Nie byÅ‚o żadnej aktywnoÅ›ci w tym okresie czasu. activity.git_stats_exclude_merges=WykluczajÄ…c scalenia, activity.git_stats_author_1=%d autor @@ -1686,7 +1824,7 @@ settings.collaboration.undefined=Niezdefiniowany settings.hooks=Webhooki settings.githooks=Hooki Git settings.basic_settings=Ustawienia podstawowe -settings.mirror_settings=Kopia lustrzana ustawieÅ„ +settings.mirror_settings=Ustawienia kopii lustrzanej settings.mirror_settings.mirrored_repository=Repozytorium lustrzane settings.mirror_settings.direction=Kierunek settings.mirror_settings.direction.pull=Pull @@ -1697,30 +1835,30 @@ settings.mirror_settings.push_mirror.remote_url=Adres URL zdalnego repozytorium settings.sync_mirror=Synchronizuj teraz settings.site=Strona -settings.update_settings=Aktualizuj ustawienia +settings.update_settings=Zapisz ustawienia settings.branches.update_default_branch=Aktualizuj domyÅ›lnÄ… gałąź settings.advanced_settings=Ustawienia zaawansowane settings.wiki_desc=Włącz wiki repozytorium settings.use_internal_wiki=Użyj wbudowanego wiki settings.use_external_wiki=Użyj zewnÄ™trznego wiki -settings.external_wiki_url=Adres URL zewnÄ™trznego Wiki +settings.external_wiki_url=Adres URL zewnÄ™trznego wiki settings.external_wiki_url_error=URL zewnÄ™trznego wiki nie jest prawidÅ‚owym adresem URL. settings.external_wiki_url_desc=OdwiedzajÄ…cy sÄ… przekierowywani do zewnÄ™trznego adresu URL wiki po klikniÄ™ciu w zakÅ‚adkÄ™ wiki. -settings.issues_desc=Włącz Å›ledzenie zgÅ‚oszeÅ„ w repozytorium -settings.use_internal_issue_tracker=Użyj wbudowanego Å›ledzenia zgÅ‚oszeÅ„ -settings.use_external_issue_tracker=Użyj zewnÄ™trznego Å›ledzenia zgÅ‚oszeÅ„ -settings.external_tracker_url=URL zewnÄ™trznego systemu Å›ledzenia zgÅ‚oszeÅ„ +settings.issues_desc=Włącz dziennik zgÅ‚oszeÅ„ w repozytorium +settings.use_internal_issue_tracker=Użyj wbudowanego dziennika zgÅ‚oszeÅ„ +settings.use_external_issue_tracker=Użyj zewnÄ™trznego dziennika zgÅ‚oszeÅ„ +settings.external_tracker_url=URL zewnÄ™trznego dziennika zgÅ‚oszeÅ„ settings.external_tracker_url_error=Adres URL zewnÄ™trznego Å›ledzenia zgÅ‚oszeÅ„ nie jest poprawnym adresem URL. settings.external_tracker_url_desc=OdwiedzajÄ…cy sÄ… przekierowywani do adresu URL zewnÄ™trznego systemu Å›ledzenia zgÅ‚oszeÅ„ po klikniÄ™ciu w zakÅ‚adkÄ™ zgÅ‚oszeÅ„. -settings.tracker_url_format=Format adresu URL zewnÄ™trznego systemu Å›ledzenia zgÅ‚oszeÅ„ +settings.tracker_url_format=Format adresu URL zewnÄ™trznego dziennika zgÅ‚oszeÅ„ settings.tracker_url_format_error=Adres URL zewnÄ™trznego systemu Å›ledzenia zgÅ‚oszeÅ„ nie jest poprawnym adresem URL. -settings.tracker_issue_style=Format numerowania dla zewnÄ™trznego systemu Å›ledzenia zgÅ‚oszeÅ„ +settings.tracker_issue_style=Format numerowania dla zewnÄ™trznego dziennika zgÅ‚oszeÅ„ settings.tracker_issue_style.numeric=Numeryczny settings.tracker_issue_style.alphanumeric=Alfanumeryczne settings.tracker_url_format_desc=Użyj zamienników {user}, {repo} i {index} dla nazwy użytkownika, nazwy repozytorium i numeru porzÄ…dkowego zgÅ‚oszenia. settings.enable_timetracker=Włącz Å›ledzenie czasu settings.allow_only_contributors_to_track_time=Zezwalaj wyłącznie współpracownikom na Å›ledzenie czasu -settings.pulls_desc=Włącz Pull Requesty w repozytorium +settings.pulls_desc=Włącz pull requesty w repozytorium settings.pulls.ignore_whitespace=Ignoruj znaki biaÅ‚e w konfliktach settings.projects_desc=Włącz projekty w repozytorium settings.admin_settings=Ustawienia administratora @@ -1765,7 +1903,7 @@ settings.trust_model.committer.long=Committer: Ufaj podpisom zgodnym z committer settings.wiki_delete=UsuÅ„ dane Wiki settings.wiki_delete_desc=UsuniÄ™cie danych wiki jest nieodwracalne. settings.wiki_delete_notices_1=- Ta operacja usunie i wyłączy wiki repozytorium %s. -settings.confirm_wiki_delete=UsuÅ„ dane Wiki +settings.confirm_wiki_delete=UsuÅ„ dane wiki settings.wiki_deletion_success=Dane wiki repozytorium zostaÅ‚y usuniÄ™te. settings.delete=UsuÅ„ to repozytorium settings.delete_desc=UsuniÄ™cie repozytorium jest trwaÅ‚e i nieodwracalne. @@ -1775,7 +1913,7 @@ settings.delete_notices_fork_1=- Forki tego repozytorium bÄ™dÄ… niezależne po j settings.deletion_success=Repozytorium zostaÅ‚o usuniÄ™te. settings.update_settings_success=Ustawienia repozytorium zostaÅ‚y zaktualizowane. settings.confirm_delete=UsuÅ„ repozytorium -settings.add_collaborator=Dodaj +settings.add_collaborator=Dodaj współpracownika settings.add_collaborator_success=Dodano użytkownika. settings.add_collaborator_inactive_user=Nie możesz dodać nieaktywnego użytkownika jako współpracownika. settings.add_collaborator_duplicate=Współpracownik zostaÅ‚ już dodany do tego repozytorium. @@ -1798,7 +1936,7 @@ settings.remove_team_success=DostÄ™p zespoÅ‚u do repozytorium zostaÅ‚ usuniÄ™ty. settings.add_webhook=Dodaj webhooka settings.add_webhook.invalid_channel_name=Nazwa kanaÅ‚u Webhooka nie może być pusta i nie może zawierać jedynie znaku #. settings.hooks_desc=Webhooki automatycznie tworzÄ… zapytania HTTP POST do serwera, kiedy nastÄ™pujÄ… pewne zdarzenia w Forgejo. Przeczytaj o tym wiÄ™cej w przewodniku o Webhookach. -settings.webhook_deletion=UsuÅ„ Webhooka +settings.webhook_deletion=UsuÅ„ webhooka settings.webhook_deletion_desc=UsuniÄ™cie Webhooka wykasuje jego ustawienia i historiÄ™ dostaw. Kontynuować? settings.webhook_deletion_success=Webhook zostaÅ‚ usuniÄ™ty. settings.webhook.test_delivery=Testuj dostawÄ™ @@ -1812,7 +1950,7 @@ settings.githook_edit_desc=JeÅ›li hook jest nieaktywny, zaprezentowana zostanie settings.githook_name=Nazwa hooka settings.githook_content=Treść hooka settings.update_githook=Zaktualizuj hook -settings.add_webhook_desc=Forgejo wyÅ›le żądanie POST z okreÅ›lonym typem zawartoÅ›ci do docelowego adresu URL. Przeczytaj o tym wiÄ™cej w przewodniku o Webhookach. +settings.add_webhook_desc=Forgejo wyÅ›le żądanie POST z okreÅ›lonym typem zawartoÅ›ci do docelowego adresu URL. Przeczytaj o tym wiÄ™cej w przewodniku o webhookach. settings.payload_url=Adres docelowy URL settings.http_method=Metoda HTTP settings.content_type=Typ zawartoÅ›ci POST @@ -1823,7 +1961,7 @@ settings.slack_color=Kolor settings.discord_username=Nazwa użytkownika settings.discord_icon_url=Adres URL ikony settings.event_desc=WywoÅ‚aj przy: -settings.event_push_only=Wydarzeniach przepchniÄ™cia +settings.event_push_only=Wydarzeniach wypchniÄ™cia settings.event_send_everything=Wszystkich wydarzeniach settings.event_choose=Niestandardowych wydarzeniach… settings.event_header_repository=Zdarzenia repozytorium @@ -1841,39 +1979,39 @@ settings.event_push_desc=WypchniÄ™cie git do repozytorium. settings.event_repository=Repozytorium settings.event_repository_desc=Repozytorium stworzone lub usuniÄ™te. settings.event_header_issue=Zdarzenia zgÅ‚oszeÅ„ -settings.event_issues=ZgÅ‚oszenia +settings.event_issues=Modyfikacje settings.event_issues_desc=ZgÅ‚oszenie otwarte, zamkniÄ™te, ponownie otwarte lub zmodyfikowane. -settings.event_issue_assign=ZgÅ‚oszenie przypisane +settings.event_issue_assign=Przypisania settings.event_issue_assign_desc=ZgÅ‚oszenie przypisane bÄ…dź nieprzypisane. -settings.event_issue_label=ZgÅ‚oszenie oznaczone -settings.event_issue_label_desc=Etykieta zgÅ‚oszenia zaktualizowana lub usuniÄ™ta. -settings.event_issue_milestone=Ustawiono cel zgÅ‚oszenia -settings.event_issue_milestone_desc=Ustawiono lub usuniÄ™to cel zgÅ‚oszenia. -settings.event_issue_comment=Komentarz w zgÅ‚oszeniu +settings.event_issue_label=Etykiety +settings.event_issue_label_desc=Etykiety zgÅ‚oszeÅ„ zaktualizowane lub usuniÄ™te. +settings.event_issue_milestone=Kamienie milowe +settings.event_issue_milestone_desc=Dodano, usuniÄ™to lub zmodyfikowano kamieÅ„ milowy. +settings.event_issue_comment=Komentarze settings.event_issue_comment_desc=Komentarz w zgÅ‚oszeniu stworzony, edytowany lub usuniÄ™ty. -settings.event_header_pull_request=Zdarzenia Pull Requestów -settings.event_pull_request=Pull Request +settings.event_header_pull_request=Zdarzenia pull requestów +settings.event_pull_request=Modyfikacje settings.event_pull_request_desc=Pull request otwarty, zamkniÄ™ty, ponownie otwarty lub zmodyfikowany. -settings.event_pull_request_assign=Pull Request przypisany +settings.event_pull_request_assign=Przypisania settings.event_pull_request_assign_desc=Pull Request przypisany bÄ…dz nieprzypisany. -settings.event_pull_request_label=Pull Request zaetykietowany -settings.event_pull_request_label_desc=Etykieta pull requesta zaktualizowana lub usuniÄ™ta. -settings.event_pull_request_milestone=Ustawiono cel Pull Requesta -settings.event_pull_request_milestone_desc=Ustawiono lub usuniÄ™to cel pull requesta. -settings.event_pull_request_comment=Pull Request skomentowany +settings.event_pull_request_label=Etykiety +settings.event_pull_request_label_desc=Etykiety pull requestów zaktualizowane lub usuniÄ™te. +settings.event_pull_request_milestone=Kamienie milowe +settings.event_pull_request_milestone_desc=Ustawiono lub usuniÄ™to kamieÅ„ milowy pull requesta. +settings.event_pull_request_comment=Komentarze settings.event_pull_request_comment_desc=Komentarz pull requestu stworzony, edytowany lub usuniÄ™ty. -settings.event_pull_request_review=Pull Request zrecenzowany +settings.event_pull_request_review=Recenzje settings.event_pull_request_review_desc=Pull request zatwierdzony, odrzucony lub zrecenzowany. -settings.event_pull_request_sync=Pull Request Zsynchronizowany -settings.event_pull_request_sync_desc=Pull request zsynchronizowany. +settings.event_pull_request_sync=Synchronizacja +settings.event_pull_request_sync_desc=Gałąź zaktualizowana automatycznie z gałęziÄ… docelowÄ…. settings.branch_filter=Filtr gałęzi settings.active=Aktywne settings.active_helper=Informacja o wywoÅ‚anych wydarzeniach bÄ™dzie przesÅ‚ana do tego adresu URL Webhooka. settings.add_hook_success=Webhook zostaÅ‚ dodany. settings.update_webhook=Zaktualizuj webhook settings.update_hook_success=Webhook zostaÅ‚ zaktualizowany. -settings.delete_webhook=UsuÅ„ Webhooka -settings.recent_deliveries=Ostatnie wywoÅ‚ania +settings.delete_webhook=UsuÅ„ webhooka +settings.recent_deliveries=Ostatnie dostarczenia settings.hook_type=Typ hooka settings.slack_token=Token settings.slack_domain=Domena @@ -1896,7 +2034,7 @@ settings.protected_branch=Ochrona gałęzi settings.protected_branch_can_push=Umożliwić push? settings.protected_branch_can_push_yes=Możesz wysyÅ‚ać settings.protected_branch_can_push_no=Nie możesz wysyÅ‚ać -settings.branch_protection=`Ochrona gałęzi dla "%s"` +settings.branch_protection=ReguÅ‚y ochrony dla gałęzi "%s" settings.protect_this_branch=Włącz ochronÄ™ gałęzi settings.protect_this_branch_desc=Zapobiega usuniÄ™ciu oraz ogranicza wypychanie i scalanie zmian do tej gałęzi. settings.protect_disable_push=Wyłącz wypychanie @@ -1906,14 +2044,14 @@ settings.protect_enable_push_desc=Każdy użytkownik z uprawnieniem zapisu bÄ™dz settings.protect_whitelist_committers=Wypychanie ograniczone białą listÄ… settings.protect_whitelist_committers_desc=Tylko dopuszczeni użytkownicy oraz zespoÅ‚y bÄ™dÄ… miaÅ‚y możliwość wypychania zmian do tej gałęzi (oprócz wymuszenia wypchniÄ™cia). settings.protect_whitelist_deploy_keys=Dozwolona lista kluczy wdrożeniowych z uprawnieniem zapisu do push'a. -settings.protect_whitelist_users=Użytkownicy dopuszczeni do pushowania +settings.protect_whitelist_users=Użytkownicy dopuszczeni do wypychania settings.protect_whitelist_search_users=Szukaj użytkowników… -settings.protect_whitelist_teams=ZespoÅ‚y dopuszczone do pushowania +settings.protect_whitelist_teams=ZespoÅ‚y dopuszczone do wypychania settings.protect_whitelist_search_teams=Szukaj zespołów… settings.protect_merge_whitelist_committers=Włącz dopuszczenie scalania settings.protect_merge_whitelist_committers_desc=Zezwól jedynie dopuszczonym użytkownikom lub zespoÅ‚om na scalanie Pull Requestów w tej gałęzi. -settings.protect_merge_whitelist_users=Użytkownicy dopuszczeni do scalania: -settings.protect_merge_whitelist_teams=ZespoÅ‚y dopuszczone do scalania: +settings.protect_merge_whitelist_users=Użytkownicy dopuszczeni do scalania +settings.protect_merge_whitelist_teams=ZespoÅ‚y dopuszczone do scalania settings.protect_check_status_contexts=Włącz kontrolÄ™ stanu settings.protect_check_status_contexts_desc=Wymagaj powodzenia kontroli stanów przed scalaniem. Wybierz które kontrole stanów muszÄ… zostać ukoÅ„czone pomyÅ›lnie, zanim gałęzie bÄ™dÄ… mogÅ‚y zostać scalone z gałęziÄ…, która pokrywa siÄ™ z tÄ… zasadÄ…. Kiedy włączone, commity muszÄ… być najpierw wypchniÄ™te do innej gałęzi, a nastÄ™pnie scalone lub wypchniÄ™te bezpoÅ›rednio do gałęzi, która pokrywa siÄ™ z tÄ… zasadÄ… po pomyÅ›lnej kontroli stanów. Jeżeli nie zostanÄ… wybrane konteksty, ostatni commit musi zakoÅ„czyć siÄ™ powodzeniem niezależnie od kontekstu. settings.protect_check_status_contexts_list=Kontrole stanów w poprzednim tygodniu dla tego repozytorium @@ -1943,13 +2081,13 @@ settings.no_protected_branch=Nie ma chronionych gałęzi. settings.edit_protected_branch=ZmieÅ„ settings.protected_branch_required_approvals_min=Wymagane zatwierdzenia nie mogÄ… mieć wartoÅ›ci ujemnej. settings.tags=Tagi -settings.tags.protection=Ochrona Tagów +settings.tags.protection=Ochrona tagów settings.tags.protection.pattern=Wzór tagu settings.tags.protection.allowed=Zezwolone settings.tags.protection.allowed.users=Dozwoleni użytkownicy settings.tags.protection.allowed.teams=Dozwolone zespoÅ‚y settings.tags.protection.allowed.noone=Brak -settings.tags.protection.create=ChroÅ„ tag +settings.tags.protection.create=Dodaj regułę settings.tags.protection.none=Brak chronionych tagów. settings.bot_token=Token bota settings.chat_id=ID czatu @@ -1971,7 +2109,7 @@ settings.lfs_findcommits=Znajdź commity settings.lfs_lfs_file_no_commits=Nie znaleziono commitów dla tego pliku LFS settings.lfs_noattribute=Ta Å›cieżka nie ma atrybutu do zablokowania w domyÅ›lnej gałęzi settings.lfs_delete=UsuÅ„ plik LFS z OID %s -settings.lfs_delete_warning=UsuniÄ™cie pliku LFS może spowodować błędy typu 'obiekt nie istnieje' przy checkout'cie. Czy chcesz kontynuować? +settings.lfs_delete_warning=UsuniÄ™cie pliku LFS może spowodować błędy typu 'obiekt nie istnieje' przy checkout'cie. Czy jesteÅ› pewien(-na)? settings.lfs_findpointerfiles=Znajdź pliki wskaźnika settings.lfs_locks=Blokady settings.lfs_invalid_locking_path=NieprawidÅ‚owa Å›cieżka: %s @@ -1983,7 +2121,7 @@ settings.lfs_locks_no_locks=Brak blokad settings.lfs_lock_file_no_exist=Zablokowany plik nie istnieje w domyÅ›lnej gałęzi settings.lfs_force_unlock=WymuÅ› odblokowanie settings.lfs_pointers.found=Znaleziono %d wskaźników blob - %d powiÄ…zanych, %d niepowiÄ…zanych (%d brakujÄ…cych w magazynie danych) -settings.lfs_pointers.sha=SHA bloba +settings.lfs_pointers.sha=Hash bloba settings.lfs_pointers.oid=OID settings.lfs_pointers.inRepo=W repozytorium settings.lfs_pointers.exists=Istnieje w magazynie @@ -1999,8 +2137,8 @@ diff.git-notes=Notatki diff.data_not_available=Informacje nt. zmian nie sÄ… dostÄ™pne diff.options_button=Opcje porównania diff.show_diff_stats=Pokaż statystyki -diff.download_patch=ÅšciÄ…gnij plik aktualizacji -diff.download_diff=ÅšciÄ…gnij plik porównania +diff.download_patch=Pobierz plik Å‚atki +diff.download_diff=Pobierz plik zmian diff.show_split_view=Widok podzielony diff.show_unified_view=Zunifikowany widok diff.whitespace_button=Znaki biaÅ‚e @@ -2026,7 +2164,7 @@ diff.comment.add_single_comment=Dodaj jeden komentarz diff.comment.add_review_comment=Dodaj komentarz diff.comment.start_review=Rozpocznij recenzjÄ™ diff.comment.reply=Odpowiedz -diff.review=Recenzuj +diff.review=ZakoÅ„cz recenzjÄ™ diff.review.header=Dodaj recenzjÄ™ diff.review.placeholder=Komentarz recenzji diff.review.comment=Skomentuj @@ -2045,7 +2183,7 @@ release.draft=Szkic release.prerelease=Wersja wstÄ™pna release.stable=Stabilna release.compare=Porównaj -release.edit=edytuj +release.edit=Edytuj release.ahead.commits=%d commitów release.ahead.target=do %s od tego wydania release.source_code=Kod źródÅ‚owy @@ -2054,10 +2192,10 @@ release.edit_subheader=Wydania pozwalajÄ… na zorganizowanie wersji projektu. release.tag_name=Nazwa tagu release.target=Cel release.tag_helper=Wybierz istniejÄ…cy tag lub stwórz nowy. -release.prerelease_desc=Oznacz jako wczesne wydanie +release.prerelease_desc=Oznacz jako wersja wstÄ™pna release.prerelease_helper=Oznacz to wydanie jako nieprzeznaczone na użytek produkcyjny. release.cancel=Anuluj -release.publish=Publikuj wersjÄ™ +release.publish=Publikuj wydanie release.save_draft=Zapisz szkic release.edit_release=Zaktualizuj wydanie release.delete_release=UsuÅ„ wydanie @@ -2073,7 +2211,7 @@ release.tag_already_exist=Ta nazwa tag'a już istnieje. release.downloads=Pliki do pobrania release.download_count=Pobrania: %s release.add_tag_msg=Użyj tytuÅ‚u i zawartoÅ›ci wydania jako wiadomoÅ›ci znacznika. -release.add_tag=Utwórz tylko znacznik +release.add_tag=Utwórz tag branch.name=Nazwa gałęzi branch.delete_head=UsuÅ„ @@ -2122,7 +2260,7 @@ settings.protect_patterns = Szablony default_branch_label = domyÅ›lnie issues.author = Autor commit.operations = Operacje -commit.revert = Odwróć +commit.revert = Przywróć pull.deleted_branch = (usuniÄ™to):%s diff.vendored = dostarczono from_comment = (komentarz) @@ -2136,13 +2274,593 @@ pulls.made_using_agit = AGit activity.navbar.contributors = Współtwórcy diff.image.swipe = PrzesuÅ„ settings.web_hook_name_feishu_only = Feishu -escape_control_characters = Escape +escape_control_characters = Zakoduj stars = Gwiazdki generated = Wygenerowano pulls.cmd_instruction_checkout_title = Kontrola settings.units.overview = Podsumowanie +fork_branch = Gałąź która ma zostać sklonowa do forku +tree_path_not_found_commit = Åšcieża %[1]s nie istnieje w commicie %[2]s +tree_path_not_found_branch = Åšcieżka %[1]s nie istnieje w gałęzi %[2]s +admin.manage_flags = ZarzÄ…dzaj flagami +object_format_helper = Format obiektów repozytorium. Nie może zostać zmieniony później. SHA1 jest najbardziej kompatybilny. +migrate_options_lfs_endpoint.placeholder = JeÅ›li pozostawione puste, endpoint bÄ™dzie uzyskany z URL clone +repo_gitignore_helper_desc = Wybierz które pliki nie bÄ™dÄ… Å›ledzone z listy szablonowych dla powszechnych jÄ™zyków. Typowe artefakty wygenerowane przed każdy z narzÄ™dzi jÄ™zyka sÄ… dołączone w .gitignore domyÅ›lnie. +transfer.no_permission_to_reject = Nie masz uprawnieÅ„ by odrzucić ten transfer. +transfer.no_permission_to_accept = Nie masz uprawnieÅ„ by zaakceptować ten transfer. +form.string_too_long = Podany ciÄ…g znaków jest dÅ‚uższy niż %d znaków. +fork_to_different_account = Utwórz fork do innego konta +size_format = %[1]s: %[2]s, %[3]s: %[4]s +rss.must_be_on_branch = Musisz być na gałęzi by mieć dostÄ™p do kanaÅ‚u RSS. +visibility_helper = Ustaw repozytorium jako prywatne +mirror_address_url_invalid = Przekazany URL nie jest poprawny. Musisz zakodować wszystkie komponenty URL poprawnie. +form.name_pattern_not_allowed = Wzór "%s" nie jest dozwolony w nazwie repozytorium. +blame_prior = Zobacz blame przed tÄ… zmianÄ… +template.git_hooks_tooltip = W tym momencie nie można modyfikować ani usuwać hooków Gita które zostaÅ‚y już dodane. Wybierz tÄ™ opcjÄ™ tylko jeżeli ufasz szablonowi repozytorium. +already_forked = Już utworzyÅ‚eÅ›(-aÅ›) fork %s +admin.enabled_flags = Aktywne flagi dla tego repozytorium: +admin.flags_replaced = Flagi repozytorium zmienione +admin.update_flags = Zaktualizuj flagi +admin.failed_to_replace_flags = Zmiana flag repozytorium nie powiodÅ‚a siÄ™ +all_branches = Wszystkie gałęzie +stars_remove_warning = Ta operacja usunie wszystkie otrzymane gwiazdy tego repozytorium. +new_repo_helper = Repozytorium zawiera wszystkie pliki projektu, włączajÄ…c historiÄ™ zmian. Hostujesz już jakieÅ› gdzie-indziej? Migruj repozytorium. +mirror_denied_combination = Nie można użyć klucza publicznego i uwierzytelniania na podstawie hasÅ‚a razem. +mirror_public_key = Publiczny klucz SSH +mirror_use_ssh.text = Użyj uwierzytelniania SSH +new_from_template = Użyj szablonu +new_from_template_description = Możesz wybrać istniejÄ…cy szablon repozytorium na tej instancji i zastosować jego ustawienia. +new_advanced = Ustawienia zaawansowane +fork_no_valid_owners = Z tego repozytorium nie można utworzyć forku ponieważ nie posiada poprawnych wÅ‚aÅ›cicieli. +open_with_editor = Otwórz przy pomocy %s +new_advanced_expand = Kliknij by rozwinąć +author_search_tooltip = Pokazuje maksymalnie 30 użytkowników +form.name_reserved = Nazwa repozytorium "%s" jest zarezerwowana. +archive.title = To repozytorium zostaÅ‚o zarchiwizowane. Możesz podglÄ…dać pliki i sklonować je, ale nie możesz wypychać, otwierać zgÅ‚oszeÅ„ oraz pull requestów. +archive.title_date = To repozytorium zostaÅ‚o zarchiwizone w %s. Możesz podglÄ…dać pliki i sklonować je, ale nie możesz wypychać, otwierać zgÅ‚oszeÅ„ oraz pull requestów. +object_format = Format obiektów +auto_init_description = Zainicjuj historiÄ™ Git z README oraz opcjonalnie dodaj pliki Licencji oraz .gitignore. +mirror_use_ssh.not_available = Uwierzytelnianie SSH nie jest dostÄ™pne. +mirror_sync_on_commit = Synchronizuj kiedy commity sÄ… wypychane +summary_card_alt = Karta podsumowania repozytorium %s +tree_path_not_found_tag = Åšcieża %[1]s nie istnieje w tagu %[2]s +archive.pull.noreview = To repozytorium jest zarchiwizowane. Nie możesz recenzować pull requestów. +migrate.migrating_failed.error = Nie udaÅ‚o siÄ™ migrować: %s +migrate.cancel_migrating_title = Anuluj migracjÄ™ +migrate.cancel_migrating_confirm = Czy chcesz anulować tÄ™ migracjÄ™? +migrate.forgejo.description = Migruj dane z codeberg.org lub innych instancji Forgejo. +migrate.github_token_desc = Możesz wprowadzić tutaj jeden lub wiÄ™cej tokenów oddzielonych przecinkiem by przeprowadzić migracjÄ™ szybciej w zwiÄ…zku z ograniczeniem GitHub API. OSTRZEÅ»ENIE: Nadużywanie tej funkcjonalnoÅ›ci może naruszyć politykÄ™ dostawcy usÅ‚ug i doprowadzić do zablokowania konta. +migrate.invalid_local_path = Åšcieżka lokalna jest niepoprawna. Nie istnieje lub nie jest katalogiem. +issues.review.add_remove_review_requests = poprosiÅ‚ o recenzje od %[1]s i cofnÄ…Å‚ proÅ›by o recenzje od %[2]s %[3]s +pulls.ready_for_review = Gotów do recenzji? +pulls.cmd_instruction_merge_desc = Scal zmiany i zaktualizuj na Forgejo. +editor.push_rejected_no_message = Zmiana zostaÅ‚a odrzucona przez serwer bez wiadomoÅ›ci. ProszÄ™ sprawdź hooki Git. +settings.branches.add_new_rule = Dodaj nowÄ… regułę +issues.dependency.pr_no_dependencies = Brak ustawionych zależnoÅ›ci. +pulls.cmd_instruction_merge_warning = Ostrzeżenie: Ustawienie "Autodetekcja rÄ™cznego scalenia" nie zostaÅ‚o włączone dla tego repozytorium, bÄ™dziesz musiaÅ‚ oznaczyć ten pull request jako rÄ™cznie scalony. +settings.trust_model.committer.desc = PrawidÅ‚owe podpisy bÄ™dÄ… oznaczone jako "zaufane" tylko jeÅ›li pasujÄ… do autora commitu, w innym wypadku bÄ™dÄ… oznaczone jako "niedopasowane". To zmusza Forgejo do bycia autorem commita dla podpisanych commitów, z rzeczywistym autorem commita oznaczonym w dopiskach Co-authored-by: i Co-commited-by: w commicie. DomyÅ›lny klucz Forgejo musi pasować do Użytkownika w bazie danych. +settings.add_collaborator_blocked_our = Nie można dodać współpracownika, ponieważ wÅ‚aÅ›ciciel repozytorium go zablokowaÅ‚. +settings.webhook.test_delivery_desc_disabled = By przetestować webhook z przykÅ‚adowym wydarzeniem, aktywuj go. +settings.protect_enable_merge_desc = Ktokolwiek z uprawnieniem zapisu bÄ™dzie mógÅ‚ scalić pull requesta do tej gałęzi. +settings.unarchive.error = WystÄ…piÅ‚ błąd podczas próby odarchiwizowania repo. Zobacz wiÄ™cej szczegółów w logach. +settings.protect_protected_file_patterns_desc = Chronione pliki nie mogÄ… zostać zmienione bezpoÅ›rednio nawet jeÅ›li użytkownik ma prawa do dodawania, edytowania, lub usuwania plików w tej gałęzi. Kilka wzorów może być oddzielone przy użyciu Å›rednika (";"). Zobacz skÅ‚adniÄ™ wzorów w dokumentacji %[2]s. PrzykÅ‚ady: .drone.yml, /docs/**/*.txt. +release.invalid_external_url = NieprawidÅ‚owy zewnÄ™trzny URL: "%s" +settings.trust_model.collaboratorcommitter.desc = PrawidÅ‚owe podpisy współpracowników tego repozytorium bÄ™dÄ… oznaczone jako "zaufane" tylko jeÅ›li pasujÄ… do autora commitu, w innym wypadku bÄ™dÄ… oznaczone jako "niedopasowane". To zmusza Forgejo do bycia autorem commita dla podpisanych commitów, z rzeczywistym autorem commita oznaczonym w dopiskach Co-authored-by: i Co-commited-by: w commicie. DomyÅ›lny klucz Forgejo musi pasować do Użytkownika w bazie danych. +pulls.agit_explanation = Utworzone przy użyciu procesu pracy AGit. AGit pozwala współpracownikom proponować zmiany używajÄ…c "git push" bez potrzeby tworzenia forku lub nowej gałęzi. +pulls.merge_commit_id = Identyfikator commita scalajÄ…cego +pulls.auto_merge_canceled_schedule_comment = `anulowaÅ‚(a) automatyczne scalenie tego pull requestu kiedy wszystkie weryfikacje odniosÄ… sukces %[1]s` +settings.sourcehut_builds.access_token_helper = Token dostÄ™pu który ma uprawnienie JOBS:RW. Wygeneruj token builds.sr.ht lub token builds.sr.ht z dostÄ™pem do sekretów na meta.sr.ht. +pulls.delete.text = Czy na pewno chcesz usunąć ten pull request? (Ta akcja permanentnie usunie całą treść. Zamiast tego rozważ jego zamkniÄ™cie, jeżeli masz zamiar zostawić go zarchiwizowanego) +settings.sourcehut_builds.secrets_helper = Uprawnij pracÄ™ do budowania sekretów (wymaga przyznania SECRETS:RO) +vendored = Dołączone +editor.add = Dodaj %s +release.message = Opisz to wydanie +release.download_count_few = %s pobrania +tag.create_tag_operation = Utwórz tag +tag.create_success = Tag "%s" zostaÅ‚ utworzony. +editor.commit_email = E-mail commitu +projects.edit_success = Projekt "%s" zostaÅ‚ zaktualizowany. +issues.choose.invalid_config = Konfiguracja zgÅ‚oszeÅ„ zawiera błędy: +issues.add_ref_at = `dodaÅ‚(a) odniesienie %s %s` +issues.filter_milestone_all = Wszystkie kamienie milowe +issues.filter_milestone_none = Brak kamieni milowych +issues.unpin_comment = odpiÄ…Å‚ to %s +issues.max_pinned = Nie możesz przypiąć wiÄ™cej zgÅ‚oszeÅ„ +issues.tracking_already_started = `Już włączyÅ‚eÅ›(-aÅ›) Å›ledzenie czasu na innym zgÅ‚oszeniu!` +issues.review.option.hide_outdated_comments = Ukryj przedawnione komentarze +pulls.cannot_merge_work_in_progress = Ten pull request jest oznaczony jako praca w toku. +pulls.merge_pull_request = Utwórz commit scalajÄ…cy +pulls.rebase_merge_pull_request = Zmiana bazy, potem fast-forward +pulls.push_rejected = WypchniÄ™cie nie powiodÅ‚o siÄ™: WypchniÄ™cie zostaÅ‚o odrzucone. Sprawdź hooki Git dla tego repozytorium. +commits.search.tooltip = Możesz rozpocząć sÅ‚owa kluczowe z "author:", "committer:","after:", lub "before:", np. "revert author:Alice before:2019-01-13". +commit.revert-header = Przywrócenie: %s +issues.label_exclusive_warning = Wszystkie kolidujÄ…ce etykiety z zakresem bÄ™dÄ… usuniÄ™te podczas edycji etykiet zgÅ‚oszenia lub pull requestu. +pulls.switch_head_and_base = ZmieÅ„ head i bazÄ™ +settings.add_collaborator_blocked_them = Nie można dodać współpracownika, ponieważ zablokowaÅ‚ on wÅ‚aÅ›ciciela repozytorium. +settings.web_hook_name_sourcehut_builds = Buildy SourceHut +settings.packagist_username = Nazwa użytkownika Packagist +projects.column.edit = Edytuj kolumnÄ™ +issues.filter_poster_no_select = Wszyscy autorzy +issues.closed_by = przez %[3]s zostaÅ‚ zamkniÄ™ty %[1]s +issues.opened_by_fake = otworzony %[1]s przez %[2]s +issues.new.assign_to_me = Przypisz do mnie +tag.create_tag_from = Utwórz nowy tag z "%s" +issues.label_archived_filter = Pokaż zarchiwizowane etykiety +issues.label_archive_tooltip = Zarchiwizowane etykiety sÄ… wyłączone domyÅ›lnie z sugestii kiedy korzysta siÄ™ szukania po etykietach. +pulls.merged_info_text = Gałąź %s może teraz zostać usuniÄ™ta. +milestones.create_success = KamieÅ„ milowy "%s" zostaÅ‚ utworzony. +settings.federation_settings = Ustawienia Federacji +settings.mirror_settings.push_mirror.add = Dodaj wypychajÄ…cÄ… kopiÄ™ lustrzanÄ… +settings.admin_code_indexer = Indekser kodu +settings.ignore_stale_approvals = Ignoruj przestarzaÅ‚e zatwierdzenia +settings.enforce_on_admins_desc = Administratorzy repozytorium nie mogÄ… ominąć tej reguÅ‚y. +mirror_address_desc = Wprowadź wymagane dane uwierzytelniajÄ…ce w seksji Autoryzacja. +cite_this_repo = Cytuj to repozytorium +issues.all_title = Wszystkie +pulls.select_commit_hold_shift_for_range = Wybierz commit. Przytrzymaj shift i kliknij by wybrać zakres +pulls.review_only_possible_for_full_diff = Recenzja jest tylko możliwe przy wyÅ›wietlaniu peÅ‚nych zmian +settings.archive.mirrors_unavailable = Kopie lustrzane nie sÄ… dostÄ™pne dla zarchiwizowanych repozytoriów. +settings.rename_branch_failed_protected = Nie można zmienić nazwy gałęzi %s ponieważ jest ona gałęziÄ… chronionÄ…. +mirror_lfs_desc = Aktywuj kopie lustrzane danych LFS. +branch.protected_deletion_failed = Gałąź "%s" jest chroniona. Nie może zostać usuniÄ™ta. +settings.discord_icon_url.exceeds_max_length = URL ikony musi mieć mniej lub równo 2048 znaków +settings.protect_new_rule = Dodaj nowÄ… regułę ochrony gałęzi +settings.protect_status_check_patterns_desc = Wprowadź wzory do okreÅ›lenia które weryfikacje muszÄ… przejść zanim gałęzie zostanÄ… scalone do gałęzi która pasuje do reguÅ‚y. Każda linia okreÅ›la jeden wzór. Wzory nie mogÄ… być puste. +settings.protect_protected_file_patterns = Chronione wzory plików (oddzielone przy użyciu Å›rednika ";") +diff.hide_file_tree = Ukryj drzewo plików +release.title_empty = TytuÅ‚ nie może być pusty. +release.releases_for = Wydania dla %s +release.system_generated = Ten załącznik jest automatycznie wygenerowany. +branch.delete_desc = UsuniÄ™cie gałęzi jest permanentne. Mimo, że usuniÄ™ta gałąź może istnieć przez krótki czas zanim zostanie rzeczywiÅ›cie usuniÄ™ta, ta operacja NIE MOÅ»E zostać cofniÄ™ta w wiÄ™kszoÅ›ci przypadków. Kontynuować? +branch.rename_branch_to = ZmieÅ„ nazwÄ™ gałęzi "%s" na: +editor.patch = Zastosuj patch +commits.no_commits = Brak wspólnych commitów. "%s" i "%s" majÄ… zupeÅ‚nie inne historie. +projects.create_success = Projekt "%s" zostaÅ‚ utworzony. +projects.column.assigned_to = Przypisane do +projects.column.deletion_desc = UsuniÄ™cie kolumny projekty przeniesie wszystkie powiÄ…zane zgÅ‚oszenia do kolumny domyÅ›lnej. Kontynuować? +issues.author.tooltip.pr = Ten użytkownik jest autorem tego pull requesta. +wiki.no_search_results = Brak wyników +diff.image.side_by_side = Obok siebie +editor.fail_to_apply_patch = Nie udaÅ‚o siÄ™ zastosować patcha "%s" +issues.content_history.delete_from_history_confirm = Usunąć z historii? +invisible_runes_header = `Ten plik zawiera niewidoczne znaki Unicode` +invisible_runes_description = `Ten plik zawiera niewidoczne znaki Unicode które sÄ… nierozróżnialne dla ludzi, ale mogÄ… być przetwarzane w inny sposób przez komputer. JeÅ›li uważasz, że to jest zamierzone, możesz bezpiecznie zignorować to ostrzeżenie. Użyj klawisza Escape by je wyÅ›wietlić.` +unescape_control_characters = Zdekoduj +editor.signoff_desc = Dodaj dopisek Signed-off-by w imieniu autora commita na koÅ„cu wiadomoÅ›ci commita. +editor.invalid_commit_mail = NieprawidÅ‚owy mail do utworzenia commita. +commit.revert-content = Wybierz gałąź na której wykonać przywrócenie: +projects.column.new = Nowa kolumna +projects.card_type.text_only = Tylko tekst +issues.comment_manually_pull_merged_at = rÄ™cznie scaliÅ‚ commit %[1]s do %[2]s %[3]s +issues.dependency.no_permission.can_remove = Nie masz uprawnieÅ„ do odczytu tej zależnoÅ›ci, ale możesz usunąć tÄ™ zależność +pulls.blocked_by_user = Nie możesz utworzyć pull requesta w tym repozytorium ponieważ jesteÅ› zablokowany(-a) przez wÅ‚aÅ›ciciela repozytorium. +wiki.delete_page_notice_1 = UsuniÄ™cie strony wiki "%s" nie może zostać cofniÄ™te. Kontynuować? +wiki.reserved_page = Strona wiki o nazwie "%s" jest zarezerwowana. +settings.branches.switch_default_branch = ZmieÅ„ domyÅ›lnÄ… gałąź +settings.webhook.delivery.success = Wydarzenie zostaÅ‚o dodane do kolejki dorÄ™czeÅ„. Może to zająć kilka sekund zanim pojawi siÄ™ w historii dorÄ™czeÅ„. +settings.authorization_header_desc = Zostanie dołączony jako nagłówek autoryzacji dla żądaÅ„ kiedy bÄ™dzie dostÄ™pny. PrzykÅ‚ady: %s. +settings.authorization_header = Nagłówek autoryzacji +settings.protect_branch_name_pattern = Wzór nazwy gałęzi chronionej +branch.delete_branch_has_new_commits = Gałąź "%s" nie może zostać usuniÄ™ta ponieważ nowe commity zostaÅ‚y dodane po scaleniu. +signing.wont_sign.nokey = Ta instancja nie posiada klucza do podpisania tego commita. +release.tag_helper_existing = IstniejÄ…cy tag. +release.title = TytuÅ‚ wydania +branch.create_from = z "%s" +pulls.cmd_instruction_merge_title = Scal +more_operations = WiÄ™cej operacji +pulls.auto_merge_button_when_succeed = (Kiedy wszystkie weryfikacje odniosÄ… sukces) +settings.update_mirror_settings = Aktualizuj ustawienia kopii lustrzanej +settings.pulls.default_allow_edits_from_maintainers = Pozwól domyÅ›lnie na edycje przez opiekunów +settings.confirmation_string = CiÄ…g potwierdzajÄ…cy +branch.renamed = Nazwa gałęzi %s zostaÅ‚a zmieniona na %s. +issues.filter_sort.relevance = Trafność +issues.stop_tracking = Zatrzymaj zegar +settings.units.units = Jednostki +settings.mirror_settings.push_mirror.copy_public_key = Skopiuj klucz publiczny +settings.pull_mirror_sync_quota_exceeded = Limit przekroczony, zmiany niepobrane. +settings.tracker_issue_style.regexp_pattern = Wzór Wyrażenia Regularnego +settings.trust_model.collaboratorcommitter.long = Współpracownik+CommitujÄ…cy: Ufaj podpisom współpracownik które pasujÄ… do commitujÄ…cego +settings.event_wiki_desc = Strona wiki zostaÅ‚a utworzona, zmieniono jej nazwÄ™, edytowano lub usuniÄ™to. +settings.packagist_package_url = URL pakietu Packagist +settings.update_protect_branch_success = Ochrona gałęzi dla reguÅ‚y "%s" zostaÅ‚a zaktualizowana. +topic.format_prompt = Tematy muszÄ… zaczynać siÄ™ od litery lub liczby, mogÄ… zawierać myÅ›lniki ("-") i kropki ("."), mogÄ… być dÅ‚ugie do 35 znaków. Litery muszÄ… być maÅ‚e. +find_file.go_to_file = Szukaj pliku +n_branch_few = %s gałęzie +issues.dismiss_review = Odrzuć recenzjÄ™ +settings.trust_model.collaboratorcommitter = Współpracownik+CommitujÄ…cy +release.type_attachment = Załącznik +release.type_external_asset = ZewnÄ™trzny zasób +release.asset_name = Nazwa zasobu +release.asset_external_url = ZewnÄ™trzny URL +release.add_external_asset = Dodaj zewnÄ™trzny zasób +settings.transfer_abort_success = Transfer repozytorium do %s pomyÅ›lnie anulowany. +milestones.filter_sort.earliest_due_data = Najbliższy termin realizacji +issues.remove_ref_at = `usunÄ…Å‚(-ęła) odniesienie %s %s` +editor.file_is_a_symlink = `"%s" jest dowiÄ…zaniem symbolicznym. DowiÄ…zania symboliczne nie mogÄ… być edytowane w edytorze przeglÄ…darkowym` +editor.unable_to_upload_files = Nie udaÅ‚o siÄ™ wgrać plików do "%s", błąd: %v +editor.upload_file_is_locked = Plik "%s" jest zablokowany przez %s. +commits.renamed_from = Zmieniono nazwÄ™ z %s +issues.filter_milestone_open = Otwarte kamienie milowe +issues.filter_milestone_closed = ZamkniÄ™te kamienie milowe +issues.role.first_time_contributor = Kontrybutor pierwszy raz +pulls.squash_merge_pull_request = Utwórz squash commit +pulls.fast_forward_only_merge_pull_request = Tylko fast-forward +settings.web_hook_name_feishu = Feishu / Lark Suite +settings.add_key_success = Klucz wdrożenia "%s" zostaÅ‚ dodany. +settings.protect_unprotected_file_patterns = Niechronione wzory plików (oddzielone przy użyciu Å›rednika ";") +branch.branch_name_conflict = Nazwa gałęzi "%s" koliduje z już istniejÄ…cÄ… gałęziÄ… "%s". +branch.restore_failed = Nie udaÅ‚o siÄ™ przywrócić gałęzi "%s". +pulls.allow_edits_from_maintainers = Zezwalaj na zmiany przez opiekunów +projects.card_type.images_and_text = Obrazy i tekst +pulls.merged_by = przez %[3]s zostaÅ‚ scalony %[1]s +issues.num_comments_1 = %d komentarz +issues.comment_pull_merged_at = scaliÅ‚ commit %[1]s do %[2]s %[3]s +issues.no_content = Opis zgÅ‚oszenia jest pusty. +issues.delete.title = Usunąć to zgÅ‚oszenie? +issues.delete.text = Czy na pewno chcesz usunąć to zgÅ‚oszenie? (Ta akcja permanentnie usunie całą treść. Rozważ zamkniÄ™cie zgÅ‚oszenia, jeÅ›li zamierzasz pozostawić je zarchiwizowane) +issues.review.pending.tooltip = Ten komentarz bieżąco nie jest widoczny dla pozostaÅ‚ych użytkownik. By dodać twoje oczekujÄ…ce komentarze, wybierz "%s" -> "%s/%s/%s" na górze strony. +pulls.blocked_by_changed_protected_files_n = Ten pull request jest zablokowany ponieważ wprowadza zmiany do chronionych plików: +settings.mirror_settings.docs.can_still_use = Mimo, że nie możesz modyfikować istniejÄ…cych kopii lustrzanych lub utworzyć nowych, nadal możesz korzystać z bieżącej kopii lustrzanej. +settings.mirror_settings.docs.no_new_mirrors = Twoje repozytorium wykonuje kopie lustrzane do lub z innego repozytorium. ProszÄ™ miej na uwadze, że nie możesz utworzyć nowych kopii lustrzanych w tym momencie. +settings.mirror_settings.docs.pull_mirror_instructions = By skonfigurować kopiÄ™ lustrzanÄ… typu pull, proszÄ™ sprawdź: +settings.mirror_settings.docs.disabled_push_mirror.info = WypychajÄ…ce kopie lustrzane zostaÅ‚y wyłączone przez twojego administratora strony. +settings.tracker_issue_style.regexp = Wyrażenie Regularne +branch.rename = ZmieÅ„ nazwÄ™ gałęzi "%s" +settings.protect_no_valid_status_check_patterns = Brak prawidÅ‚owych wzorów weryfikacji stanu. +issues.is_stale = ZostaÅ‚y wniesione zmiany do tego pull requesta od momentu tej recenzji +project = Projekty +issues.reaction.add = Dodaj reakcjÄ™ +issues.reaction.alt_remove = UsuÅ„ reakcjÄ™ %[1]s z komentarza. +issues.reaction.alt_add = Dodaj reakcjÄ™ %[1]s do komentarza. +issues.context.menu = Menu komentarza +issues.role.member_helper = Ten użytkownik jest czÅ‚onkiem organizacji która jest wÅ‚aÅ›cicielem tego repozytorium. +issues.reaction.alt_few = %[1]s dodaÅ‚(a) reakcjÄ™ %[2]s. +issues.role.collaborator_helper = Ten użytkownik zostaÅ‚ zaproszony do współpracy nad tym repozytorium. +issues.reaction.alt_many = %[1]s i %[2]d wiÄ™cej dodali reakcjÄ™ %[3]s. +issues.dependency.pr_closing_blockedby = ZamkniÄ™cie tego pull requesta jest zablokowane przez nastÄ™pujÄ…ce zgÅ‚oszenia +settings.federation_following_repos = URLe Podążanych Repozytoriów. Rozdzielone ";", bez znaków biaÅ‚ych. +branch.warning_rename_default_branch = Zmieniasz nazwÄ™ domyÅ›lnej gałęzi. +ambiguous_runes_description = `Ten plik zawiera znaki Unicode które mogÄ… być pomylone z innymi znakami. JeÅ›li uważasz, że to jest zamierzone, możesz bezpiecznie zignorować to ostrzeżenie. Użyj klawisza Escape by je wyÅ›wietlić.` +activity.navbar.recent_commits = Ostatnie commity +signing.wont_sign.headsigned = To scalenie nie bÄ™dzie podpisane ponieważ head commit nie jest podpisany. +pulls.has_changed_since_last_review = Zmiany od twojej ostatniej recenzji +find_file.no_matching = Nie znaleziono pasujÄ…cych plików +n_tag_one = %s tag +n_tag_few = %s tagi +n_release_few = %s wydaÅ„ +no_eol.text = Brak znaku koÅ„ca linii +editor.add_file = Dodaj plik +pulls.has_merged = Niepowodzenie: Pull request zostaÅ‚ scalony, nie możesz scalić ponownie lub zmienić gałęzi docelowej. +issues.filter_type.review_requested = Poproszono o recenzjÄ™ +issues.label_templates.fail_to_load_file = Nie udaÅ‚o siÄ™ zaÅ‚adować pliku szablonu etykiet "%s": %v +issues.change_ref_at = `zmieniÅ‚(a) odniesienie z %s na %s %s` +issues.action_check_all = Zaznacz/Odznacz wszystkie elementy +issues.context.reference_issue = Odniesienie w nowym zgÅ‚oszeniu +issues.role.first_time_contributor_helper = To jest pierwsza kontrybucja tego użytkownika w tym repozytorium. +issues.role.contributor = Kontrybutor +settings.event_pull_request_merge = Scalenie pull requesta +settings.web_hook_name_msteams = Microsoft Teams +settings.web_hook_name_wechatwork = WeCom (Wechat Work) +settings.sourcehut_builds.secrets = Sekrety +settings.sourcehut_builds.manifest_path = Åšcieżka manifestu budowy +settings.sourcehut_builds.visibility = Widoczność pracy +issues.label_exclusive_desc = Nazwij etykietÄ™ scope/item by wzajemnie wykluczaÅ‚a siÄ™ z innymi etykietami scope/. +issues.archived_label_description = (Zarchiwizowano) %s +pulls.is_ancestor = Ta gałąź jest już częściÄ… gałęzi docelowej. Nie ma nic do scalenia. +pulls.is_empty = Zmiany na tej gałęzi sÄ… już częściÄ… gałęzi docelowej. Commit bÄ™dzie pusty. +pulls.blocked_by_approvals = Ten pull request nie ma wystarczajÄ…co zatwierdzeÅ„. %d z %d zatwierdzeÅ„ udzielonych. +pulls.blocked_by_rejection = Ten pull request ma proÅ›bÄ™ o zmiany od oficjalnego recenzenty. +pulls.blocked_by_official_review_requests = Ten pull request jest zablokowany ponieważ nie posiada zatwierdzenia od jednego lub wiÄ™cej oficjalnych recenzentów. +pulls.wrong_commit_id = Identyfikator commitu musi być identyfikatorem commitu na gałęzi docelowej +pulls.rebase_merge_commit_pull_request = Zmiana bazy, potem utwórz commit scalajÄ…cy +branch.tag_collision = Gałąź "%s" nie może zostać utworzona, ponieważ tag z tÄ… samÄ… nazwÄ… już istnieje w tym repozytorium. +n_commit_one = %s commit +n_commit_few = %s commity +file_follow = Podążaj za dowiÄ…zaniem +n_branch_one = %s gałąź +n_release_one = %s wydanie +editor.new_branch_name = Nazwij nowÄ… gałąź dla tego commita +issues.action_check = Zaznacz/Odznacz +issues.close = Zamknij zgÅ‚oszenie +issues.label_exclusive = WykluczajÄ…ca +issues.cancel_tracking_history = `anulowaÅ‚(a) Å›ledzenie czasu %s` +issues.dependency.no_permission_1 = Nie masz uprawnieÅ„ do odczytu %d zależnoÅ›ci +issues.dependency.issue_closing_blockedby = ZamkniÄ™cie tego zgÅ‚oszenia jest blokowane przez nastÄ™pujÄ…ce zgÅ‚oszenia +pulls.auto_merge_newly_scheduled_comment = `zaplanowaÅ‚(a) ten pull request do automatycznego scalenia kiedy wszystkie weryfikacje odniosÄ… sukces %[1]s` +signing.wont_sign.not_signed_in = Nie jesteÅ› zalogowany(-a). +settings.protected_branch.save_rule = Zapisz regułę +settings.protected_branch.delete_rule = UsuÅ„ regułę +branch.deletion_success = Gałąź "%s" zostaÅ‚a usuniÄ™ta. +settings.rename_branch_failed_exist = Nie można zmienić nazwy gałęzi ponieważ gałąź docelowa %s już istnieje. +settings.rename_branch_failed_not_exist = Nie można zmienić nazwy gałęzi %s ponieważ taka gałąź nie istnieje. +diff.file_suppressed_line_too_long = Diff pliku wstrzymany ponieważ jedna lub wiÄ™cej linii jest za dÅ‚uga +diff.too_many_files = Niektóre pliki nie sÄ… pokazane ponieważ zbyt wiele plików zostaÅ‚o zmienionych w tym diffie +diff.review.self_reject = Autorzy pull requestów nie mogÄ… poprosić o zmiany na ich wÅ‚asnym pull requeÅ›cie +diff.review.self_approve = Autorzy pull requestów nie mogÄ… zatwierdzić ich wÅ‚asnych pull requestów +diff.has_escaped = Ta linia ma ukryte znaki Unicode +diff.show_file_tree = Pokaż drzewo plików +release.deletion_desc = UsuniÄ™cie wydania tylko usuwa je z Forgejo. Nie wpÅ‚ynie ono na tag Git, zawartoÅ›ci twojego repozytorium lub jego historii. Kontynuować? +release.hide_archive_links = Ukryj automatycznie wygenerowane archiwa +release.hide_archive_links_helper = Ukryj automatycznie wygenerowane archiwa kodu źródÅ‚owego dla tego wydania. Dla przykÅ‚adu, jeÅ›li wgrywasz swoje wÅ‚asne. +release.tags_for = Tagi dla %s +branch.already_exists = Gałąź o nazwie "%s" już istnieje. +branch.create_success = Gałąź "%s" zostaÅ‚a utworzona. +editor.file_delete_success = Plik "%s" zostaÅ‚ usuniÄ™ty. +branch.branch_already_exists = Gałąź "%s" już istnieje w repozytorium. +branch.new_branch_from = Utwórz nowÄ… gałąź z "%s" +error.broken_git_hook = Hooki Git tego repozytorium zdajÄ… siÄ™ być zepsute. ProszÄ™ sprawdź jak je naprawić w dokumentacji, a nastÄ™pnie wypchnij parÄ™ commitów by odÅ›wieżyć stan. +editor.cherry_pick = Cherry-pick %s na: +milestones.edit_success = KamieÅ„ milowy "%s" zostaÅ‚ zaktualizowany. +activity.title.issues_closed_from = %s zamkniÄ™te przez %s +settings.enforce_on_admins = WymuÅ› tÄ™ regułę dla administratorów repozytorium +commits.view_path = Zobacz w tym punkcie w historii +pulls.auto_merge_cancel_schedule = Anuluj automatyczne scalenie +settings.reindex_button = Dodaj do kolejki ponownego indeksowania +settings.transfer.button = PrzenieÅ› wÅ‚aÅ›cicielstwo +commit.cherry-pick = Cherry-pick +tag.confirm_create_tag = Utwórz tag +issues.review.dismissed = odrzuciÅ‚ recenzjÄ™ %s %s +pulls.auto_merge_when_succeed = Automatycznie scal kiedy wszystkie weryfikacje odniosÄ… sukces +pulls.reopen_failed.base_branch = Pull request nie może zostać ponownie otworzony, ponieważ baza gałęzi już nie istnieje. +pulls.auto_merge_newly_scheduled = Pull request zostaÅ‚ zaplanowany do scalenia kiedy wszystkie weryfikacje odniosÄ… sukces. +issues.dismiss_review_warning = Czy jesteÅ› pewien(-na), że chcesz odrzucić tÄ™ recenzjÄ™? +pulls.recently_pushed_new_branches = WypchnÄ…Å‚eÅ›(-ęłaÅ›) na gałąź %[1]s %[2]s +subscribe.issue.guest.tooltip = Zaloguj siÄ™ by subskrybować to zgÅ‚oszenie. +subscribe.pull.guest.tooltip = Zaloguj siÄ™ by subskrybować ten pull request. +broken_message = Dane Git powiÄ…zane z tym repozytorium nie mogÄ… zostać odczytane. Skontaktuj siÄ™ z administratorem tej instacji lub usuÅ„ to repozytorium. +invisible_runes_line = `Ta linia zawiera niewidoczne znaki Unicode` +ambiguous_runes_header = `Ten plik zawiera niejednoznaczne znaki Unicode` +ambiguous_runes_line = `Ta linia zawiera niejednoznaczne znaki Unicode` +ambiguous_character = `%[1]c [U+%04[1]X] może być pomylone z %[2]c [U+%04[2]X]` +view_git_blame = Zobacz git blame +executable_file = Plik wykonywalny +commit.contained_in_default_branch = Ten commit jest częściÄ… gałęzi domyÅ›lnej +commit.load_referencing_branches_and_tags = Wczytaj gałęzie i tagi odnoszÄ…ce siÄ™ do tego commitu +no_eol.tooltip = Ten plik nie zawiera na koÅ„cowego znaku koÅ„ca linii. +editor.new_patch = Nowy patch +editor.fail_to_update_file = Nie udaÅ‚o siÄ™ zaktualizować/utworzyć pliku "%s". +commits.nothing_to_compare = Te gałęzie sÄ… takie same. +commits.ssh_key_fingerprint = Odcisk klucza SSH +projects.card_type.desc = PodglÄ…d karty +issues.choose.ignore_invalid_templates = NieprawidÅ‚owe szablony zostaÅ‚y zignorowane +issues.closed_by_fake = przez %[2]s zostaÅ‚ zamkniÄ™ty %[1]s +issues.num_reviews_few = %d recenzje +issues.label_archive = Zarchiwizuj etykietÄ™ +issues.num_participants_one = %d uczestnik +issues.unpin_issue = Odepnij zgÅ‚oszenie +issues.pin_comment = przypiÄ…Å‚ to %s +issues.due_date_modified = zmieniÅ‚ termin realizacji z %[2]s na %[1]s %[3]s +issues.dependency.issue_no_dependencies = Brak ustawionych zależnoÅ›ci. +issues.dependency.no_permission_n = Nie masz uprawnieÅ„ do odczytu %d zależnoÅ›ci +issues.dependency.issue_batch_close_blocked = Nie można zamknąć wybranych zgÅ‚oszeÅ„, ponieważ zgÅ‚oszenie #%d nadal ma otwarte zależnoÅ›ci +issues.reference_link = Odniesienie: %s +issues.blocked_by_user = Nie możesz utworzyć zgÅ‚oszeÅ„ w tym repozytorium ponieważ jesteÅ› zablokowany(-a) przez wÅ‚aÅ›ciciela repozytorium. +pulls.view = Zobacz pull request +issues.summary_card_alt = Podsumowanie karty zgÅ‚oszenia zatytuÅ‚owanego "%s" w repozytorium %s +pulls.edit.already_changed = Nie można zapisać zmian pull requestu. WyglÄ…da na to, że zawartość zostaÅ‚a już zmieniona przez innego użytkownika. ProszÄ™ odÅ›wież stronÄ™ i spróbuj edytować ponownie by uniknąć nadpisania ich zmian +pulls.expand_files = RozwiÅ„ wszystkie pliki +pulls.merged_success = Pull request scalony pomyÅ›lnie i zamkniÄ™ty +pulls.viewed_files_label = %[1]d / %[2]d plików zobaczonych +pulls.closed = Pull request zamkniÄ™ty +pulls.blocked_by_outdated_branch = Ten pull request jest zablokowany ponieważ jest przedawniony. +pulls.blocked_by_changed_protected_files_1 = Ten pull request jest zablokowany ponieważ wprowadza zmiany do chronionego pliku: +pulls.push_rejected_no_message = WypchniÄ™cie nie powiodÅ‚o siÄ™: WypchniÄ™cie zostaÅ‚o odrzucone, ale nie otrzymano zdalnej wiadomoÅ›ci. Sprawdź hooki Git dla tego repozytorium.= +pulls.commit_ref_at = `odniósÅ‚ siÄ™ do tego pull requesta z commita %[2]s` +pulls.cmd_instruction_checkout_desc = Ze swojego repozytorium projektu, utwórz nowÄ… gałąź i przetestuj zmiany. +pulls.clear_merge_message_hint = Wyczyszczenie wiadomoÅ›ci scalenia usunie tylko treść wiadomoÅ›ci commitu pozostawiajÄ…c wygenerowane przez git dopiski takie jak "Co-Authored-By ...". +pulls.delete_after_merge.head_branch.insufficient_branch = Nie masz uprawnieÅ„ by usunąć head gałęzi. +pulls.delete.title = Usunąć ten pull request? +milestones.update_ago = Zaktualizowano %s +comments.edit.already_changed = Nie można zapisać zmian komentarza. WyglÄ…da na to, że zawartość zostaÅ‚a już zmieniona przez innego użytkownika. ProszÄ™ odÅ›wież stronÄ™ i spróbuj edytować ponownie by uniknąć nadpisania ich zmian +milestones.new_subheader = Kamienie milowe mogÄ… pomóc organizować zgÅ‚oszenia i Å›ledzić ich postÄ™p. +milestones.filter_sort.latest_due_date = Najdalszy termin realizacji +signing.wont_sign.always = Commity sÄ… zawsze podpisywane. +signing.wont_sign.pubkey = Ten commit nie bÄ™dzie podpisany ponieważ nie posiadasz żadnego klucza publicznego powiÄ…zanego z twoim kontem. +signing.wont_sign.twofa = Musisz mieć włączone uwierzytelnianie dwuskÅ‚adnikowe by móc podpisywać commity. +signing.wont_sign.parentsigned = Ten commit nie bÄ™dzie podpisany ponieważ commit rodzic nie jest podpisany. +signing.wont_sign.basesigned = To scalenie nie bÄ™dzie podpisane ponieważ commit bazowy nie jest podpisany. +signing.wont_sign.commitssigned = To scalenie nie bÄ™dzie podpisane ponieważ wszystkie powiÄ…zane commity nie sÄ… podpisane. +signing.wont_sign.approved = To scalenie nie bÄ™dzie podpisane ponieważ pull request nie zostaÅ‚ zatwierdzony. +wiki.page_title = TytuÅ‚ strony +wiki.page_content = Treść strony +wiki.page_name_desc = Wprowadź nazwÄ™ dla tej strony Wiki. Niektóre ze specjalnych nazw to: "Home", "_Sidebar" i "_Footer". +wiki.original_git_entry_tooltip = Zobacz oryginalny plik Git zamiast korzystać z przyjaznych linków. +activity.navbar.code_frequency = CzÄ™stotliwość kodu +activity.navbar.pulse = Puls +activity.published_prerelease_label = Wersja WstÄ™pna +activity.published_tag_label = Tag +contributors.contribution_type.filter_label = Rodzaj kontrybucji: +contributors.contribution_type.additions = Dodania +contributors.contribution_type.deletions = UsuniÄ™cia +settings.federation_apapiurl = URL federacji tego repozytorium. Skopiuj i wklej do UstawieÅ„ Federacji innego repozytorium jako URL Åšledzonego Repozytorium. +settings.mirror_settings.docs.disabled_pull_mirror.instructions = Ustaw swój projekt żeby automatycznie wypychaÅ‚ commity, tagi i gałęzie do innego repozytorium. Kopie lustrzane typu pull zostaÅ‚y wyłączone przez twojego administratora strony. +settings.mirror_settings.docs.disabled_push_mirror.instructions = Skonfiguruj swój projekt żeby automatycznie pullowaÅ‚ commity, tagi i gałęzie z innego repozytorium. +settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning = W tym momencie, ta akcja może zostać wykonana tylko poprzez menu "Nowa Migracja". Po wiÄ™cej informacji, proszÄ™ sprawdź: +settings.mirror_settings.docs.doc_link_title = W jaki sposób mogÄ™ utworzyć kopie lustrzane repozytoriów? +settings.mirror_settings.docs.pulling_remote_title = Pobieranie ze zdalnego repozytorium +settings.mirror_settings.docs.doc_link_pull_section = sekcja "Pulling from a remote repository" w dokumentacji. +settings.mirror_settings.pushed_repository = WypchniÄ™te repozytorium +settings.mirror_settings.push_mirror.edit_sync_time = Edytuj interwaÅ‚ synchronizacji kopii lustrzanej +settings.mirror_settings.push_mirror.none_ssh = Brak +settings.units.add_more = Włącz wiÄ™cej +settings.wiki_globally_editable = Pozwól każdemu edytować wiki +settings.pull_mirror_sync_in_progress = W tym momencie zmiany sÄ… pobierane z repozytorium zdalnego %s. +settings.push_mirror_sync_in_progress = W tym momencie zmiany sÄ… wypychane do repozytorium zdalnego %s. +settings.tracker_issue_style.regexp_pattern_desc = Pierwsza odnaleziona grupa bÄ™dzie użyta zamiast {index}. +settings.pulls.default_delete_branch_after_merge = UsuÅ„ domyÅ›lnie gałąź pull requesta po scaleniu +settings.pulls.enable_autodetect_manual_merge = Włącz automatyczne wykrycie rÄ™cznego scalenia (Uwaga: W niektórych specjalnych przypadkach wykrycie bÄ™dzie nieprawidÅ‚owe) +settings.pulls.allow_rebase_update = Włącz aktualizowanie gałęzi pull requesta przez zmianÄ™ bazy +settings.releases_desc = Włącz wydania repozytorium +settings.packages_desc = Włącz rejestr pakietów repozytorium +settings.actions_desc = Włącz zintegrowane procesy CI/CD z Forgejo Actions +settings.admin_indexer_commit_sha = Ostatni zaindeksowany commit +settings.new_owner_blocked_doer = ZostaÅ‚eÅ›(-aÅ›) zablokowany przez nowego wÅ‚aÅ›ciciela. +settings.reindex_requested = Ponowne indeksowanie zażądane +settings.transfer_quota_exceeded = Nowy wÅ‚aÅ›ciciel (%s) przekracza limit. Repozytorium nie zostaÅ‚o przekazane. +settings.wiki_rename_branch_main = Normalizuj nazwÄ™ gałęzi Wiki +settings.wiki_rename_branch_main_desc = ZmieÅ„ gałąź używanÄ… wewnÄ™trznie przez Wiki jako "%s". Ta zmiana jest permanentna i nie może zostać cofniÄ™ta. +settings.wiki_rename_branch_main_notices_1 = Ta operacja NIE MOÅ»E zostać cofniÄ™ta. +settings.wiki_rename_branch_main_notices_2 = To permanentnie zmieni nazwÄ™ wewnÄ™trznej gałęzi wiki dla repozytorium %s. IstniejÄ…ce checkouty bÄ™dÄ… musiaÅ‚y zostać zaktualizowane. +settings.wiki_branch_rename_failure = Nie udaÅ‚o siÄ™ znormalizować nazwy gałęzi wiki dla repozytorium. +settings.confirm_wiki_branch_rename = ZmieÅ„ gałąź wiki +settings.update_settings_no_unit = Repozytorium powinno pozwalać na jakÄ…kolwiek interakcjÄ™. +settings.add_collaborator_owner = Nie można dodać wÅ‚aÅ›ciciela jako współpracownika. +settings.webhook.replay.description = Uruchom ponownie ten webhook. +settings.webhook.replay.description_disabled = By uruchomić ponownie ten webhook, aktywuj go. +settings.event_pull_request_review_request = ProÅ›by o recenzjÄ™ +settings.event_pull_request_review_request_desc = Recenzja pull requesta zostaÅ‚a poproszona lub proÅ›ba o recenzjÄ™ zostaÅ‚a usuniÄ™ta. +settings.event_pull_request_approvals = Zatwierdzenia pull requesta +settings.event_package_desc = Pakiet utworzony lub usuniÄ™ty w repozytorium. +settings.add_web_hook_desc = Zintegruj %s ze swoim repozytorium. +settings.event_pull_request_enforcement = Egzekwowanie +settings.protect_enable_merge = Włącz scalanie +settings.protect_status_check_patterns = Wzory weryfikacji stanu +settings.protect_invalid_status_check_pattern = NieprawidÅ‚owy wzór weryfikacji stanu: "%s". +settings.ignore_stale_approvals_desc = Nie licz zatwierdzeÅ„ które zostaÅ‚y wykonane na starszych commitach (przestarzaÅ‚e recenzje) do iloÅ›ci zatwierdzeÅ„ które dany pull request posiada. Nie ma znaczenia gdy przestarzaÅ‚e recenzje sÄ… już odrzucone. +settings.remove_protected_branch_failed = UsuniÄ™cie reguÅ‚y ochrony gałęzi "%s" nie powiodÅ‚o siÄ™. +settings.protect_unprotected_file_patterns_desc = Niechronione pliki które mogÄ… zostać zmienione bezpoÅ›rednio jeÅ›li użytkownik jest uprawniony do zapisu, pomijajÄ…c ograniczenie wypchnięć. Kilka wzorów może być oddzielone przy użyciu Å›rednika (";"). Zobacz skÅ‚adniÄ™ wzorów w dokumentacji %[2]s. PrzykÅ‚ady: .drone.yml, /docs/**/*.txt. +settings.block_on_official_review_requests = Blokuj scalanie przy oficjalnych proÅ›bach o recenzje +settings.tags.protection.pattern.description = Możesz użyć pojedynczej nazwy, wzór glob lub wyrażenia regularnego by okreÅ›lić kilka tagów. Przeczytaj wiÄ™cej w przewodniku chronionych tagów. +settings.unarchive.header = Odarchiwizuj to repo +settings.rename_branch_success = Zmiana nazwy gałęzi z %s na %s zakoÅ„czona pomyÅ›lnie. +settings.rename_branch = ZmieÅ„ nazwÄ™ gałęzi +diff.show_more = Pokaż wiÄ™cej +diff.load = Wczytaj diff +pulls.cmd_instruction_hint = Zobacz instrukcje wiersza poleceÅ„ +settings.thread_id = ID wÄ…tku +diff.comment.add_line_comment = Dodaj komentarz do linii +branch.restore_success = Gałąź "%s" zostaÅ‚a przywrócona. +branch.restore = Przywróć gałąź "%s" +branch.default_deletion_failed = Gałąź "%s" jest domyÅ›lnÄ… gałęziÄ…. Nie może zostać usuniÄ™ta. +branch.download = Pobierz gałąź "%s" +commit.contained_in = Ten commit jest zawarty w: +pulls.allow_edits_from_maintainers_err = Aktualizowanie nie powiodÅ‚o siÄ™ +pulls.collapse_files = ZwiÅ„ wszystkie pliki +issues.comment.blocked_by_user = Nie możesz utworzyć komentarza do tego zgÅ‚oszenia ponieważ jesteÅ› zablokowany(-a) przez wÅ‚aÅ›ciciela repozytorium lub autora zgÅ‚oszenia. +pulls.switch_comparison_type = ZmieÅ„ rodzaj porównania +settings.branch_filter_desc = BiaÅ‚a lista gałęzi na wydarzenia wypchniÄ™cia, tworzenie gałęzi i usuwanie gałęzi, okreÅ›lone wzorem glob. Jeżeli puste lub *, raportowane bÄ™dÄ… wydarzenia wszystkich gałęzi. Sprawdź skÅ‚adniÄ™ w dokumentacji %[2]s. PrzykÅ‚ady: master, {master,release*}. +settings.remove_protected_branch_success = Ochrona gałęzi dla reguÅ‚y "%s" zostaÅ‚a usuniÄ™ta. +diff.git-notes.add = Dodaj notatkÄ™ +diff.git-notes.remove-header = UsuÅ„ notatkÄ™ +diff.git-notes.remove-body = Ta notatka zostanie usuniÄ™ta. +editor.push_out_of_date = To wypchniÄ™cie wyglÄ…da na nieaktualne. +editor.file_already_exists = Plik o nazwie "%s" już istnieje w tym repozytorium. +editor.filename_is_invalid = Nazwa pliku jest nieprawidÅ‚owa: "%s". +editor.branch_already_exists = Gałąź "%s" już istnieje w tym repozytorium. +editor.directory_is_a_file = Nazwa katalogu "%s" jest już użyta jako nazwa pliku w tym repozytorium. +branch.delete = UsuÅ„ gałąź "%s" +wiki.search = Szukaj na wiki +activity.commit = Aktywność commitów +release.tag_helper_new = Nowy tag. Ten tag bÄ™dzie utworzony z wydania docelowego. +release.download_count_one = %s pobranie +branch.deletion_failed = Nie udaÅ‚o siÄ™ usunąć gałęzi "%s". +pulls.merged_by_fake = przez %[2]s zostaÅ‚ scalony %[1]s +settings.admin_stats_indexer = Indekser statystyk kodu +issues.role.contributor_helper = Ten użytkownik już wczeÅ›niej dodaÅ‚ commity do tego repozytorium. +signing.will_sign = Ten commit zostanie podpisany kluczem "%s". +signing.wont_sign.error = WystÄ…piÅ‚ błąd podczas sprawdzenia czy commit mógÅ‚ zostać podpisany. +signing.wont_sign.never = Commity nie sÄ… nigdy podpisywane. +editor.update = Aktualizuj %s +issues.edit.already_changed = Nie można zapisać zmian zgÅ‚oszenia. WyglÄ…da na to, że zawartość zostaÅ‚a już zmieniona przez innego użytkownika. ProszÄ™ odÅ›wież stronÄ™ i spróbuj edytować ponownie by uniknąć nadpisania ich zmian +issues.choose.invalid_templates = %v nieprawidÅ‚owy(-e) szablon(y) znaleziony(-e) +mirror_use_ssh.helper = Forgejo bÄ™dzie wykonywać kopiÄ™ lustrzanÄ… repozytorium przy użyciu Git przez SSH i utworzy parÄ™ kluczy dla ciebie kiedy wybierzesz tÄ™ opcjÄ™. Musisz najpierw upewnić siÄ™, że wygenerowany klucz publiczny jest upoważniony do wypychania na repozytorium docelowe. Nie możesz korzystać z autoryzacji opartej na haÅ›le przy wyborze tej opcji. +commit.cherry-pick-header = Cherry-pick: %s +ext_issues = ZewnÄ™trzne zgÅ‚oszenia +commit.cherry-pick-content = Wybierz gałąź na której wykonać cherry-pick: +projects.column.new_submit = Utwórz kolumnÄ™ +projects.column.set_default = Ustaw jako domyÅ›lnÄ… +projects.column.delete = UsuÅ„ kolumnÄ™ +projects.column.set_default_desc = Ustaw tÄ™ kolumnÄ™ jako domyÅ›lnÄ… dla niekategoryzowanych zgÅ‚oszeÅ„ i pullów +settings.default_update_style_desc = DomyÅ›lny styl aktualizacji użyty do aktualizowania pull requestów które sÄ… w tyle za gałęziÄ… głównÄ…. +settings.transfer.modal.title = PrzenieÅ› wÅ‚aÅ›cicielstwo +settings.protect_branch_name_pattern_desc = Wzory nazwy gałęzi chronionej. Zobacz skÅ‚adniÄ™ wzorów w dokumentacji. PrzykÅ‚ady: main, release/** +settings.merge_style_desc = Style scalania +editor.delete = UsuÅ„ %s +editor.branch_does_not_exist = Gałąź "%s" nie istnieje w tym repozytorium. +pulls.close = Zamknij pull request +pulls.sign_in_require = Zaloguj siÄ™ by utworzyć nowy pull request. +pulls.show_all_commits = Pokaż wszystkie commity +pulls.show_changes_since_your_last_review = Pokaż zmiany od ostatniej twojej recenzji +pulls.showing_only_single_commit = Pokazywane tylko zmiany commita %[1]s +pulls.allow_edits_from_maintainers_desc = Użytkownicy z uprawnieniem zapisu do gałęzi głównej mogÄ… również wypychać do tej gałęzi +pulls.showing_specified_commit_range = Pokazywane tylko zmiany miÄ™dzy %[1]s..%[2]s +pulls.filter_changes_by_commit = Filtruj commitem +pulls.nothing_to_compare_have_tag = Wybrana gałąź/tag sÄ… takie same. +pulls.has_pull_request = `Pull request miÄ™dzy tymi gałęziami już istnieje: %[2]s#%[3]d` +settings.wiki_branch_rename_success = Gałąź wiki dla repozytorium zostaÅ‚a znormalizowana pomyÅ›lnie. +settings.web_hook_name_larksuite_only = Lark Suite +settings.packagist_api_token = Token API +issues.force_push_codes = `wymusiÅ‚(a) wypchniÄ™cie %[1]s z %[2]s do %[4]s %[6]s` +issues.filter_label_select_no_label = Brak etykiety +issues.filter_project_all = Wszystkie projekty +issues.filter_type.reviewed_by_you = Recenzowane przez ciebie +issues.role.owner_helper = Ten użytkownik jest wÅ‚aÅ›cicielem tego repozytorium. +issues.author.tooltip.issue = Ten użytkownik jest autorem tego zgÅ‚oszenia. +pulls.has_viewed_file = Zobaczone +pulls.head_out_of_date = Scalanie nie powiodÅ‚o siÄ™: W trakcie generowanie scalania, head zostaÅ‚ zaktualizowany. Wskazówka: Spróbuj ponownie. +settings.federation_not_enabled = Federacja nie jest włączona na twojej instancji. +settings.mirror_settings.docs = Skonfiguruj swoje repozytorium by automatycznie synchronizowaÅ‚o commity, tagi i gałęzie z innym repozytorium. +settings.mirror_settings.docs.more_information_if_disabled = Możesz dowiedzieć siÄ™ wiÄ™cej o wypychajÄ…cych i pobierajÄ…cych kopiach lustrzanych tutaj: +settings.enter_repo_name = Wprowadź wÅ‚aÅ›ciciela i nazwÄ™ repozytorium dokÅ‚adnie jak pokazane: +settings.graphql_url = URL GraphQL +issues.num_reviews_one = %d recenzja +mirror_address_protocol_invalid = Wprowadzony URL jest nieprawidÅ‚owy. Tylko lokacje http(s):// lub git:// mogÄ… zostać użyte do kopii lustrzanych. +blame.ignore_revs = PominiÄ™to zmiany w .git-blame-ignore-revs. Kliknij tutaj by ominąć i zobaczyć normalny widok blame. +blame.ignore_revs.failed = Nie udaÅ‚o siÄ™ pominąć zmian w .git-blame-ignore-revs. +commits.search_branch = Ta gałąź +projects.desc = ZarzÄ…dzaj zgÅ‚oszeniami i pullami w panelu projektu. +settings.unarchive.success = Repo zostaÅ‚o odarchiwizowane pomyÅ›lnie. +settings.unarchive.text = Odarchiwizowanie repo przywróci możliwość otrzymywania commitów i wypchnięć, jak i również nowych zgÅ‚oszeÅ„ i pull requestów. +mirror_interval = InterwaÅ‚ kopii lustrzanej (prawidÅ‚owe jednostki czasu to "h", "m", "s"). 0 wyłącza okresowÄ… synchronizacjÄ™. (Minimalny interwaÅ‚: %s) +editor.revert = Przywróć %s na: +milestones.filter_sort.name = Nazwa +commits.browse_further = PrzeglÄ…daj dalej +migrate_options_mirror_helper = To repozytorium bÄ™dzie kopiÄ… lustrzanÄ… +editor.add_tmpl.filename = nazwa pliku +editor.filename_is_a_directory = Nazwa pliku "%s" jest już użyta jako nazwa katalogu w tym repozytorium. +editor.file_deleting_no_longer_exists = Usuwany plik, "%s", już nie istnieje w tym repozytorium. +editor.file_editing_no_longer_exists = Edytowany plik, "%s", już nie istnieje w tym repozytorium. +editor.commit_id_not_matching = Plik zostaÅ‚ zmieniony podczas twojej edycji. Utwórz commit na nowej gałęzi, a nastÄ™pnie scal. +editor.push_rejected = Zmiana zostaÅ‚a odrzucona przez serwer. ProszÄ™ sprawdź hooki Git. +editor.upload_files_to_dir = Wgraj pliki do "%s" +editor.cannot_commit_to_protected_branch = Nie można dodać commita do gałęzi chronionej "%s". +issues.review.add_review_requests = poprosiÅ‚ o recenzje od %[1]s %[2]s +issues.review.remove_review_requests = cofnÄ…Å‚ proÅ›by o recenzje do %[1]s %[2]s +issues.review.outdated_description = Treść zostaÅ‚a zmieniona od momentu kiedy ten komentarz zostaÅ‚ utworzony +issues.review.option.show_outdated_comments = Pokaż przedawnione komentarze +issues.start_tracking_short = Wystartuj zegar +pulls.clear_merge_message = Wyczyść wiadomość scalenia +ext_wiki = ZewnÄ™trzna Wiki +settings.add_webhook.invalid_path = Åšcieżka nie może zawierać części która jest "." lub ".." lub pustym ciÄ…giem znaków. Nie może rozpoczynać siÄ™ i koÅ„czyć ukoÅ›nikiem. +settings.githooks_desc = Hooki Git sÄ… częściÄ… samego Git. Możesz edytować pliki hooków poniżej by skonfigurować wÅ‚asne operacje. +pulls.status_checks_hide_all = Ukryj wszystkie kontrole +pulls.status_checks_show_all = Pokaż wszystkie kontrole +pulls.reopen_failed.head_branch = Pull request nie może zostać ponownie otworzony, ponieważ head gałęzi już nie istnieje. +pulls.auto_merge_has_pending_schedule = %[1]s zaplanowaÅ‚ by ten pull request zostaÅ‚ automatycznie scalony kiedy wszystkie weryfikacje odniosÄ… sukces %[2]s. +pulls.auto_merge_not_scheduled = Ten pull request nie jest zaplanowany do automatycznego scalenia. +pulls.auto_merge_canceled_schedule = Automatyczne scalenie byÅ‚o anulowane dla tego pull requestu. +pulls.delete_after_merge.head_branch.is_default = Head gałęzi który chcesz usunąć jest gałęziÄ… domyÅ›lnÄ… i nie może zostać usuniÄ™ty. +pulls.delete_after_merge.head_branch.is_protected = Head gałęzi który chcesz usunąć jest gałęziÄ… chronionÄ… i nie może zostać usuniÄ™ty. +settings.protected_branch_required_rule_name = Wymagana nazwa reguÅ‚y +settings.protected_branch_duplicate_rule_name = Już istnieje reguÅ‚a dla tego zbioru gałęzi +release.summary_card_alt = Karta podsumowania wydania zatytuÅ‚owanego "%s" w repozytorium %s +settings.archive.text = Zarchiwizowanie tego repo sprawi, że bÄ™dzie ono w caÅ‚oÅ›ci tylko do odczytu. BÄ™dzie ukryte z pulpitu. Nikt (nawet ty!) nie bÄ™dzie mógÅ‚ utworzyć nowych commitów, lub otworzyć jakichkolwiek zgÅ‚oszeÅ„ lub pull requestów. +settings.unarchive.button = Odarchiwizuj repo +commits.view_single_diff = Zobacz zmiany tego pliku wprowadzone w tym commicie +tag.ahead.target = do %s od tego tagu +settings.matrix.room_id_helper = ID Pokoju może być pozyskane z klienta przeglÄ…darkowego Element > Ustawienia pokoju > Zaawansowane > WewnÄ™trzne ID pokoju. PrzykÅ‚ad: %s. +settings.matrix.access_token_helper = Zalecane jest skonfigurowanie dedykowany konta Matrix. Token dostÄ™pu może zostać pozyskany z przeglÄ…darkowego klienta Element (w zakÅ‚adce incognito/prywatnej) > Menu użytkownika (lewy górny róg) > Wszystkie ustawienia > Pomoc i O aplikacji > Zaawansowane > Token dostÄ™pu (zaraz pod URL Serwera domowego). Zamknij zakÅ‚adkÄ™ incognito/prywatnÄ… (wylogowanie siÄ™ unieważniÅ‚oby ten token). +pulls.editable = Edytowalne +pulls.editable_explanation = Ten pull request zezwala na edycje przez opiekunów. Możesz uczestniczyć w nim bezpoÅ›rednio. [graphs] +component_loading = Wczytywanie %s... +component_loading_failed = Nie można wczytać %s +component_loading_info = To może trochÄ™ zająć… +code_frequency.what = czÄ™stotliwość kodu +component_failed_to_load = WydarzyÅ‚ siÄ™ niespodziewany błąd. +contributors.what = kontrybucje +recent_commits.what = ostatnie commity [org] org_name_holder=Nazwa organizacji @@ -2197,21 +2915,21 @@ settings.labels_desc=Dodaj etykiety, które mogÄ… być używane w zgÅ‚oszeniach members.membership_visibility=Widoczność czÅ‚onkostwa: members.public=Widoczny -members.public_helper=ukryj +members.public_helper=Ukryj members.private=Ukryty -members.private_helper=pokaż -members.member_role=Rola: +members.private_helper=Pokaż +members.member_role=Rola czÅ‚onka: members.owner=WÅ‚aÅ›ciciel members.member=CzÅ‚onek members.remove=UsuÅ„ members.leave=Opuść -members.leave.detail=OpuÅ›cić %s? +members.leave.detail=Czy jesteÅ› pewien(-na), że chcesz opuÅ›cić organizacjÄ™ "%s"? members.invite_desc=Dodaj nowego czÅ‚onka do %s: members.invite_now=ZaproÅ› teraz teams.join=Dołącz teams.leave=Opuść -teams.leave.detail=OpuÅ›cić %s? +teams.leave.detail=Czy jesteÅ› pewien(-na), że chcesz opuÅ›cić zespół "%s"? teams.can_create_org_repo=Tworzenie repozytoriów teams.can_create_org_repo_helper=CzÅ‚onkowie mogÄ… tworzyć nowe repozytoria w organizacji. Twórca otrzyma uprawnienia administracyjne do nowego repozytorium. teams.read_access=Przeczytane @@ -2231,7 +2949,7 @@ teams.delete_team_desc=UsuniÄ™cie zespoÅ‚u wycofa dostÄ™p do repozytorium jego c teams.delete_team_success=Zespół zostaÅ‚ usuniÄ™ty. teams.read_permission_desc=Ten zespół udziela dostÄ™pu z odczytem: czÅ‚onkowie mogÄ… wyÅ›wietlać i klonować repozytoria zespoÅ‚u. teams.write_permission_desc=Ten zespół udziela dostÄ™pu z zapisem: czÅ‚onkowie mogÄ… wyÅ›wietlać i wypychać zmiany do repozytoriów zespoÅ‚u. -teams.admin_permission_desc=Ten zespół udziela dostÄ™pu administratora: czÅ‚onkowie mogÄ… wyÅ›wietlać i wypychać zmiany oraz dodawać współpracowników do repozytoriów zespoÅ‚u. +teams.admin_permission_desc=Ten zespół udziela dostÄ™pu Administratora: czÅ‚onkowie mogÄ… wyÅ›wietlać i wypychać zmiany oraz dodawać współpracowników do repozytoriów zespoÅ‚u. teams.create_repo_permission_desc=Dodatkowo, ten zespół otrzyma uprawnienie Tworzenie repozytoriów: jego czÅ‚onkowie mogÄ… tworzyć nowe repozytoria w organizacji. teams.repositories=Repozytoria zespoÅ‚u teams.search_repo_placeholder=Szukaj repozytorium… @@ -2251,6 +2969,26 @@ teams.all_repositories_write_permission_desc=Ten zespół nadaje uprawnienie Administratora
      do wszystkich repozytoriów: jego członkowie mogą odczytywać, przesyłać oraz dodawać innych współtwórców do repozytoriów. teams.write_access = Zapis code = Kod +open_dashboard = Otwórz pulpit +form.name_reserved = Nazwa organizacji "%s" jest zarezerwowana. +follow_blocked_user = Nie możesz obserwować tej organizacji ponieważ ta organizacja ciebie zablokowała. +settings.change_orgname_prompt = Uwaga: Zmiana nazwy organizacji zmieni również URL twojej organizacji i udostępni starą nazwę. +form.name_pattern_not_allowed = Wzór "%s" nie jest dozwolony w nazwie organizacji. +settings.email = E-mail kontaktowy +teams.general_access_helper = Uprawnienia członków będą określane na podstawie poniższej tabeli uprawnień. +members.remove.detail = Usunąć %[1]s z %[2]s? +teams.none_access_helper = Opcja "brak dostępu" dotyczy tylko repozytoriów prywatnych. +teams.general_access = Niestandardowy dostęp +teams.add_nonexistent_repo = Repozytorium które próbujesz dodać nie istnieje, proszę je najpierw utworzyć. +teams.invite_team_member.list = Oczekujące zaproszenia +settings.change_orgname_redirect_prompt.with_cooldown.few = Stara nazwa organizacji będzie dostępna dla każdego po okresie ochrony wynoszącym %[1]d dni, możesz nadal odzyskać starą nazwę podczas okresu ochrony. +settings.change_orgname_redirect_prompt.with_cooldown.one = Stara nazwa organizacji będzie dostępna dla każdego po okresie ochrony wynoszącym %[1]d dzień, możesz nadal odzyskać starą nazwę podczas okresu ochrony. +teams.invite_team_member = Zaproś do %s +settings.visibility.limited = Ograniczona (widoczne tylko dla zalogowanych użytkowników) +teams.none_access = Brak dostępu +teams.invite.title = Zostałeś(-aś) zaproszony(-a) do dołączenia do zespołu %s w organizacji %s. +teams.invite.by = Zaproszony(-a) przez %s +teams.invite.description = Proszę kliknij przycisk poniżej by dołączyć do zespołu. [admin] dashboard=Pulpit @@ -2259,7 +2997,7 @@ organizations=Organizacje repositories=Repozytoria hooks=Weebhook'i authentication=Źródła uwierzytelniania -emails=Emaile użytkowników +emails=E-maile użytkowników config=Konfiguracja notices=Powiadomienia systemu monitor=Monitorowanie @@ -2298,13 +3036,13 @@ dashboard.archive_cleanup=Usuń stare archiwa repozytoriów dashboard.deleted_branches_cleanup=Wyczyść usunięte galęzie dashboard.git_gc_repos=Wykonaj zbieranie śmieci ze wszystkich repozytoriów dashboard.resync_all_sshkeys=Zaktualizuj plik '.ssh/authorized_keys' z kluczami SSH Forgejo. -dashboard.resync_all_sshprincipals=Zaktualizuj plik '.ssh/authorized_keys' z kluczami SSH Forgejo. +dashboard.resync_all_sshprincipals=Zaktualizuj plik ".ssh/authorized_principals" z podmiotami SSH Forgejo. dashboard.resync_all_hooks=Ponownie synchronizuj hooki pre-receive, update i post-receive we wszystkich repozytoriach dashboard.reinit_missing_repos=Ponownie zainicjalizuj wszystkie brakujące repozytoria Git, dla których istnieją rekordy dashboard.sync_external_users=Synchronizuj zewnętrzne dane użytkownika dashboard.cleanup_hook_task_table=Oczyść tabelę hook_task -dashboard.server_uptime=Uptime serwera -dashboard.current_goroutine=Bieżące Goroutines +dashboard.server_uptime=Czas pracy serwera +dashboard.current_goroutine=Bieżące goroutines dashboard.current_memory_usage=Bieżące użycie pamięci dashboard.total_memory_allocated=Całkowita przydzielona pamięć dashboard.memory_obtained=Pamięć uzyskana @@ -2336,7 +3074,7 @@ dashboard.delete_old_actions=Usuń wszystkie stare akcje z bazy danych dashboard.delete_old_actions.started=Usuwanie wszystkich starych akcji z bazy danych rozpoczęte. users.user_manage_panel=Zarządzanie kontami użytkowników -users.new_account=Nowy użytkownik +users.new_account=Utwórz konto użytkownika users.name=Nazwa użytkownika users.full_name=Imię i nazwisko users.activated=Aktywny @@ -2346,7 +3084,7 @@ users.2fa=2FA users.repos=Repozytoria users.created=Utworzony users.last_login=Ostatnie logowanie -users.never_login=Nigdy nie zalogował(-a) się +users.never_login=Nigdy nie zalogował(a) się users.send_register_notify=Wyślij użytkownikowi powiadomienie o rejestracji users.edit=Edytuj users.auth_source=Źródło uwierzytelniania @@ -2357,12 +3095,12 @@ users.update_profile_success=Konto użytkownika zostało zaktualizowane. users.edit_account=Edytuj konto użytkownika users.max_repo_creation=Maksymalna ilość repozytoriów users.max_repo_creation_desc=(Wpisz -1, aby użyć domyślnego globalnego limitu.) -users.is_activated=Konto użytkownika jest aktywne -users.prohibit_login=Wyłącz logowanie -users.is_admin=Jest administratorem -users.is_restricted=Jest ograniczone +users.is_activated=Aktywne konto +users.prohibit_login=Zawieszone konto +users.is_admin=Konto administratora +users.is_restricted=Ograniczone konto users.allow_git_hook=Może tworzyć hooki Gita -users.allow_git_hook_tooltip=Git Hook'i są wykonywane jako użytkownik systemu operacyjnego obsługujący Forgejo i będą miały taki sam poziom dostępu jak host. W rezultacie użytkownicy z tym specjalnym przywilejem Git Hook mogą uzyskać dostęp i modyfikować wszystkie repozytoria Forgejo oraz bazę danych używaną przez Forgejo. W związku z tym są oni również w stanie zdobyć uprawnienia administratora Forgejo. +users.allow_git_hook_tooltip=Hooki Git są wykonywane jako użytkownik systemu operacyjnego obsługujący Forgejo i będą miały taki sam poziom dostępu jak host. W rezultacie użytkownicy z tym specjalnym przywilejem Git hook mogą uzyskać dostęp i modyfikować wszystkie repozytoria Forgejo oraz bazę danych używaną przez Forgejo. W związku z tym są oni również w stanie zdobyć uprawnienia administratora Forgejo. users.allow_import_local=Może importować lokalne repozytoria users.allow_create_organization=Może tworzyć organizacje users.update_profile=Zaktualizuj konto użytkownika @@ -2375,7 +3113,7 @@ users.list_status_filter.is_active=Aktywne users.list_status_filter.is_admin=Administrator users.list_status_filter.is_restricted=Ograniczone -emails.email_manage_panel=Zarządzanie adresami email +emails.email_manage_panel=Zarządzanie adresami e-mail emails.primary=Podstawowy emails.activated=Aktywowany emails.filter_sort.email=E-mail @@ -2387,7 +3125,7 @@ emails.not_updated=Nie udało się zaktualizować żądanego adresu e-mail: %v emails.duplicate_active=Ten e-mail jest już aktywny dla innego użytkownika. emails.change_email_header=Aktualizuj właściwości adresu e-mail -orgs.org_manage_panel=Zarządzanie organizacją +orgs.org_manage_panel=Zarządzanie organizacjami orgs.name=Nazwa orgs.teams=Zespoły orgs.members=Członkowie @@ -2411,11 +3149,11 @@ packages.type=Typ packages.repository=Repozytorium packages.size=Rozmiar -defaulthooks=Domyślne Webhooki +defaulthooks=Domyślne webhooki defaulthooks.add_webhook=Dodaj domyślny Webhook defaulthooks.update_webhook=Zaktualizuj domyślny Webhook -systemhooks=Webhooki Systemowe +systemhooks=Webhooki systemowe systemhooks.add_webhook=Dodaj Webhook Systemowy systemhooks.update_webhook=Aktualizuj Webhook Systemowy @@ -2449,7 +3187,7 @@ auths.search_page_size=Rozmiar strony auths.filter=Filtr użytkownika auths.admin_filter=Filtr administratora auths.restricted_filter=Filtr ograniczenia -auths.restricted_filter_helper=Pozostaw puste, aby nie ustawiać żadnych użytkowników jako ograniczonych. Użyj gwiazdki ('*'), aby ustawić wszystkich użytkowników, którzy nie pasują do Filtra Administratora jako ograniczonych. +auths.restricted_filter_helper=Pozostaw puste, aby nie ustawiać żadnych użytkowników jako ograniczonych. Użyj gwiazdki ('*'), aby ustawić wszystkich użytkowników, którzy nie pasują do filtra Administratora jako ograniczonych. auths.ms_ad_sa=Atrybuty wyszukiwania MS AD auths.smtp_auth=Typ uwierzytelnienia SMTP auths.smtphost=Serwer SMTP @@ -2509,9 +3247,9 @@ auths.deletion_success=Źródło uwierzytelniania zostało usunięte. auths.login_source_of_type_exist=Źródło uwierzytelniania tego typu już istnieje. config.server_config=Konfiguracja serwera -config.app_name=Tytuł strony +config.app_name=Tytuł instancji config.app_ver=Wersja Forgejo -config.app_url=Podstawowy adres URL Forgejo +config.app_url=Podstawowy adres URL config.custom_conf=Ścieżka do pliku konfiguracyjnego config.custom_file_root_path=Ścieżka główna plików niestandardowych config.offline_mode=Tryb lokalny @@ -2568,7 +3306,7 @@ config.default_allow_create_organization=Domyślnie zezwalaj na tworzenie organi config.enable_timetracking=Włącz śledzenie czasu config.default_enable_timetracking=Domyślnie włącz śledzenie czasu config.default_allow_only_contributors_to_track_time=Zezwalaj wyłącznie współpracownikom na śledzenie czasu -config.no_reply_address=Ukryta domena e-mail +config.no_reply_address=Domena ukrytych e-maili config.default_visibility_organization=Domyślna widoczność dla nowych organizacji config.default_enable_dependencies=Domyślne włączanie zależności zgłoszeń @@ -2609,19 +3347,19 @@ config.cookie_life_time=Czas ważności ciasteczka config.picture_config=Konfiguracja obrazu i awataru config.picture_service=Usługa obrazów config.disable_gravatar=Wyłącz Gravatar -config.enable_federated_avatar=Włącz sfederowane awatary +config.enable_federated_avatar=Włącz federowane awatary config.git_config=Konfiguracja Git -config.git_disable_diff_highlight=Wyłączyć wyróżnianie składni diff -config.git_max_diff_lines=Maksymalna liczba linii diff (dla pojedynczego pliku) -config.git_max_diff_line_characters=Maksymalna liczba znaków diff (dla pojedynczego pliku) -config.git_max_diff_files=Maksymalna liczba plików diff (które zostaną wyświetlone) +config.git_disable_diff_highlight=Wyłącz wyróżnianie składni diff +config.git_max_diff_lines=Maksymalna liczba linii diff na plik +config.git_max_diff_line_characters=Maksymalna liczba znaków diff na linię +config.git_max_diff_files=Maksymalna liczba plików diff config.git_gc_args=Argumenty GC config.git_migrate_timeout=Limit czasu migracji config.git_mirror_timeout=Limit czasu aktualizacji kopii lustrzanej config.git_clone_timeout=Limit czasu operacji klonowania config.git_pull_timeout=Limit czasu dla operacji pull -config.git_gc_timeout=Limit czasu usuwania śmieci +config.git_gc_timeout=Limit czasu operacji GC config.log_config=Konfiguracja dziennika config.disabled_logger=Wyłączone @@ -2650,8 +3388,8 @@ monitor.queue.name=Nazwa monitor.queue.type=Typ monitor.queue.exemplar=Przykładowy typ monitor.queue.numberworkers=Liczba procesów pracujących -monitor.queue.maxnumberworkers=Maksymalna liczba procesów pracujących -monitor.queue.settings.title=Ustawienia Puli +monitor.queue.maxnumberworkers=Maksymalna Liczba procesów pracujących +monitor.queue.settings.title=Ustawienia puli monitor.queue.settings.maxnumberworkers=Maksymalna liczba procesów pracujących monitor.queue.settings.maxnumberworkers.placeholder=Obecnie %[1]d monitor.queue.settings.maxnumberworkers.error=Maksymalna liczba procesów pracujących musi być liczbą @@ -2659,7 +3397,7 @@ monitor.queue.settings.submit=Aktualizuj ustawienia monitor.queue.settings.changed=Zaktualizowano ustawienia notices.system_notice_list=Powiadomienia systemu -notices.view_detail_header=Pokaż szczegóły powiadomienia +notices.view_detail_header=Szczegóły powiadomienia notices.select_all=Wybierz wszystkie notices.deselect_all=Odznacz wszystkie notices.inverse_selection=Odwróć wybór @@ -2688,6 +3426,127 @@ users.remote = Zdalnie users.list_status_filter.reset = Zresetuj config_summary = Podsumowanie config_settings = Ustawienia +assets = Zasoby kodu +dashboard.cleanup_packages = Wyczyść przedawnione pakiety +dashboard.delete_old_system_notices = Usuń wszystkie stare powiadomienia systemowe z bazy danych +users.details = Szczegóły użytkownika +emails.deletion_success = Adres e-mail został usunięty. +emails.delete_primary_email_error = Nie możesz usunąć głównego adresu e-mail. +users.purge_help = Wymusza usunięcie użytkownika razem z jakimikolwiek repozytoriami, organizacjami, oraz pakietami których ten użytkownik jest właścicielem. Wszystkie komentarze i zgłoszenia przez tego użytkownika również zostaną usunięte. +dashboard.sync_branch.started = Synchronizacja gałęzi rozpoczęta +dashboard.cancel_abandoned_jobs = Anuluj porzucone prace akcji +users.reserved = Zarezerwowane +dashboard.task.cancelled = Zadanie: %[1]s anulowane: %[3]s +dashboard.sync_repo_branches = Synchronizuj pominięte gałęzie z danych Git do bazy danych +dashboard.sync_repo_tags = Synchronizuj tagi z danych Git do bazy danych +settings = Ustawienia administratora +dashboard.stop_zombie_tasks = Zatrzymaj zadania zombi akcji +users.cannot_delete_self = Nie możesz usunąć sam(a) siebie +packages.cleanup.success = Pomyślnie wyczyszczono przedawnione dane +dashboard.sync_tag.started = Synchronizacja tagu rozpoczęta +users.list_status_filter.not_restricted = Nie ograniczony +users.list_status_filter.is_prohibit_login = Zabroń logowania +users.list_status_filter.not_prohibit_login = Zezwól na logowanie +users.list_status_filter.is_2fa_enabled = 2FA włączone +dashboard.gc_lfs = Wywołaj GC na metaobiektach LFS +dashboard.stop_endless_tasks = Zatrzymaj niekończące się zadania akcji +repos.lfs_size = Wielkość LFS +packages.package_manage_panel = Zarządzaj pakietami +dashboard.cleanup_actions = Wyczyść przedawnione logi i artefakty z akcji +dashboard.rebuild_issue_indexer = Przebuduj indekser zgłoszeń +users.new_success = Konto użytkownika "%s" zostało utworzone. +users.purge = Pozbądź się użytkownika +users.activated.description = Zakończenie weryfikacji e-mail. Właściciel nieaktywowanego konta nie będzie mógł się zalogować dopóki weryfikacja e-mail nie została zakończona. +users.block.description = Zablokuj użytkownikowi możliwości interakcji z tym serwisem przez jego konto i zabroń logowania się. +users.admin.description = Nadaj temu użytkownikowi pełen dostęp do wszystkich funkcji administracyjnych dostępnych przez interfejs przeglądarkowy lub API. +users.restricted.description = Zezwól tylko na interakcje z repozytoriami i organizacjami do których ten użytkownik został dodany jako współpracownik. To uniemożliwia dostęp do publicznych repozytoriów na tej instancji. +users.local_import.description = Zezwól na importowanie repozytoriów z lokalnego systemu plików serwera. To może być problemem zabezpieczeń. +users.organization_creation.description = Zezwól na tworzenie nowych organizacji. +users.still_own_packages = Ten użytkownik nadal jest właścicielem jednego lub więcej pakietów, usuń najpierw te pakiety. +users.list_status_filter.not_admin = Nie administrator +users.list_status_filter.not_2fa_enabled = 2FA wyłączone +emails.change_email_text = Czy jesteś pewien(-na), że chcesz zaktualizować ten adres e-mail? +emails.delete = Usuń E-mail +emails.delete_desc = Czy jesteś pewien(-na), że chcesz usunąć ten adres e-mail? +packages.total_size = Wielkość całkowita: %s +packages.unreferenced_size = Nieodniesiona wielkość: %s +packages.cleanup = Wyczyść przedawnione dane +defaulthooks.desc = Webhooki automatycznie wykonują żądania HTTP POST do serwera kiedy pewne wydarzenia Forgejo zostają wywołane. Webhooki zdefiniowane tutaj są domyślne i będą kopiowane do wszystkich nowych repozytoriów. Przeczytaj więcej w przewodniku webhooków. +dashboard.new_version_hint = Forgejo %s jest już dostępne, w tej chwili korzystasz z %s. Sprawdź szczegóły na blogu. +identity_access = Tożsamość i dostęp +dashboard.cron.cancelled = Cron: %[1]s anulowany: %[3]s +config.domain = Domena serwera +monitor.queue.activeworkers = Aktywne procesy pracujące +monitor.queue.settings.remove_all_items = Usuń wszystkie +monitor.queue.settings.desc = Pule rosną dynamicznie w odpowiedzi na blokadę kolejki procesów pracujących. +config.mailer_config = Konfiguracja Mailer +auths.tip.gitea = Zarejestruj nową aplikację OAuth2. Przewodnik można znaleźć na %s +auths.unable_to_initialize_openid = Nie można zainicjalizować Dostawcy Uwierzytelniania OpenID Connect: %s +auths.force_smtps = Wymuś SMTPS +auths.helo_hostname = Nazwa hosta HELO +self_check = Autoweryfikacja +config.mailer_enable_helo = Włącz HELO +monitor.queue.settings.remove_all_items_done = Wszystkie elementy w kolejce zostały usunięte. +auths.tips.gmail_settings = Ustawienia Gmail: +auths.map_group_to_team_removal = Usuń użytkowników z synchronizowanych zespołów jeżeli użytkownik nie należy do odpowiadającej grupy LDAP +auths.enable_ldap_groups = Włącz grupy LDAP +auths.map_group_to_team = Odwzorowywuj grupy LDAP na zespoły Organizacji (pozostaw pole puste by pominąć) +config.test_mail_sent = Testowy e-mail został wysłany do "%s". +config.cache_test_slow = Test pamięci podręcznej zakończony powodzeniem, jednak odpowiedź była wolna: %s. +auths.verify_group_membership = Weryfikuj przynależność do grupy w LDAP (pozostaw filtr pusty by pominąć) +monitor.stacktrace = Stacktrace +monitor.download_diagnosis_report = Pobierz raport diagnostyczny +auths.skip_local_two_fa_helper = Pozostawienie tej opcji jako odznaczonej oznacza, że użytkownicy lokalni z aktywowanym 2FA nadal będą musieli przejść 2FA by móc się zalogować +config.app_slogan = Slogan instancji +config.test_mail_failed = Nie udało się wysłać testowego e-maila do "%s": %v +config.mailer_use_dummy = Testowa +config.cache_test_failed = Nie udało się zbadać pamięci podręcznej: %v. +config.cache_test = Przetestuj Pamięć Podręczną +monitor.processes_count = %d Procesów +monitor.queue.numberinqueue = Liczba w kolejce +monitor.queue.review_add = Sprawdź / dodaj procesy pracujące +self_check.no_problem_found = Nie znaleziono jeszcze żadnych problemów. +config.cache_test_succeeded = Test pamięci podręcznej zakończony powodzeniem, otrzymano odpowiedź w ciągu %s. +auths.login_source_exist = Źródło uwierzytelniania "%s" już istnieje. +auths.new_success = Uwierzytelnianie "%s" została dodana. +config.app_data_path = Ścieżka danych aplikacji +systemhooks.desc = Webhooki automatycznie tworzą zapytania HTTP POST do serwera, kiedy następują pewne zdarzenia w Forgejo. Zdefiniowane tutaj webhooki będą oddziaływać na wszystkie repozytoria tego systemu, zatem proszę rozważ ich możliwy wpływ na wydajność. Przeczytaj o tym więcej w przewodniku o webhookach. +auths.force_smtps_helper = SMTPS jest zawsze używane na porcie 465. Zaznacz tę opcję by wymusić SMTPS na innych portach. (W przeciwnym wypadku dla innych portów zostanie użyte STARTTLS gdy jest wspierane przez hosta.) +auths.default_domain_name = Domyślna nazwa domeny używana do adresu e-mail +config.allow_dots_in_usernames = Zezwól użytkownikom na użycie kropek w ich nazwach użytkowników. Nie wpływa na już istniejące konta. +config.open_with_editor_app_help = Edytory dostępne w menu klonowania "Otwórz przy pomocy". Jeżeli pozostawione puste, ustawienie domyślne będzie użyte. Rozwiń by zobaczyć ustawienie domyślne. +monitor.duration = Okres (s) +config.ssh_domain = Domena serwera SSH +config.mailer_smtp_addr = Host SMTP +auths.tip.gitlab_new = Zarejestruj nową aplikację na %s +auths.oauth2_scopes = Dodatkowe zakresy +auths.tips.oauth2.general.tip = Podczas rejestrowania nowego uwierzytelniania OAuth2, callback/przekierowanie URL powinno być: +auths.oauth2_group_claim_name = Nazwa oświadczenia określającego nazwy grup dla tego źródła. (Opcjonalne) +dashboard.update_migration_poster_id = Aktualizuj ID autora migracji +config.access_log_template = Szablon dziennika dostępu +dashboard.start_schedule_tasks = Uruchomienie zaplanowanych zadań akcji +config.logger_name_fmt = Dziennik: %s +self_check.database_collation_case_insensitive = Baza danych korzysta z układu sortowania %s, dla którego nie ma znaczenia wielkość liter. Mimo, że Forgejo mógłoby działać z tym ustawieniem poprawnie, mogą wydarzyć się rzadkie przypadki, które nie będą działać zgodnie z oczekiwaniami. +auths.helo_hostname_helper = Nazwa hosta wysyłana z HELO. Aby wysłać bieżącą nazwę hosta, pozostaw puste. +dashboard.update_checker = Sprawdzanie aktualizacji +auths.oauth2_required_claim_name_helper = Ustaw tę nazwę by ograniczyć logowanie z tego źródła dla użytkowników z oświadczeniem o tej nazwie +auths.group_attribute_list_users = Atrybut grupy zawierający listę użytkowników +auths.attribute_avatar = Atrybut awatara +config.set_setting_failed = Ustawienie %s nie powiodło się +auths.oauth2_tenant = Dzierżawa +auths.oauth2_map_group_to_team_removal = Usuń użytkowników z synchronizowanych zespołów jeżeli użytkownik nie należy do odpowiadającej grupy. +auths.oauth2_required_claim_value_helper = Ustaw tę nazwę by ograniczyć logowanie z tego źródła dla użytkowników z oświadczeniem o tej nazwie i wartości +auths.oauth2_restricted_group = Wartość oświadczenia grupy dla użytkowników ograniczonych. (Opcjonalne - wymaga nazwy oświadczenia powyżej) +auths.oauth2_map_group_to_team = Odwzorowywuj grupy oświadczenia na zespoły organizacji (Opcjonalne - wymaga nazwy oświadczenia powyżej) +auths.invalid_openIdConnectAutoDiscoveryURL = Niepoprawny URL Auto Discovery (musi to być poprawny URL rozpoczynający się od http:// lub https://) +self_check.database_fix_mysql = Dla użytkowników MySQL/MariaDB, możesz użyć polecenia "forgejo doctor convert" by naprawić problemy układu sortowania. Możesz też naprawić problem przez ręczne użycie kwerend SQL "ALTER ... COLLATE ...". +auths.oauth2_required_claim_name = Nazwa wymaganego oświadczenia +auths.oauth2_required_claim_value = Wymagana wartość oświadczenia +auths.oauth2_admin_group = Wartość oświadczenia grupy dla administratorów. (Opcjonalne - wymaga nazwy oświadczenia powyżej) +auths.group_search_base = Podstawowy DN do wyszukiwania grup +auths.user_attribute_in_group = Atrybut użytkownika w grupie +self_check.database_collation_mismatch = Wymagaj by baza danych korzystała z układu sortowania: %s +self_check.database_inconsistent_collation_columns = Baza danych korzysta z układu sortowania %s, ale te kolumny korzystają z niedopasowanych układów sortowania. Może to spowodować nieoczekiwane problemy. [action] @@ -2701,6 +3560,27 @@ compare_commits=Porównaj %d commitów compare_commits_general=Porównaj commity mirror_sync_delete=synchronizuje i usuwa odwołanie %[2]s w %[3]s z kopii lustrzanej review_dismissed_reason=Powód: +auto_merge_pull_request = `automatycznie scalił(a) pull request %[3]s#%[2]s` +starred_repo = dał(a) gwiazdkę %[2]s +create_pull_request = `utworzył(a) pull request %[3]s#%[2]s` +comment_issue = `skomentował(a) zgłoszenie %[3]s#%[2]s` +mirror_sync_create = zsynchronizował(a) nowe odniesienie %[3]s do %[4]s z kopii lustrzanej +reject_pull_request = `zasugerował(a) zmiany dla %[3]s#%[2]s` +publish_release = `wydał %[4]s na %[3]s` +comment_pull = `skomentował(a) pull request %[3]s#%[2]s` +review_dismissed = `odrzucił(a) recenzję od %[4]s dla %[3]s#%[2]s` +close_pull_request = `zamknął(-ęła) pull request %[3]s#%[2]s` +reopen_pull_request = `otworzył(a) ponownie pull request %[3]s#%[2]s` +merge_pull_request = `scalił(a) pull request %[3]s#%[2]s` +approve_pull_request = `zatwierdził(a) %[3]s#%[2]s` +create_branch = utworzył(a) gałąź %[3]s in %[4]s +watched_repo = zaczął(-ęła) obserwować %[2]s +push_tag = wypchnął tag %[3]s do %[4]s +mirror_sync_push = zsynchronizował commity do %[3]s na %[4]s z kopii lustrzanej +create_issue = `otworzył(a) zgłoszenie %[3]s#%[2]s` +close_issue = `zamknął(-ęła) zgłoszenie %[3]s#%[2]s` +reopen_issue = `otworzył(a) ponownie zgłoszenie %[3]s#%[2]s` +commit_repo = wypchnął(-ęła) do %[3]s na %[4]s [tool] now=teraz @@ -2738,7 +3618,9 @@ pin=Przypnij powiadomienie mark_as_read=Oznacz jako przeczytane mark_as_unread=Oznacz jak nieprzeczytane mark_all_as_read=Oznacz wszystkie jako przeczytane -subscriptions = Subskrybcje +subscriptions = Subskrypcje +no_subscriptions = Brak subskrypcji +watching = Obserwowane [gpg] default_key=Podpisano domyślnym kluczem @@ -2746,8 +3628,8 @@ error.extract_sign=Nie udało się wyłuskać podpisu error.generate_hash=Nie udało się wygenerować skrótu dla commitu error.no_committer_account=Brak konta powiązanego z adresem e-mail autora error.no_gpg_keys_found=Nie znaleziono w bazie danych klucza dla tego podpisu -error.not_signed_commit=Commit nie podpisany -error.failed_retrieval_gpg_keys=Nie udało się odzyskać żadnego klucza powiązanego z kontem autora +error.not_signed_commit=Commit niepodpisany +error.failed_retrieval_gpg_keys=Nie udało się uzyskać żadnego klucza powiązanego z kontem autora error.probable_bad_signature=OSTRZEŻENIE! Pomimo istnienia klucza z takim ID w bazie, nie weryfikuje on tego commita! Ten commit jest PODEJRZANY. error.probable_bad_default_signature=OSTRZEŻENIE! Pomimo, że domyślny klucz posiada to ID, nie weryfikuje on tego commita! Ten commit jest PODEJRZANY. @@ -2788,14 +3670,169 @@ debian.repository.components = Komponenty container.labels.value = Wartość npm.dependencies = Zależności rpm.repository.architectures = Architektury +owner.settings.chef.keypair.description = Para kluczy jest konieczna do uwierzytelnienia do rejestru Chef. Jeżeli wygenerowałeś(-aś) parę kluczy wcześniej, generowanie nowej pary kluczy porzuci starą parę kluczy. +maven.install2 = Uruchom z wiersza poleceń: +settings.delete = Usuń pakiet +assets = Zasoby +helm.registry = Skonfiguruj ten rejestr z wiersza poleceń: +helm.install = By zainstalować ten pakiet, wykonaj następujące polecenie: +alt.install = Zainstaluj pakiet +alt.repository.multiple_groups = Ten pakiet jest dostępny w wielu grupach. +settings.delete.description = Usunięcie pakietu jest operacją permanentną i nie może zostać cofnięte. +nuget.registry = Skonfiguruj ten rejestr z wiersza poleceń: +conda.registry = Skonfiguruj ten rejestr jako repozytorium Conda w twoim pliku .condarc: +search_in_external_registry = Szukaj w %s +settings.delete.notice = Za moment usuniesz %s (%s). Ta operacja jest nieodwracalna, jesteś pewien(-na)? +settings.delete.success = Pakiet został usunięty. +settings.delete.error = Nie udało się usunąć pakietu. +debian.registry = Skonfiguruj ten rejestr z wiersza poleceń: +debian.repository = Informacje o repozytorium +generic.download = Pobierz pakiet z wiersza poleceń: +go.install = Zainstaluj pakiet z wiersza poleceń: +maven.registry = Skonfiguruj ten rejestr w twoim pliku projektu pom.xml: +npm.install = By zainstalować ten pakiet przy użyciu npm, wykonaj następujące polecenie: +npm.dependencies.optional = Zależności opcjonalne +alt.setup = Dodaj repozytorium do listy połączonych repozytoriów (wybierz wymaganą architekturę zamiast '_arch_'): +alt.repository.architectures = Architektury +alpine.install = By zainstalować ten pakiet, wykonaj następujące polecenie: +conan.install = By zainstalować ten pakiet przy użyciu Conan, wykonaj następujące polecenie: +composer.install = By zainstalować ten pakiet przy użyciu Composer, wykonaj następujące polecenie: +npm.dependencies.peer = Zależności rówieśnicze +owner.settings.chef.keypair = Wygeneruj parę kluczy +owner.settings.cleanuprules.success.update = Reguła czyszczenia została zaktualizowana. +chef.registry = Skonfiguruj ten rejestr w twoim pliku ~/.chef/config.rb: +rubygems.install2 = lub dodaj to do Gemfile: +about = O tym pakiecie +published_by_in = Opublikowano %[1]s przez %[3]s w %[5]s +published_by = Opublikowano %[1]s przez %[3]s +npm.registry = Skonfiguruj ten rejestr w pliku projektu .npmrc: +rpm.repository.multiple_groups = Ten pakiet jest dostępny w wielu grupach. +rpm.repository = Informacje o repozytorium +alpine.registry = Skonfiguruj ten rejestr dodając url do twojego pliku /etc/apk/repositories: +cargo.registry = Skonfiguruj ten rejestr w pliku konfiguracyjnym Cargo (na przykład ~/.cargo/config.toml): +nuget.install = By zainstalować ten pakiet przy użyciu NuGet, wykonaj następujące polecenie: +rpm.distros.suse = na dystrybucjach opartych o SUSE +npm.dependencies.bundle = Dołączone zależności +rubygems.required.ruby = Wymaga wersji Ruby +rubygems.required.rubygems = Wymaga wersji RubyGem +arch.version.groups = Grupa +arch.version.depends = Zależności +arch.version.optdepends = Opcjonalne zależności +composer.registry = Skonfiguruj ten rejestr w twoim pliku ~/.composer/config.json: +conda.install = By zainstalować ten pakiet przy użyciu Conda, wykonaj następujące polecenie: +container.details.type = Rodzaj obrazu +rpm.distros.redhat = na dystrybucjach opartych o RedHat +filter.no_result = Twój filtr nie dał żadnych wyników. +registry.documentation = Więcej informacji o rejestrze %s znajdziesz w dokumentacji. +empty.repo = Czy wgrałeś pakiet, ale nie jest tutaj wyświetlany? Odwiedź ustawienia pakietów i powiąż go z tym repozytorium. +empty.documentation = Więcej informacji o rejestrze przekietów znajdziesz w dokumentacji. +alpine.repository = Informacje o repozytorium +arch.pacman.helper.gpg = Dodaj certyfikat zaufania do pacmana: +alpine.registry.key = Pobierz klucz publiczny RSA rejestru do folderu /etc/apk/keys/ by zweryfikować podpis indeksu: +arch.pacman.sync = Synchronizuj pakiet przy użyciu pacman: +arch.version.checkdepends = Zależności weryfikacji +arch.version.conflicts = Konflikty +cargo.install = By zainstalować ten pakiet przy użyciu Cargo, wykonaj następujące polecenie: +chef.install = By zainstalować ten pakiet, wykonaj następujące polecenie: +debian.install = By zainstalować ten pakiet, wykonaj następujące polecenie: +maven.download = By pobrać zależność, wykonaj w wierszu poleceń: +npm.install2 = lub dodaj to do pliku package.json: +pub.install = By zainstalować ten pakiet przy użyciu Dart, wykonaj następujące polecenie: +maven.install = By użyć tego pakietu dołącz następującą treść w bloku dependencies w pliku pom.xml: +pypi.install = By zainstalować ten pakiet przy użyciu pip, wykonaj następujące polecenie: +rpm.registry = Skonfiguruj ten rejestr z wiersza poleceń: +rpm.install = By zainstalować ten pakiet, wykonaj następujące polecenie: +rubygems.install = By zainstalować ten pakiet przy użyciu gem, wykonaj następujące polecenie: +settings.link.description = Jeżeli połączych pakiet z repozytorium, pakiet ten będzie widoczny na liście pakietów danego repozytorium. +settings.link.success = Połączone repozytorium zostało zaktualizowane pomyślnie. +owner.settings.cleanuprules.keep.count = Pozostaw ostatnie +owner.settings.cleanuprules.keep.count.1 = 1 wersji na pakiet +owner.settings.chef.title = Rejestr Chef +conan.registry = Skonfiguruj ten rejestr z wiersza poleceń: +container.multi_arch = OS / Architektura +container.images.title = Obrazy +owner.settings.cleanuprules.keep.pattern = Pozostaw pasujące wersje +desc = Zarządzaj pakietami repozytoriów. +settings.link.button = Zaktualizuj Połączone Repozytorium +settings.link = Połącz ten pakiet z repozytorium +swift.install2 = i wykonaj następujące polecenie: +arch.version.properties = Własności wersji +arch.pacman.repo.multi.item = Konfiguracja dla %s +arch.pacman.repo.multi = %s ma tę samą wersję co w innych dystrybucjach. +arch.pacman.conf = Dodaj serwer z powiązaną dystrybucją i architekturą do /etc/pacman.conf : +versions.view_all = Pokaż wszystkie +details.documentation_site = Strona dokumentacji +details.repository_site = Strona repozytorium +arch.version.description = Opis +arch.version.provides = Zapewnia +arch.version.makedepends = Zależności budowy +container.pull = Pobierz obraz z wiersza poleceń: +container.layers = Warstwy obrazu +pypi.requires = Wymagany Python +rubygems.dependencies.runtime = Zależności czasu wykonywania +swift.registry = Skonfiguruj ten rejestr z wiersza poleceń: +alt.registry = Skonfiguruj ten rejestr z wiersza poleceń: +alt.registry.install = By zainstalować ten pakiet, wykonaj następujące polecenie: +owner.settings.cleanuprules.preview.overview = %d pakietów jest zaplanowanych do usunięcia. +owner.settings.cleanuprules.keep.count.n = %d wersji na pakiet +owner.settings.cleanuprules.remove.title = Wersje które nie pasują do tych reguł zostaną usunięte, chyba, że reguła wcześniej każe jest pozostawić. +owner.settings.cleanuprules.remove.days = Usuń wersje starsze niż +alt.repository = Informacje o repozytorium +owner.settings.cleanuprules.remove.pattern = Usuń wersje pasujące +owner.settings.cleanuprules.success.delete = Reguła czyszczenia została usunięta. +arch.version.replaces = Zamienia +arch.version.backup = Kopia zapasowa +details.project_site = Strona projektu +settings.link.error = Nie udało się zaktualizować połączonego repozytorium. +swift.install = Dodaj ten packiet do twojego pliku Package.swift: +settings.link.select = Wybierz Repozytorium +empty = Nie ma jeszcze żadnych pakietów. +cran.registry = Skonfiguruj ten rejestr w twoim pliku Rprofile.site: +cran.install = By zainstalować ten pakiet, wykonaj następujące polecenie: +owner.settings.cargo.rebuild.no_index = Nie można odbudować, żaden indeks nie jest zainicjowany. +owner.settings.cargo.title = Indeks rejestru Cargo +owner.settings.cargo.rebuild.error = Nie udało się odbudować indeksu Cargo: %v +owner.settings.cargo.rebuild.success = Indeks Cargo został odbudowany pomyślnie. +owner.settings.cleanuprules.none = Nie ma jeszcze żadnych reguł czyszczenia. +nuget.dependency.framework = Framework Docelowy +owner.settings.cleanuprules.preview = Podgląd reguły czyszczenia +owner.settings.cleanuprules.keep.pattern.container = Wersja latest jest zawsze pozostawiana dla pakietów kontenerów. +owner.settings.cargo.initialize.success = Indeks Cargo został utworzony pomyślnie. +owner.settings.cargo.rebuild = Odbuduj indeks +owner.settings.cargo.initialize.error = Nie udało się zainicjować indeksu Cargo: %v +composer.dependencies.development = Zależności programistyczne +owner.settings.cargo.initialize = Zainicjuj indeks +alpine.registry.info = Wybierz $branch i $repository z listy poniżej. +owner.settings.cleanuprules.pattern_full_match = Zastosuj wzór do pełnej nazwy pakietu +owner.settings.cleanuprules.keep.title = Wersje które pasują do tych reguł są pozostawiane, nawet jeżeli pasują do reguły usunięcia niżej. +vagrant.install = By dodać box Vagrant, wykonaj następujące polecenie: +npm.dependencies.development = Zależności programistyczne +rubygems.dependencies.development = Zależności programistyczne +owner.settings.cargo.rebuild.description = Odbudowanie może być przydatne gdy indeks nie jest synchronizowany z zapisanymi pakietami Cargo. +owner.settings.cleanuprules.title = Reguły czyszczenia +owner.settings.cleanuprules.add = Dodaj regułę czyszczenia +owner.settings.cleanuprules.edit = Edytuj regułę czyszczenia +owner.settings.cleanuprules.preview.none = Reguła czyszczenia nie pasuje do żadnego pakietu. +owner.settings.cargo.initialize.description = Specjalny indeks repozytorium Git jest potrzebny by użyć rejestru Cargo. Wybranie tej opcji utworzy/odtworzy repozytorium i skonfiguruje jest automatycznie. +container.digest = Digest +debian.registry.info = Wybierz $distribution i $component z listy poniżej. [secrets] secrets = Sekrety +deletion = Usuń sekret +creation.failed = Dodanie sekretu nie powiodło się. +description = Sekrety będą przekazane pewnym akcjom, nie mogą być odczytane inaczej. +creation.success = Secret "%s" został dodany. +creation = Dodaj Sekret +deletion.success = Sekret został usunięty. +deletion.description = Usunięcie sekretu jest permanentne i nie może zostać cofnięte. Kontynuować? +creation.value_placeholder = Wprowadź dowolną treść. Białe znaki na początku i końcu będą pominięte. +creation.name_placeholder = wielkość liter nie ma znaczenia, tylko znaki alfanumeryczne i znak podkreślenia, nie może zaczynać się od GITEA_ lub GITHUB_ +none = Nie ma jeszcze sekretów. +management = Zarządzaj sekretami +deletion.failed = Nie udało się usunąć sekretu. [actions] - - - runners.name=Nazwa runners.owner_type=Typ runners.description=Opis @@ -2824,27 +3861,100 @@ runners.version = Wersja runners.task_list.status = Status runners.labels = Etykiety status.blocked = Zablokowano +variables.id_not_exist = Zmienna o ID %d nie istnieje. +variables.edit = Edytuj Zmienną +variables.update.failed = Nie udało się zmienić zmiennej. +variables.creation.success = Zmienna "%s" została dodana. +variables.creation.failed = Nie udało się dodać zmiennej. +variables.deletion.success = Zmienna została usunięta. +variables.update.success = Zmienna została zmieniona. +variables.deletion.failed = Nie udało się usunąć zmiennej. +runs.no_workflows.help_write_access = Nie wiesz jak zacząć z Forgejo Actions? Sprawdź szybki start w dokumentacji użytkownika i napisz swój pierwszy proces pracy, a następnie skonfiguruj runnera Forgejo by wykonywał twoje zadania. +runners.reset_registration_token = Resetuj token rejestracji +runners.reset_registration_token_success = Rejestracja tokenu resetu runnera pomyślna +runners.none = Brak dostępnych runnerów +runners.delete_runner_notice = Jeżeli zadanie nadal jest wykonywane przez ten runner, zostanie ono zakończone i oznaczone jako niepowodzenie. Może to przerwać proces pracy. +variables.deletion.description = Usunięcie zmiennej jest permanentne i nie może zostać cofnięte. Kontynuować? +variables.deletion = Usuń zmienną +runners.delete_runner_failed = Nie udało się usunąć runnera +runs.no_results = Brak pasujących wyników. +runners.update_runner = Aktualizuj zmiany +runners.new_notice = Jak uruchomić runner +variables.management = Zarządzaj zmiennymi +runners.task_list.no_tasks = Nie ma jeszcze zadań. +runners.task_list = Ostatnie zadania w tym runnerze +runners.update_runner_success = Runner zaktualizowany pomyślnie +runners.update_runner_failed = Nie udało się zaktualizować runnera +runs.expire_log_message = Logi zostały oczyszczone ponieważ były za stare. +variables.none = Nie ma jeszcze zmiennych. +runs.empty_commit_message = (pusta wiadomość commita) +variables.creation = Dodaj zmienną +runners = Runnery +actions = Akcje +runners.last_online = Ostatni czas online +runners.runner_title = Runner +runners.delete_runner = Usuń ten runner +runners.delete_runner_success = Runner usunięty pomyślnie +runners.delete_runner_header = Potwierdź usunięcie tego runnera +runs.no_workflows.help_no_write_access = By dowiedzieć się o Forgejo Actions, zobacz dokumentację. +runners.edit_runner = Edytuj Runnera +variables.description = Zmienne będą przekazane pewnym akcjom, nie mogą być odczytane inaczej. +runners.runner_manage_panel = Zarządzaj runnerami +runners.new = Utwórz nowy runner +runs.no_matching_online_runner_helper = Brak pasujących runnerów online z etykietą: %s +workflow.disable = Wyłącz proces pracy +unit.desc = Zarządzaj zintegrowanymi procesami CI/CD z Forgejo Actions. +runs.all_workflows = Wszystkie procesy prac +variables.not_found = Nie udało się znaleźć zmiennej. +runs.invalid_workflow_helper = Plik konfiguracyjny procesu pracy jest nieprawidłowy. Proszę sprawdź swój plik konfiguracyjny: %s +runs.no_workflows = Nie ma jeszcze żadnych procesów pracy. +runs.no_runs = Ten proces pracy nie ma jeszcze uruchomień. +workflow.dispatch.use_from = Wykorzystaj proces pracy z +workflow.disabled = Proces pracy jest wyłączony. +workflow.enable_success = Proces pracy "%s" włączony pomyślnie. +workflow.enable = Włącz proces pracy +workflow.disable_success = Proces pracy "%s" wyłączony pomyślnie. +workflow.dispatch.run = Uruchom proces pracy +runs.no_job = Proces pracy musi posiadać chociaż jedno zadanie +runs.no_job_without_needs = Proces pracy musi zawierać chociaż jedno zadanie bez zależności. +status.running = Uruchomione +runs.workflow = Proces pracy +runners.task_list.done_at = Ukończone W +need_approval_desc = Potrzebne zatwierdzenie by móc uruchamiać procesy pracy dla pull requestów forków. +runs.pushed_by = wypchnięty przez +runs.status_no_select = Wszystkie stany +runs.actors_no_select = Wszyscy aktorzy +workflow.dispatch.success = Proces pracy został pomyślnie zażądany. +workflow.dispatch.invalid_input_type = Nieprawidłowy typ danych wejścia "%s". +workflow.dispatch.input_required = Wymagaj wartości dla danych wejścia "%s". +workflow.dispatch.warn_input_limit = Wyświetlane jest tylko pierwszych %d danych wejścia. +workflow.dispatch.trigger_found = Ten proces pracy zawiera wywołanie przy wydarzeniu workflow_dispatch. [projects] +deleted.display_name = Projekt usunięty +type-2.display_name = Projekt repozytorium +type-1.display_name = Projekt osobisty +type-3.display_name = Projekt organizacji [git.filemode] -; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … symbolic_link=Dowiązanie symboliczne executable_file = Plik wykonywalny submodule = Podmoduł directory = Katalog +changed_filemode = %[1]s → %[2]s +normal_file = Zwykły plik [search] search = Wyszukaj... type_tooltip = Typ wyszukiwania -fuzzy = Fuzzy -package_kind = Wyszukaj paczki... -fuzzy_tooltip = Uwzględnij wyniki, które również pasują do wyszukiwanego hasła +fuzzy = Przybliżone +package_kind = Wyszukaj pakiety... +fuzzy_tooltip = Uwzględnij wyniki, które są bliskie wyszukiwanemu hasłu match = Dopasuj match_tooltip = Uwzględniaj tylko wyniki pasujące do wyszukiwanego hasła repo_kind = Wyszukaj repozytoria... @@ -2861,9 +3971,49 @@ 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ędnij wyniki pasujące do dowolnego słowa kluczowego oddzielonego spacjami -exact = Dokładnie +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 problemy... +issue_kind = Wyszukaj zgłoszenia... pull_kind = Wyszukaj pull requesty... -union = Unia \ No newline at end of file +union = Unia +regexp = RegExp +regexp_tooltip = Interpretuj wyszukiwane hasło jako wyrażenie regularne + + +[markup] +filepreview.lines = Linie %[1]d do %[2]d w %[3]s +filepreview.truncated = Podgląd został przycięty +filepreview.line = Linia %[1]d w %[2]s + +[translation_meta] +test = Litwo, Ojczyzno moja! ty jesteś jak zdrowie; ile cię trzeba cenić, ten tylko się dowie, kto cię stracił. Dziś piękność twą w całej ozdobie widzę i opisuję, bo tęsknię po tobie :) + +[repo.permissions] +code.read = Odczyt: Dostęp i klonowanie kodu repozytorium. +wiki.write = Zapis: Tworzenie, edycja i usuwanie stron ze zintegrowanej wiki. +releases.write = Zapis: Publikowanie, edycja i usuwanie wydań oraz ich zasobów. +wiki.read = Odczyt: Czytanie zintegrowanej wiki oraz jej historii. +releases.read = Odczyt: Czytanie i pobieranie wydań. +pulls.read = Odczyt: Czytanie i tworzenie pull requestów. +projects.read = Odczyt: Dostęp do plansz projektu repozytorium. +issues.read = Odczyt: Odczyt i tworzenie zgłoszeń i komentarzy. +code.write = Zapis: Wypychanie do repozytorium, tworzenie gałęzi i tagów. +packages.read = Odczyt: Podgląd i pobieranie pakietów przypisanych do repozytorium. +projects.write = Zapis: Tworzenie projektów i kolumn oraz ich edycja. +packages.write = Zapis: Publikowanie i usuwanie pakietów przypisanych do repozytorium. +issues.write = Zapis: Zamykanie zgłoszeń i zarządzanie metadanymi takimi jak etykiety, kamienie milowe, osoby przypisane, terminy i zależności. +pulls.write = Zapis: Zamykanie pull requestów i zarządzanie metadanymi takimi jak etykiety, kamienie milowe, osoby przypisane, terminy i zależności. +ext_issues = Dostęp do linku kierującego do zewnętrznego dziennika zgłoszeń. Uprawnienia są zarządzane zewnętrznie. +ext_wiki = Dostęp do linku kierującego do zewnętrznej wiki. Uprawnienia są zarządzane zewnętrznie. +actions.write = Zapis: Ręczne wywołanie, restart, anulowanie lub zatwierdzenie oczekujących procesów CI/CD. +actions.read = Odczyt: Podgląd zintegrowanych procesów CI/CD i ich logów. + +[munits.data] +eib = EiB +pib = PiB +tib = TiB +gib = GiB +b = B +kib = KiB +mib = MiB \ No newline at end of file diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index a0e5acc060..2092e7e4d4 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -4,7 +4,7 @@ dashboard=Painel explore=Explorar help=Ajuda logo=Logotipo -sign_in=Acessar +sign_in=Iniciar sessão sign_in_with_provider=Entrar com %s sign_in_or=ou sign_out=Sair @@ -12,7 +12,7 @@ sign_up=Cadastrar link_account=Vincular conta register=Cadastrar version=Versão -powered_by=Desenvolvido por %s +powered_by=Oferecido por %s page=Página template=Template language=Idioma @@ -33,7 +33,7 @@ access_token=Token de acesso re_type=Confirmar senha captcha=CAPTCHA twofa=Autenticação de dois fatores -twofa_scratch=Código de backup da autenticação de dois fatores +twofa_scratch=Código de uso único da autenticação de dois fatores passcode=Senha webauthn_insert_key=Insira sua chave de segurança @@ -55,13 +55,13 @@ organization=Organização mirror=Espelhamento new_repo=Novo repositório new_migrate=Nova migração -new_mirror=Novo espelhamento +new_mirror=Novo espelho new_fork=Novo fork do repositório new_org=Nova organização new_project=Novo projeto new_project_column=Nova coluna manage_org=Gerenciar organizações -admin_panel=Administração geral +admin_panel=Administração do site account_settings=Configurações da conta settings=Configurações your_profile=Perfil @@ -76,7 +76,7 @@ forks=Forks activities=Atividades pull_requests=Pull requests -issues=Issues +issues=Problemas milestones=Marcos ok=OK @@ -109,7 +109,7 @@ preview=Pré-visualização loading=Carregando… error=Erro -error404=A página que você está tentando acessar não existe ou você não está autorizado a visualizá-la. +error404=A página que você está tentando acessar não existe, foi removida ou você não tem autorização para visualizá-la. never=Nunca unknown=Desconhecido @@ -164,6 +164,9 @@ new_org.title = Nova organização new_repo.link = Novo repositório new_migrate.link = Nova migração new_org.link = Nova organização +test = Teste +error413 = Você esgotou sua cota. +copy_path = Copiar caminho [aria] navbar=Barra de navegação @@ -195,6 +198,18 @@ buttons.ref.tooltip=Referenciar um issue ou um pull request buttons.switch_to_legacy.tooltip=Em vez disso, usar o editor legado buttons.enable_monospace_font=Habilitar fonte mono espaçada buttons.disable_monospace_font=Desabilitar fonte mono espaçada +buttons.indent.tooltip = Aninhar items em um nível +buttons.unindent.tooltip = Desaninhar items em um nível +buttons.new_table.tooltip = Adicionar tabela +table_modal.header = Adicionar tabela +table_modal.placeholder.header = Cabeçalho +table_modal.placeholder.content = Conteúdo +table_modal.label.rows = Linhas +table_modal.label.columns = Colunas +link_modal.header = Adicionar um link +link_modal.url = URL +link_modal.description = Descrição +link_modal.paste_reminder = Dica: Com uma URL na sua área de transferência, você pode colar diretamente no editor para criar um link. [filter] string.asc=A - Z @@ -213,12 +228,12 @@ server_internal = Erro interno do servidor app_desc=Um serviço de hospedagem Git amigável install=Fácil de instalar platform=Multi-plataforma -platform_desc=Forgejo roda em qualquer sistema em que Go consegue compilar: Windows, macOS, Linux, ARM, etc. Escolha qual você gosta mais! lightweight=Leve e rápido lightweight_desc=Forgejo utiliza poucos recursos e consegue mesmo rodar no barato Raspberry Pi. Economize energia elétrica da sua máquina! license=Código aberto license_desc=Está tudo no Forgejo! Contribua e torne este projeto ainda melhor. Não tenha vergonha de contribuir! install_desc = Apenas rode o binário para a sua plataforma, execute-o com Docker, ou obtenha-o empacotado. +platform_desc = Foi confirmado que o Forgejo roda em sistemas operacionais livres, como Linux e FreeBSD, assim como em diferentes arquiteturas de CPU. Escolha sua preferida! [install] install=Instalação @@ -251,7 +266,7 @@ err_admin_name_is_invalid=Nome de usuário do administrador inválido general_title=Configurações gerais app_name=Título do servidor -app_name_helper=Você pode inserir o nome da empresa aqui. +app_name_helper=Insira o nome da sua instância aqui. Ele será mostrado em todas as páginas. repo_path=Caminho raiz do repositório repo_path_helper=Todos os repositórios remotos do Git serão salvos neste diretório. lfs_path=Caminho raiz do Git LFS @@ -281,22 +296,22 @@ register_confirm=Exigir confirmação de e-mail para cadastros mail_notify=Habilitar notificações por e-mail server_service_title=Configurações do servidor e serviços de terceiros offline_mode=Habilitar modo local -offline_mode.description=Desabilitar redes de entrega de conteúdo de terceiros e entregar todos os recursos localmente. +offline_mode.description=Desabilitar redes de entrega de conteúdo (CDNs) de terceiros e fornecer todos os recursos localmente. disable_gravatar=Desabilitar o gravatar -disable_gravatar.description=Desabilitar o gravatar e avatar de fontes de terceiros. Um avatar padrão será usado a menos que um usuário localmente carrega um avatar. +disable_gravatar.description=Desabilitar o uso do Gravatar e avatar de fontes de terceiros. Um avatar padrão será usado a menos que um usuário localmente carrega um avatar. federated_avatar_lookup=Habilitar avatares federados -federated_avatar_lookup.description=Habilitar a busca federativa de avatares a usar o serviço federativo de código aberto baseado no libravatar. +federated_avatar_lookup.description=Buscar avatares usando Libravatar. disable_registration=Somente administradores podem criar novas contas -disable_registration.description=Desabilitar auto-cadastro de usuário. Somente os administradores serão capazes de criar novas contas de usuário. -allow_only_external_registration.description=Permitir cadastro somente por meio de serviços externos +disable_registration.description=Apenas administradores do servidor poderão criar novas contas. É altamente recomendado manter o cadastro desativado a não ser que deseje hospedar uma instância pública para qualquer pessoa e puder lidar com uma grande quantidade de contas de spam. +allow_only_external_registration.description=Usuários apenas poderão criar novas contas usando serviços externos que tenham sido configurados. openid_signin=Habilitar acesso via OpenID openid_signin.description=Habilitar o acesso de usuários via OpenID. openid_signup=Habilitar cadastros via OpenID -openid_signup.description=Habilitar o auto-cadastro com base no OpenID. +openid_signup.description=Permitir que os usuários criem contas com OpenID se o autorregistro estiver habilitado. enable_captcha=Habilitar CAPTCHA ao registrar enable_captcha.description=Impor validação por CAPTCHA para cadastro de usuários. require_sign_in_view=Apenas usuários logados podem visualizar páginas -require_sign_in_view.description=Limitar o acesso de página aos usuários autenticados. Os visitantes só verão as páginas de autenticação e cadastro. +require_sign_in_view.description=Limitar acesso ao conteúdo apenas aos usuários autenticados. Visitantes só poderão acessar as páginas de autenticação. admin_setting.description=Criar uma conta de administrador é opcional. O primeiro usuário cadastrado automaticamente se tornará um administrador. admin_title=Configurações da conta de administrador admin_name=Usuário @@ -317,11 +332,11 @@ save_config_failed=Falha ao salvar a configuração: %v invalid_admin_setting=Configuração da conta de administrador está inválida: %v invalid_log_root_path=Pasta raíz do log está inválida: %v default_keep_email_private=Ocultar endereços de e-mail por padrão -default_keep_email_private.description=Ocultar endereços de e-mail de novas contas de usuário por padrão. +default_keep_email_private.description=Ocultar endereços de e-mail de novas contas de usuário por padrão para que esta informação não seja vazada imediatamente após o cadastro. default_allow_create_organization=Permitir a criação de organizações -default_allow_create_organization.description=Permitir que novas contas de usuários criem organizações por padrão. +default_allow_create_organization.description=Permitir que novas contas de usuário criem organizações por padrão. Quando esta opção está desabilitada, um administrador precisa dar permissão para a criação de organizações por novos usuários. default_enable_timetracking=Habilitar o cronômetro por padrão -default_enable_timetracking.description=Habilitar o cronômetro para novos repositórios por padrão. +default_enable_timetracking.description=Habilitar o uso da funcionalidade de contagem de tempo para novos repositórios por padrão. no_reply_address=Domínio de e-mail oculto no_reply_address_helper=Nome de domínio para usuários com endereço de e-mail oculto. Por exemplo, o nome de usuário "joe" será registrado no Git como "joe@noreply.example.org" se o domínio de e-mail oculto estiver definido como "noreply.example.org". password_algorithm=Algoritmo de hash de senhas @@ -341,7 +356,7 @@ app_slogan_helper = Insira o slogan de seu servidor aqui. Deixe em branco para d [home] uname_holder=Usuário ou e-mail password_holder=Senha -switch_dashboard_context=Trocar contexto do painel de controle +switch_dashboard_context=Trocar contexto do painel my_repos=Repositórios show_more_repos=Mostrar mais repositórios… collaborative_repos=Repositórios colaborativos @@ -403,14 +418,14 @@ forgot_password_title=Esqueci minha senha forgot_password=Esqueceu sua senha? sign_up_now=Precisa de uma conta? Cadastre-se agora. sign_up_successful=A conta foi criada com sucesso. Bem-vindo! -confirmation_mail_sent_prompt=Um novo e-mail de confirmação foi enviado para %s. Por favor, verifique sua caixa de e-mail nas próximas %s horas para finalizar o processo de cadastro. +confirmation_mail_sent_prompt=Um novo email de confirmação foi enviado para %s. Para completar o processo de cadastro, por favor verifique sua caixa de entrada e acesse o link fornecido dentro de %s. Se o e-mail estiver incorreto, você pode entrar na conta e solicitar outro e-mail de confirmação para um endereço diferente. must_change_password=Redefina sua senha allow_password_change=Exigir que o usuário redefina a senha (recomendado) -reset_password_mail_sent_prompt=Um e-mail de confirmação foi enviado para %s. Por favor, verifique sua caixa de entrada dentro do(s) próximo(s) %s para concluir o processo de recuperação de conta. -active_your_account=Ativar sua conta +reset_password_mail_sent_prompt=Um e-mail de confirmação foi enviado para %s. Para concluir o processo de recuperação de conta, por favor verifique sua caixa de entrada e siga o link dentro do(s) próximo(s) %s. +active_your_account=Ative sua conta account_activated=Conta foi ativada -prohibit_login=É proibido fazer login -prohibit_login_desc=Sua conta está proibida de fazer login, entre em contato com o administrador do site. +prohibit_login=Conta está suspensa +prohibit_login_desc=Sua conta foi suspensa de interagir com o servidor. Entre em contato com a administração do servidor para recuperar o acesso. resent_limit_prompt=Você já solicitou recentemente um e-mail de ativação. Por favor, aguarde 3 minutos e tente novamente. has_unconfirmed_mail=Oi %s, você possui um endereço de e-mail não confirmado (%s). Se você não recebeu um e-mail de confirmação ou precisa reenviar um novo, clique no botão abaixo. resend_mail=Clique aqui para reenviar seu e-mail de ativação @@ -433,7 +448,7 @@ twofa_scratch_token_incorrect=Seu código de backup está incorreto. login_userpass=Acessar tab_openid=OpenID oauth_signup_tab=Cadastrar nova conta -oauth_signup_title=Completar Nova Conta +oauth_signup_title=Completar nova conta oauth_signup_submit=Completar conta oauth_signin_tab=Vincular a uma conta existente oauth_signin_title=Faça login para autorizar a conta vinculada @@ -453,7 +468,7 @@ email_domain_blacklisted=Você não pode se cadastrar com seu endereço de e-mai authorize_application=Autorizar aplicativo authorize_redirect_notice=Você será redirecionado para %s se você autorizar este aplicativo. authorize_application_created_by=Este aplicativo foi criado por %s. -authorize_application_description=Se você conceder o acesso, ele será capaz de acessar e escrever em todas as informações da sua conta, incluindo repositórios privados e organizações. +authorize_application_description=Se você conceder o acesso, isso permitirá acessar e alterar todas as informações da sua conta, incluindo repositórios privados e organizações. authorize_title=Autorizar "%s" para acessar sua conta? authorization_failed=Autorização falhou authorization_failed_desc=A autorização falhou porque detectamos uma solicitação inválida. Entre em contato com o responsável do aplicativo que você tentou autorizar. @@ -471,6 +486,9 @@ hint_register = Precisa de uma conta? Registre-se agora. sign_up_button = Registre-se agora. hint_login = Já possui uma conta? Faça login agora! sign_in_openid = Continuar com OpenID +back_to_sign_in = Voltar a Iniciar Sessão +unauthorized_credentials = As credenciais estão incorretas ou expiraram. Tente novamente o comando ou consulte %s para obter mais informações +use_onetime_code = Usar um código de uso único [mail] view_it_on=Veja em %s @@ -487,10 +505,10 @@ activate_email=Verifique seu endereço de e-mail activate_email.title=%s, por favor verifique o seu endereço de e-mail activate_email.text=Por favor clique no link a seguir para verificar o seu endereço de e-mail em %s: -register_notify=Bem-vindo ao %s +register_notify=Boas vindas a %s register_notify.title=%[1]s, bem-vindo(a) a %[2]s register_notify.text_1=este é o seu e-mail de confirmação de registro para %s! -register_notify.text_2=Você pode fazer login em sua conta utilizando o usuário: %s +register_notify.text_2=Você pode iniciar a sessão com o usuário: %s register_notify.text_3=Se outra pessoa criou esta conta para você, é preciso definir a sua senha primeiro. reset_password=Recuperar sua conta @@ -549,6 +567,12 @@ totp_disabled.subject = A autenticação em dois fatores foi desabilitada removed_security_key.subject = Uma chave de segurança foi removida removed_security_key.text_1 = A chave de segurança "%[1]s" foi removida de sua conta. account_security_caution.text_1 = Caso tenha sido você, este e-mail pode ser ignorado. +totp_enrolled.subject = Você ativou TOTP como método 2FA +totp_disabled.text_1 = A senha de uso único baseada em tempo (TOTP) na sua conta foi desativada. +totp_disabled.no_2fa = Já não existem mais outros métodos de autenticação em dois fatores (2FA) configurados, ou seja, não é mais necessário acessar sua conta com 2FA. +removed_security_key.no_2fa = Já não existem mais outros métodos de autenticação em dois fatores (2FA) configurados, ou seja, não é mais necessário acessar sua conta com 2FA. +totp_enrolled.text_1.no_webauthn = Você acabou de habilitar a TOTP para sua conta. Isso significa que para todos os acessos futuros à sua conta você deverá usar a TOTP como método de 2FA. +totp_enrolled.text_1.has_webauthn = Você acabou de habilitar a TOTP para sua conta. Isso significa que para todos os futuros acessos à sua conta você pode usar a TOTP como método de 2FA ou usar qualquer uma de suas chaves de segurança. [modal] yes=Sim @@ -660,6 +684,8 @@ required_prefix = A entrada deve começar com "%s" FullName = Nome completo Description = Descrição unset_password = O usuário de login não definiu a senha. +username_claiming_cooldown = Este nome de usuário não pode ser registrado porque o período de espera ainda não acabou. Ele poderá ser registrado em %[1]s. +email_domain_is_not_allowed = O domínio do endereço de email da conta %s está em conflito com EMAIL_DOMAIN_ALLOWLIST ou EMAIL_DOMAIN_BLOCKLIST. Certifique-se de que você colocou o endereço de email correto. [user] @@ -689,17 +715,22 @@ form.name_chars_not_allowed=O usuário "%s" contém caracteres inválidos. block_user = Bloquear usuário unblock = Desbloquear block = Bloquear -block_user.detail_2 = Este usuário não poderá interagir com seus repositórios, questões criadas e comentários. +block_user.detail_2 = Este usuário não poderá interagir com repositórios, issues ou comentários criados por você. follow_blocked_user = Você não pode seguir este usuário porque você o bloqueou ou foi bloqueado por ele. -block_user.detail_3 = Este(a) usuário(a) não poderá adicioná-lo(a) como colaborador(a), nem você poderá adicioná-lo(a) como colaborador(a). -block_user.detail = Por favor, entenda que se você bloquear este usuário, outras ações serão tomadas. Tais como: +block_user.detail_3 = Vocês não poderão adicionar um ao outro como colaboradores de um repositório. +block_user.detail = Note que bloquear um usuário tem outros efeitos, tais como: followers_one = %d seguidor -following_one = %d seguindo -block_user.detail_1 = Você deixará de seguir este usuário. +following_one = seguindo %d +block_user.detail_1 = Vocês deixarão de seguir um ao outro e não poderão mais seguir um ao outro. following.title.few = seguindo following.title.one = seguindo followers.title.one = seguidor followers.title.few = seguidores +public_activity.visibility_hint.self_private = Sua atividade está visível apenas para você e para os administradores da instância. Configurar. +public_activity.visibility_hint.self_public = Sua atividade está visível para todos, exceto interações em espaços privados. Configurar. +public_activity.visibility_hint.admin_public = Sua atividade está visível para todos, mas como um administrador você também pode ver interações em espaços privados. +public_activity.visibility_hint.admin_private = Essa atividade está visível para você porque você é um administrador, mas o usuário dejesa que ela seja mantida em privado. +public_activity.visibility_hint.self_private_profile = Sua atividade só é visível para você e para os administradores do servidor porque seu perfil é privado. Configurar. [settings] profile=Perfil @@ -721,9 +752,9 @@ uid=UID webauthn=Chaves de segurança public_profile=Perfil público -biography_placeholder=Conte-nos um pouco sobre você! (Você pode usar Markdown) +biography_placeholder=Conte um pouco sobre você! (Markdown é suportado) location_placeholder=Compartilhe sua localização aproximada com outras pessoas -profile_desc=Controle como o seu perfil é exibido para outros usuários. Seu endereço de e-mail principal será usado para notificações, recuperação de senha e operações do Git baseadas na Web. +profile_desc=Sobre você password_username_disabled=Usuários não-locais não podem alterar seus nomes de usuário. Por favor contate o administrador do site para mais informações. full_name=Nome completo website=Site @@ -780,7 +811,7 @@ old_password=Senha atual new_password=Nova senha retype_new_password=Confirme a nova senha password_incorrect=A senha atual está incorreta. -change_password_success=Sua senha foi atualizada. Acesse usando sua nova senha de agora em diante. +change_password_success=Sua senha foi atualizada. A partir de agora, use sua nova senha para acessar sua conta. password_change_disabled=Contas não-locais não podem alterar sua senha através da interface web do Forgejo. emails=Endereços de e-mail @@ -788,7 +819,7 @@ manage_emails=Gerenciar endereços de e-mail manage_themes=Tema padrão manage_openid=Endereços OpenID email_desc=Seu endereço de e-mail principal será usado para notificações, recuperação de senha e, desde que não esteja oculto, para operações do Git baseadas na Web. -theme_desc=Este será o seu tema padrão em todo o site. +theme_desc=Este tema será usado para a interface web quando você fizer login. primary=Principal activated=Ativado requires_activation=Requer ativação @@ -809,12 +840,12 @@ add_new_email=Adicionar novo endereço de e-mail add_new_openid=Adicionar novo URI OpenID add_email=Adicionar novo endereço de e-mail add_openid=Adicionar URI OpenID -add_email_confirmation_sent=Um e-mail de confirmação foi enviado para "%s". Verifique sua caixa de entrada nos próximos %s para confirmar seu endereço de e-mail. +add_email_confirmation_sent=Um e-mail de confirmação foi enviado para "%s". Para confirmar seu endereço de e-mail, verifique sua caixa de entrada e acesse o link fornecido nela em até %s. add_email_success=O novo endereço de e-mail foi adicionado. email_preference_set_success=Preferência de e-mail definida com sucesso. add_openid_success=O novo endereço de OpenID foi adicionado. keep_email_private=Ocultar endereço de e-mail -keep_email_private_popup=Isso ocultará seu endereço de e-mail do seu perfil, bem como quando você fizer um pull request ou editar um arquivo usando a interface Web. Os commits enviados não serão modificados. +keep_email_private_popup=Seu endereço de email não será exibido no seu perfil e não será o padrão para commits feitos pela interface web, como envios de arquivos, modificações e commits de merge. Em vez disso, um endereço especial %s pode ser usado para associar commits com a sua conta. Esta opção não irá afetar commits já existentes. openid_desc=OpenID permite delegar autenticação para um provedor externo. manage_ssh_keys=Gerenciar chaves SSH @@ -955,9 +986,9 @@ twofa_desc=Autenticação de dois fatores melhora a segurança de sua conta. twofa_is_enrolled=Sua conta está atualmente habilitada com autenticação de dois fatores. twofa_not_enrolled=Sua conta não está atualmente inscrita para a autenticação em duas etapas. twofa_disable=Desabilitar autenticação de dois fatores -twofa_scratch_token_regenerate=Gerar novamente o token de backup +twofa_scratch_token_regenerate=Gerar novamente o token de recuperação de uso único twofa_scratch_token_regenerated=Seu token agora é %s. Guarde-a em um local seguro, pois ela nunca mais será exibido. -twofa_enroll=Inscrever para a autenticação de dois fatores +twofa_enroll=Habilitar a autenticação de dois fatores twofa_disable_note=Você pode desabilitar a autenticação de dois fatores se necessário. twofa_disable_desc=Desabilitar a autenticação de dois fatores tornará sua conta menos segura. Tem certeza que deseja continuar? regenerate_scratch_token_desc=Se você perdeu o seu token de backup, ou teve que usá-lo para realizar um acesso, você pode redefini-lo. @@ -966,7 +997,7 @@ scan_this_image=Escaneie esta imagem com o seu aplicativo de autenticação: or_enter_secret=Ou digite esse código: %s then_enter_passcode=E insira a senha mostrada no aplicativo: passcode_invalid=Esse código de acesso é inválido. Tente novamente. -twofa_enrolled=Sua conta foi inscrita na autenticação de dois fatores. Armazene seu token de backup (%s) em um local seguro, pois ele é exibido apenas uma vez! +twofa_enrolled=Sua conta foi inscrita na autenticação de dois fatores. Armazene seu token de recuperação de uso único (%s) em um local seguro, pois ele não será exibido novamente. twofa_failed_get_secret=Falha ao obter o segredo. webauthn_desc=Chaves de segurança são dispositivos de hardware que contém chaves de criptografia. Elas podem ser usadas para autenticação de dois fatores. A chave de segurança deve suportar o padrão WebAuthnn Authenticator. @@ -998,7 +1029,7 @@ delete_account_desc=Tem certeza que deseja apagar sua conta de usuário permanen email_notifications.enable=Habilitar notificações por e-mail email_notifications.onmention=Somente quando for mencionado(a) email_notifications.disable=Desabilitar notificações por e-mail -email_notifications.submit=Atualizar preferências de e-mail +email_notifications.submit=Definir preferência de email email_notifications.andyourown=e suas próprias notificações visibility=Visibilidade do usuário @@ -1015,7 +1046,7 @@ user_block_success = O usuário foi bloqueado. twofa_recovery_tip = Caso perca o seu dispositivo, você poderá usar uma chave de uso único para recuperar o acesso à sua conta. webauthn_key_loss_warning = Caso perca as suas chaves de segurança, você perderá o acesso à sua conta. blocked_users_none = Nenhum usuário bloqueado. -access_token_desc = As permissões selecionadas para o token limitam o acesso apenas às rotas da API correspondentes. Veja a documentação para mais informações. +access_token_desc = As permissões selecionadas para o token limitam o acesso apenas às rotas da API correspondentes. Veja a documentação para mais informações. webauthn_alternative_tip = Você talvez queira configurar um método adicional de autenticação. change_password = Alterar senha hints = Dicas @@ -1024,11 +1055,42 @@ pronouns_custom = Personalizado pronouns_unspecified = Não especificado language.title = Idioma padrão additional_repo_units_hint = Sugira habilitar unidades de repositório adicionais -additional_repo_units_hint_description = Exiba um botão "Adicionar mais unidades..." para repositórios que não possuem todas as unidades disponíveis habilitadas. +additional_repo_units_hint_description = Exibir uma sugestão para "Habilitar mais" em repositórios que não possuem todas as unidades disponíveis habilitadas. update_hints = Dicas de atualização update_hints_success = As dicas foram atualizadas. keep_activity_private.description = A sua atividade pública estará visível apenas para si e para os administradores do servidor. language.localization_project = Ajude-nos a traduzir Forgejo para o seu idioma! Mais informações. +language.description = Essa língua será salva em sua conta e será usada como padrão após você iniciar a sessão. +user_block_yourself = Você não pode se bloquear. +pronouns_custom_label = Pronomes personalizados +change_username_redirect_prompt.with_cooldown.one = O nome de usuário antigo ficará disponível para qualquer pessoa após um período de espera de %[1]d dia, você ainda pode recuperar o nome de usuário antigo durante este período de espera. +change_username_redirect_prompt.with_cooldown.few = O nome de usuário antigo ficará disponível para qualquer pessoa após um período de espera de %[1]d dias, você ainda pode recuperar o nome de usuário antigo durante este período de espera. +quota.applies_to_user = As seguintes regras de cota se aplicam à sua conta +quota.rule.exceeded.helper = O tamanho total de objetos para esta regra excedeu a cota. +keep_pronouns_private = Mostrar pronomes apenas para usuários autenticados +keep_pronouns_private.description = Isto irá esconder seus pronomes de visitantes que não fizeram login. +storage_overview = Visão geral de armazenamento +quota = Cota +quota.applies_to_org = As seguintes regras de cota se aplicam a esta organização +quota.rule.exceeded = Excedido +quota.rule.no_limit = Ilimitado +quota.sizes.all = Tudo +quota.sizes.repos.all = Repositórios +quota.sizes.repos.public = Repositórios públicos +quota.sizes.repos.private = Repositórios privados +quota.sizes.git.all = Conteúdo Git +quota.sizes.git.lfs = LFS Git +quota.sizes.assets.all = Assets +quota.sizes.assets.attachments.all = Anexos +quota.sizes.assets.attachments.issues = Anexos de issue +quota.sizes.assets.attachments.releases = Anexos de release +quota.sizes.assets.artifacts = Artefatos +quota.sizes.assets.packages.all = Pacotes +quota.sizes.wiki = Wiki +regenerate_token = Regenerar +regenerate_token_success = O token foi regenerado. Aplicações que usam este token não terão mais acesso à sua conta e precisam ser atualizadas com o novo token. +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? [repo] owner=Proprietário @@ -1037,16 +1099,16 @@ repo_name=Nome do repositório repo_name_helper=Um bom nome de repositório é composto por palavras curtas, memorizáveis e únicas. repo_size=Tamanho do repositório template=Modelo -template_select=Selecione um modelo. +template_select=Selecione um modelo template_helper=Tornar repositório um modelo template_description=Os repositórios de modelo permitem que os usuários gerem novos repositórios com a mesma estrutura de diretório, arquivos e configurações opcionais. visibility=Visibilidade visibility_description=Somente o proprietário ou os membros da organização, se tiverem direitos, poderão vê-lo. visibility_helper=Tornar o repositório privado visibility_helper_forced=O administrador do site força novos repositórios a serem privados. -visibility_fork_helper=(Esta alteração irá afetar todos os forks.) +visibility_fork_helper=(Esta alteração irá afetar a visibilidade de todos os forks.) clone_helper=Precisa de ajuda com o clone? Visite a Ajuda. -fork_repo=Fork do repositório +fork_repo=Fazer fork do repositório fork_from=Fork de already_forked=Você já fez o fork de %s fork_to_different_account=Faça um fork para uma conta diferente @@ -1062,17 +1124,17 @@ generate_from=Gerar a partir de repo_desc=Descrição repo_desc_helper=Digite uma breve descrição (opcional) repo_lang=Linguagem -repo_gitignore_helper=Selecione modelos do .gitignore. +repo_gitignore_helper=Selecionar modelos de .gitignore repo_gitignore_helper_desc=Escolha os arquivos que não serão rastreados da lista de modelos para linguagens comuns. Artefatos típicos gerados pelos compiladores de cada linguagem estão incluídos no .gitignore por padrão. -issue_labels=Etiquetas de issue -issue_labels_helper=Selecione um conjunto de etiquetas de issue. +issue_labels=Etiquetas +issue_labels_helper=Selecione um conjunto de etiquetas license=Licença -license_helper=Selecione um arquivo de licença. -license_helper_desc=Uma licença define o que os outros podem e não podem fazer com o seu código. Não tem certeza qual é a mais adequada para o seu projeto? Veja Escolher uma licença. +license_helper=Selecione um arquivo de licença +license_helper_desc=Uma licença define o que os outros podem e não podem fazer com o seu código. Não tem certeza qual é a mais adequada para o seu projeto? Veja Escolher uma licença. readme=LEIA-ME -readme_helper=Selecione um modelo de arquivo LEIA-ME. +readme_helper=Selecione um modelo de arquivo README readme_helper_desc=Aqui você pode escrever uma descrição completa para o seu projeto. -auto_init=Inicializar o repositório (adicionando .gitignore, licença e LEIA-ME) +auto_init=Inicializar repositório trust_model_helper=Selecione o modelo de confiança para verificação de assinatura. As opções possíveis são: trust_model_helper_collaborator=Colaborador: Confiar em assinaturas de colaboradores trust_model_helper_committer=Committer: Confiar em assinaturas que correspondem aos committers @@ -1084,12 +1146,12 @@ default_branch_label=padrão default_branch_helper=O branch padrão é o branch base para pull requests e commits de código. mirror_prune=Varrer mirror_prune_desc=Remover referências obsoletas de controle remoto -mirror_interval=Intervalo de espelhamento (unidades válidas são 'h', 'm', ou 's'). O desabilita a sincronização automática. (Intervalo mínimo: %s) +mirror_interval=Intervalo de espelhamento (unidades válidas de tempo são "h", "m", "s"). O valor 0 desabilita a sincronização periódica. (Intervalo mínimo: %s) mirror_interval_invalid=O intervalo do espelhamento não é válido. mirror_sync_on_commit=Sincronizar quando commits forem enviados mirror_address=Clonar a partir de URL mirror_address_desc=Coloque todas as credenciais necessárias na seção de autorização. -mirror_address_url_invalid=O URL fornecido é inválido. Você deve escapar todos os componentes do URL corretamente. +mirror_address_url_invalid=A URL fornecida é inválida. Você deve escapar todos os componentes da URL corretamente. mirror_address_protocol_invalid=O URL fornecido é inválido. Somente locais http(s):// ou git:// podem ser usados para espelhamento. mirror_lfs=Armazenamento de Arquivo Grande (LFS) mirror_lfs_desc=Ativar espelhamento de dados LFS. @@ -1106,7 +1168,7 @@ forks=Forks reactions_more=e %d mais unit_disabled=O administrador do site desabilitou esta seção do repositório. language_other=Outra -adopt_search=Digite o nome de usuário para pesquisar por repositórios órfãos... (deixe em branco para encontrar todos) +adopt_search=Digite o nome de usuário para pesquisar por repositórios órfãos… (deixe em branco para encontrar todos) adopt_preexisting_label=Adotar arquivos adopt_preexisting=Adotar arquivos pré-existentes adopt_preexisting_content=Criar repositório a partir de %s @@ -1143,10 +1205,10 @@ template.issue_labels=Etiquetas de issue template.one_item=Deve-se selecionar pelo menos um item de modelo template.invalid=Deve-se selecionar um repositório de modelo -archive.title=Este repositório está arquivado. Você pode visualizar arquivos e cloná-lo, mas não pode fazer push, abrir issues ou pull requests. -archive.title_date=Este repositório foi arquivado em %s. Você pode visualizar arquivos e cloná-lo, mas não pode fazer push, abrir issues ou pull requests. -archive.issue.nocomment=Este repositório está arquivado. Você não pode comentar nas issues. -archive.pull.nocomment=Este repositório está arquivado. Você não pode comentar nos pull requests. +archive.title=Este repositório está arquivado. Você pode visualizar arquivos e cloná-lo, mas não pode fazer alterações, tais como push, novos issues, pull requests ou comentários. +archive.title_date=Este repositório foi arquivado em %s. Você pode visualizar arquivos e cloná-lo, mas não pode fazer alterações, tais como push, abrir issues, pull requests ou comentários. +archive.issue.nocomment=Este repositório está arquivado. Você não pode comentar em issues. +archive.pull.nocomment=Este repositório está arquivado. Você não pode comentar em pull requests. form.reach_limit_of_creation_1=Você já atingiu o seu limite de %d repositório. form.reach_limit_of_creation_n=Você já atingiu o limite de %d repositórios. @@ -1168,7 +1230,7 @@ migrate_items_milestones=Marcos migrate_items_labels=Etiquetas migrate_items_issues=Issues migrate_items_pullrequests=Pull requests -migrate_items_merge_requests=Requisições de merge +migrate_items_merge_requests=Pedidos de merge migrate_items_releases=Versões migrate_repo=Migrar repositório migrate.clone_address=Migrar / Clonar de URL @@ -1184,14 +1246,14 @@ migrate.migrate_items_options=Um Token de Acesso é necessário para migrar iten migrated_from=Migrado de %[2]s migrated_from_fake=Migrado de %[1]s migrate.migrate=Migrar de %s -migrate.migrating=Migrando a partir de %s ... +migrate.migrating=Migrando de %s … migrate.migrating_failed=Migração a partir de %s falhou. migrate.migrating_failed.error=Falha ao migrar: %s migrate.migrating_failed_no_addr=A migração falhou. migrate.github.description=Migre dados do servidor github.com ou GitHub Enterprise. migrate.git.description=Migrar um repositório somente de qualquer serviço Git. migrate.gitlab.description=Migrar dados de gitlab.com ou de outras instâncias do GitLab. -migrate.gitea.description=Migrar dados de gitea.com ou de outras instâncias do Gitea/Forgejo. +migrate.gitea.description=Migrar dados de gitea.com ou de outras instâncias do Gitea. migrate.gogs.description=Migrar dados de notabug.org ou de outras instâncias do Gogs. migrate.onedev.description=Migrar dados de code.onedev.io ou de outras instâncias do OneDev. migrate.codebase.description=Migrar dados de codebasehq.com. @@ -1200,9 +1262,9 @@ migrate.migrating_git=Migrando dados Git migrate.migrating_topics=Migrando tópicos migrate.migrating_milestones=Migrando marcos migrate.migrating_labels=Migrando rótulos -migrate.migrating_releases=Migrando Versões -migrate.migrating_issues=Migrando Issues -migrate.migrating_pulls=Migrando Pull Requests +migrate.migrating_releases=Migrando releases +migrate.migrating_issues=Migrando issues +migrate.migrating_pulls=Migrando pull requests migrate.cancel_migrating_title=Cancelar migração migrate.cancel_migrating_confirm=Você quer cancelar essa migração? @@ -1275,15 +1337,16 @@ ambiguous_character=`%[1]c [U+%04[1]X] é confundível com o %[2]c [U+%04[2]X]` escape_control_characters=Escapar unescape_control_characters=Desescapar file_copy_permalink=Copiar link permanente -view_git_blame=Ver Git Blame -video_not_supported_in_browser=Seu navegador não suporta a tag 'video' do HTML5. -audio_not_supported_in_browser=Seu navegador não suporta a tag 'audio' do HTML5. +view_git_blame=Ver git blame +video_not_supported_in_browser=Seu navegador não tem suporte para a tag "video" do HTML5. +audio_not_supported_in_browser=Seu navegador não tem suporte para a tag "audio" do HTML5. stored_lfs=Armazenado com Git LFS +stored_annex=Armazenado com Git Annex symbolic_link=Link simbólico executable_file=Arquivo executável commit_graph=Gráfico de commits commit_graph.select=Selecionar branches -commit_graph.hide_pr_refs=Esconder Pull Requests +commit_graph.hide_pr_refs=Esconder pull requests commit_graph.monochrome=Monocromático commit_graph.color=Colorido commit.contained_in=Esse commit está contido em: @@ -1302,6 +1365,7 @@ editor.upload_file=Enviar arquivo editor.edit_file=Editar arquivo editor.preview_changes=Pré-visualizar alterações editor.cannot_edit_lfs_files=Arquivos LFS não podem ser editados na interface web. +editor.cannot_edit_annex_files=Arquivos Annex não podem ser editados na interface web. editor.cannot_edit_non_text_files=Arquivos binários não podem ser editados na interface web. editor.edit_this_file=Editar arquivo editor.this_file_locked=Arquivo está bloqueado @@ -1311,22 +1375,23 @@ editor.delete_this_file=Excluir arquivo editor.must_have_write_access=Você deve ter permissão de escrita para fazer ou propor alterações neste arquivo. editor.file_delete_success=O arquivo "%s" foi excluído. editor.name_your_file=Nomeie o seu arquivo… -editor.filename_help=Adicione um diretório digitando seu nome seguido por uma barra ('/'). Remova um diretório digitando o backspace no início do campo de entrada. +editor.filename_help=Adicione um diretório digitando o nome seguido por uma barra ("/"). Remova um diretório pressionando apagar no início do campo de entrada. editor.or=ou editor.cancel_lower=Cancelar -editor.commit_signed_changes=Commit de alteradores assinadas -editor.commit_changes=Aplicar commit das alterações -editor.add_tmpl=Adicionar "" +editor.commit_signed_changes=Criar commit das modificações assinadas +editor.commit_changes=Criar commit das modificações +editor.add_tmpl=Adicionar "<%s>" +editor.add_tmpl.filename = nome do arquivo editor.add=Adicionar %s editor.update=Atualizar %s editor.delete=Excluir %s editor.patch=Aplicar correção editor.patching=Corrigindo: editor.fail_to_apply_patch=`Não foi possível aplicar a correção "%s"` -editor.new_patch=Nova correção +editor.new_patch=Novo patch editor.commit_message_desc=Adicione uma descrição detalhada (opcional)... editor.signoff_desc=Adicione um assinado-por-committer no final do log do commit. -editor.commit_directly_to_this_branch=Commit diretamente no branch %s. +editor.commit_directly_to_this_branch=Commit diretamente no branch %[1]s. editor.create_new_branch=Crie um novo branch para este commit e crie um pull request. editor.create_new_branch_np=Crie um novo branch para este commit. editor.propose_file_change=Propor alteração de arquivo @@ -1342,15 +1407,15 @@ editor.file_is_a_symlink=`"%s" é um link simbólico. Links simbólicos não pod editor.filename_is_a_directory=O nome do arquivo "%s" já é usado como um nome de diretório neste repositório. editor.file_editing_no_longer_exists=O arquivo que está sendo editado, "%s", não existe mais neste repositório. editor.file_deleting_no_longer_exists=O arquivo a ser excluído, "%s", não existe mais neste repositório. -editor.file_changed_while_editing=O conteúdo do arquivo mudou desde que você começou a editar. Clique aqui para ver o que foi editado ou clique em Aplicar commit das alterações novamemente para sobreescrever estas alterações. +editor.file_changed_while_editing=O conteúdo do arquivo mudou desde que você abriu o arquivo. Clique aqui para ver as diferenças ou clique em Aplicar commit das alterações novamente para sobrescrever as alterações com sua versão atual. editor.file_already_exists=Um arquivo com nome "%s" já existe neste repositório. editor.commit_empty_file_header=Fazer commit de um arquivo vazio editor.commit_empty_file_text=O arquivo que você está prestes fazer commit está vazio. Continuar? editor.no_changes_to_show=Nenhuma alteração a mostrar. editor.fail_to_update_file=Falha ao atualizar/criar arquivo "%s". editor.fail_to_update_file_summary=Mensagem de erro: -editor.push_rejected_no_message=A alteração foi rejeitada pelo servidor sem uma mensagem. Por favor, verifique os Hooks Git. -editor.push_rejected=A alteração foi rejeitada pelo servidor. Por favor, verifique os Hooks Git. +editor.push_rejected_no_message=A alteração foi rejeitada pelo servidor sem uma mensagem. Por favor, verifique os Git hooks . +editor.push_rejected=A alteração foi rejeitada pelo servidor. Por favor, verifique os Git hooks . editor.push_rejected_summary=Mensagem completa de rejeição: editor.add_subdir=Adicionar um subdiretório... editor.unable_to_upload_files=Ocorreu um erro ao enviar arquivos para "%s": %v @@ -1395,7 +1460,7 @@ commitstatus.failure=Falha commitstatus.pending=Pendente commitstatus.success=Sucesso -ext_issues=Acesso a Issues Externos +ext_issues=Issues externos ext_issues.desc=Link para o issue tracker externo. projects=Projetos @@ -1416,7 +1481,7 @@ projects.modify=Editar projeto projects.edit_success=Projeto "%s" atualizado. projects.type.none=Nenhum projects.type.basic_kanban=Kanban básico -projects.type.bug_triage=Triagem de Bugs +projects.type.bug_triage=Triagem de bugs projects.template.desc=Modelo de projeto projects.template.desc_helper=Selecione um modelo de projeto para começar projects.type.uncategorized=Sem categoria @@ -1430,7 +1495,7 @@ projects.column.set_default_desc=Definir esta coluna como padrão para pull e is projects.column.unset_default=Desatribuir padrão projects.column.unset_default_desc=Desatribuir esta coluna como padrão projects.column.delete=Excluir coluna -projects.column.deletion_desc=Excluir uma coluna do projeto move todas as issues relacionadas para 'Sem categoria'. Continuar? +projects.column.deletion_desc=Excluir uma coluna do projeto move todos os issues relacionados para a coluna padrão. Continuar? projects.column.color=Cor projects.open=Abrir projects.close=Fechar @@ -1445,7 +1510,7 @@ issues.filter_milestones=Filtrar Marco issues.filter_projects=Filtrar Projeto issues.filter_labels=Filtrar Rótulo issues.filter_reviewers=Filtrar Revisor -issues.new=Nova issue +issues.new=Novo issue issues.new.title_empty=Título não pode ser em branco issues.new.labels=Etiquetas issues.new.no_label=Nenhum rótulo @@ -1463,7 +1528,7 @@ issues.new.open_milestone=Marcos abertos issues.new.closed_milestone=Marcos fechados issues.new.assignees=Responsáveis issues.new.clear_assignees=Limpar responsáveis -issues.new.no_assignees=Sem responsável +issues.new.no_assignees=Sem responsáveis issues.new.no_reviewers=Sem revisor issues.choose.get_started=Primeiros passos issues.choose.open_external_link=Abrir @@ -1477,10 +1542,10 @@ issues.new_label=Novo rótulo issues.new_label_placeholder=Nome da etiqueta issues.new_label_desc_placeholder=Descrição issues.create_label=Criar rótulo -issues.label_templates.title=Carregue um conjunto de etiquetas pré-definidas -issues.label_templates.info=Ainda não existem etiquetas. Crie uma etiqueta em 'Nova etiqueta' ou use um conjunto de etiquetas predefinida: -issues.label_templates.helper=Selecione um conjunto de etiquetas -issues.label_templates.use=Use o conjunto de etiquetas +issues.label_templates.title=Carregue um modelo de etiquetas +issues.label_templates.info=Ainda não existem etiquetas. Crie uma etiqueta em "Nova etiqueta" ou use um modelo etiquetas: +issues.label_templates.helper=Selecione uma predefinição de etiqueta +issues.label_templates.use=Use predefinição de etiqueta issues.label_templates.fail_to_load_file=Falha ao carregar o modelo de etiquetas "%s": %v issues.add_label=adicionou o rótulo %s %s issues.add_labels=adicionou os rótulos %s %s @@ -1584,8 +1649,8 @@ issues.reopened_at=`reabriu esta issue %[2]s` issues.commit_ref_at=`citou esta issue em um commit %[2]s` issues.ref_issue_from=`referenciado esta issue %[4]s %[2]s` issues.ref_pull_from=`referenciado este pull request %[4]s %[2]s` -issues.ref_closing_from=`referenciado um pull request %[4]s que fechará esta issue %[2]s` -issues.ref_reopening_from=`referenciado um pull request %[4]s que reabrirá esta issue %[2]s` +issues.ref_closing_from=`referenciado esta issue de um pull request %[4]s que a fechará %[2]s` +issues.ref_reopening_from=`referenciado esta issue de um pull request %[4]s que a reabrirá %[2]s` issues.ref_closed_from=`fechou esta issue %[4]s %[2]s` issues.ref_reopened_from=`reabriu esta issue %[4]s %[2]s` issues.ref_from=`de %[1]s` @@ -1681,7 +1746,7 @@ issues.error_modifying_due_date=Falha ao modificar a data limite. issues.error_removing_due_date=Falha ao remover a data limite. issues.push_commit_1=adicionou %d commit %s issues.push_commits_n=adicionou %d commits %s -issues.force_push_codes=`forçou o push %[1]s de %[2]s para %[4]s %[6]s` +issues.force_push_codes=`forçou o push %[1]s de %[2]s para %[4]s %[6]s` issues.force_push_compare=Comparar issues.due_date_form=dd/mm/aaaa issues.due_date_form_add=Adicionar data limite @@ -1692,13 +1757,13 @@ issues.due_date_added=adicionou a data limite %s %s issues.due_date_modified=modificou a data limite de %[2]s para %[1]s %[3]s issues.due_date_remove=removeu a data limite %s %s issues.due_date_overdue=Em atraso -issues.due_date_invalid=A data limite é inválida ou está fora do intervalo. Por favor, use o formato 'dd/mm/aaaa'. +issues.due_date_invalid=A data limite é inválida ou está fora do intervalo permitido. Por favor, use o formato "yyyy-mm-dd". issues.dependency.title=Dependências issues.dependency.issue_no_dependencies=Não há dependências definidas. issues.dependency.pr_no_dependencies=Não há dependências definidas. -issues.dependency.no_permission_1=Você não tem permissão para ler %d dependência -issues.dependency.no_permission_n=Você não tem permissão para ler %d dependências -issues.dependency.no_permission.can_remove=Você não tem permissão para ler esta dependência, mas pode remover esta dependência +issues.dependency.no_permission_1=Você não tem permissão para ler a dependência %d +issues.dependency.no_permission_n=Você não tem permissão para ler as dependências %d +issues.dependency.no_permission.can_remove=Você não tem permissão para ler esta dependência, mas pode removê-la issues.dependency.add=Adicionar dependência… issues.dependency.cancel=Cancelar issues.dependency.remove=Remover @@ -1710,7 +1775,7 @@ issues.dependency.issue_closing_blockedby=Fechamento desta issue está bloqueado issues.dependency.issue_close_blocks=Esta issue bloqueia o fechamento das seguintes issues issues.dependency.pr_close_blocks=Este pull request bloqueia o fechamento das seguintes issues issues.dependency.issue_close_blocked=Você precisa fechar todas as issues que bloqueiam esta issue antes de poder fechá-la. -issues.dependency.issue_batch_close_blocked=Não é possível fechar as issues que você escolheu, porque a issue #%d ainda tem dependências abertas +issues.dependency.issue_batch_close_blocked=Não é possível fechar as issues que você escolheu porque a issue #%d ainda tem dependências abertas issues.dependency.pr_close_blocked=Você precisa fechar todas issues que bloqueiam este pull request antes de poder fazer o merge. issues.dependency.blocks_short=Bloqueia issues.dependency.blocked_by_short=Depende de @@ -1734,8 +1799,8 @@ issues.review.left_comment=deixou um comentário issues.review.content.empty=Você precisa deixar um comentário indicando as alterações solicitadas. issues.review.reject=solicitou alterações %s issues.review.wait=foi solicitado(a) para revisar %s -issues.review.add_review_request=solicitou uma revisão de %s %s -issues.review.remove_review_request=removeu a solicitação de revisão para %s %s +issues.review.add_review_request=solicitou revisão de %[1]s %[2]s +issues.review.remove_review_request=removeu a solicitação de revisão para %[1]s %[2]s issues.review.remove_review_request_self=recusou-se a revisar %s issues.review.pending=Pendente issues.review.pending.tooltip=Este comentário não está atualmente visível para outros usuários. Para enviar seus comentários pendentes, selecione "%s" -> "%s/%s/%s" no topo da página. @@ -1767,7 +1832,7 @@ compare.compare_head=comparar pulls.desc=Habilitar pull requests e revisões de código. pulls.new=Novo pull request -pulls.view=Ver Pull Request +pulls.view=Ver pull request pulls.compare_changes=Novo pull request pulls.allow_edits_from_maintainers=Permitir edições de mantenedores pulls.allow_edits_from_maintainers_desc=Usuários com acesso de gravação para o branch base também podem fazer push para este branch @@ -1795,7 +1860,7 @@ pulls.nothing_to_compare=Estes branches são iguais. Não há nenhuma necessidad pulls.nothing_to_compare_and_allow_empty_pr=Estes branches são iguais. Este PR ficará vazio. pulls.has_pull_request=`Um pull request entre esses branches já existe: %[2]s#%[3]d` pulls.create=Criar pull request -pulls.title_desc_few=quer mesclar %[1]d commits de %[2]s em %[3]s +pulls.title_desc_few=quer mesclar %[1]d commits de %[2]s em %[3]s pulls.merged_title_desc_few=mesclou %[1]d commits de %[2]s em %[3]s %[4]s pulls.change_target_branch_at=`mudou o branch de destino de %s para %s %s` pulls.tab_conversation=Conversação @@ -1816,15 +1881,15 @@ pulls.add_prefix=Adicione o prefixo %s pulls.remove_prefix=Remover o prefixo %s pulls.data_broken=Este pull request está quebrado devido a falta de informação do fork. pulls.files_conflicted=Este pull request tem alterações conflitantes com o branch de destino. -pulls.is_checking=Verificação de conflitos do merge está em andamento. Tente novamente em alguns momentos. +pulls.is_checking=Verificação de conflitos de merge está em andamento. Tente novamente em alguns momentos. pulls.is_ancestor=Este branch já está incluído no branch de destino. Não há nada para mesclar. -pulls.is_empty=As alterações neste branch já estão na branch de destino. Este será um commit vazio. +pulls.is_empty=As alterações neste branch já estão no branch de destino. Este será um commit vazio. pulls.required_status_check_failed=Algumas verificações necessárias não foram bem sucedidas. pulls.required_status_check_missing=Estão faltando algumas verificações necessárias. pulls.required_status_check_administrator=Como administrador, você ainda pode aplicar o merge deste pull request. pulls.blocked_by_approvals=Este pull request ainda não tem aprovações suficientes. %d de %d aprovações concedidas. pulls.blocked_by_rejection=Este pull request tem alterações solicitadas por um revisor oficial. -pulls.blocked_by_official_review_requests=Este pull request tem solicitações de revisão oficiais. +pulls.blocked_by_official_review_requests=Este pull request está bloqueado porque falta aprovação de um ou mais revisores oficiais. pulls.blocked_by_outdated_branch=Este pull request está bloqueado porque está desatualizado. pulls.blocked_by_changed_protected_files_1=Este pull request está bloqueado porque altera um arquivo protegido: pulls.blocked_by_changed_protected_files_n=Este pull request está bloqueado porque altera arquivos protegidos: @@ -1858,13 +1923,13 @@ pulls.invalid_merge_option=Você não pode usar esta opção de merge neste pull pulls.merge_conflict=O merge falhou: Houve um conflito ao fazer merge. Dica: Tente uma estratégia diferente pulls.merge_conflict_summary=Mensagem de erro pulls.rebase_conflict=O merge falhou: Houve um conflito durante o rebase do commit %[1]s. Dica: Tente uma estratégia diferente -pulls.rebase_conflict_summary=Mensagem de Erro -pulls.unrelated_histories=Merge falhou: O merge do principal e da base não compartilham uma história comum. Dica: Tente uma estratégia diferente -pulls.merge_out_of_date=Merge falhou: durante a geração do merge, a base não foi atualizada. Dica: Tente novamente. +pulls.rebase_conflict_summary=Mensagem de erro +pulls.unrelated_histories=Merge falhou: A head do merge e da base não compartilham um histórico comum. Dica: Tente uma estratégia diferente +pulls.merge_out_of_date=Merge falhou: Durante a geração do merge, a base foi atualizada. Dica: Tente novamente. pulls.head_out_of_date=O merge falhou: Enquanto gerava o merge, a head foi atualizada. Dica: Tente novamente. -pulls.push_rejected=O merge falhou: O push foi rejeitado. Revise os Git Hooks para este repositório. +pulls.push_rejected=O merge falhou: O push foi rejeitado. Revise os hooks do Git para este repositório. pulls.push_rejected_summary=Mensagem completa da rejeição -pulls.push_rejected_no_message=O merge falhou: O push foi rejeitado mas não houve mensagem remota.
      Revise os Git Hooks para este repositório +pulls.push_rejected_no_message=O push falhou: O push foi rejeitado mas não houve mensagem remota. Revise os hooks do Git para este repositório pulls.open_unmerged_pull_exists=`Não é possível executar uma operação de reabertura pois há um pull request pendente (#%d) com propriedades idênticas.` pulls.status_checking=Algumas verificações estão pendentes pulls.status_checks_success=Todas as verificações foram bem sucedidas @@ -1916,7 +1981,7 @@ milestones.title=Título milestones.desc=Descrição milestones.due_date=Data limite (opcional) milestones.clear=Limpar -milestones.invalid_due_date_format=Formato da data limite deve ser 'dd/mm/aaaa'. +milestones.invalid_due_date_format=Formato da data limite deve ser "aaaa-mm-dd". milestones.create_success=O marco "%s" foi criado. milestones.edit=Editar marco milestones.edit_subheader=Marcos organizam as issues e acompanham o progresso. @@ -1935,7 +2000,7 @@ milestones.filter_sort.least_issues=Com menos issues signing.will_sign=Esse commit será assinado com a chave "%s". signing.wont_sign.error=Ocorreu um erro ao verificar se o commit poderia ser assinado. -signing.wont_sign.nokey=Não há nenhuma chave disponível para assinar esse commit. +signing.wont_sign.nokey=Esta instância não tem uma chave para assinar esse commit. signing.wont_sign.never=Commits nunca são assinados. signing.wont_sign.always=Commits são sempre assinados. signing.wont_sign.pubkey=O commit não será assinado porque você não tem uma chave pública associada à sua conta. @@ -1946,7 +2011,7 @@ signing.wont_sign.commitssigned=O merge não será assinado, pois todos os commi signing.wont_sign.approved=O merge não será assinado porque o PR não foi aprovado. signing.wont_sign.not_signed_in=Você não está conectado. -ext_wiki=Acesso a Wiki Externo +ext_wiki=Wiki Externa ext_wiki.desc=Link para uma wiki externa. wiki=Wiki @@ -1965,7 +2030,7 @@ wiki.last_commit_info=%s editou esta página %s wiki.edit_page_button=Editar wiki.new_page_button=Nova página wiki.file_revision=Revisão de página -wiki.wiki_page_revisions=Revisões de página Wiki +wiki.wiki_page_revisions=Revisões da página wiki.back_to_wiki=Voltar para página Wiki wiki.delete_page_button=Excluir página wiki.delete_page_notice_1=A exclusão da página de wiki "%s" não pode ser desfeita. Continuar? @@ -1973,7 +2038,7 @@ wiki.page_already_exists=Uma página de wiki com o mesmo nome já existe. wiki.reserved_page=O nome da página da wiki "%s" está reservado. wiki.pages=Páginas wiki.last_updated=Última atualização %s -wiki.page_name_desc=Digite um nome para esta página Wiki. Alguns nomes especiais são: 'Home', '_Sidebar' e '_Footer'. +wiki.page_name_desc=Digite um nome para esta página Wiki. Alguns nomes especiais são: "Home", "_Sidebar" e "_Footer". wiki.original_git_entry_tooltip=Ver o arquivo Git original em vez de usar o link amigável. activity=Atividade @@ -1986,26 +2051,26 @@ activity.period.quarterly=3 meses activity.period.semiyearly=6 meses activity.period.yearly=1 ano activity.overview=Visão geral -activity.active_prs_count_1=%d Pull request ativo -activity.active_prs_count_n=%d Pull requests ativos -activity.merged_prs_count_1=Pull request com merge aplicado -activity.merged_prs_count_n=Pull requests com merge aplicado +activity.active_prs_count_1=%d pull request ativo +activity.active_prs_count_n=%d pull requests ativos +activity.merged_prs_count_1=Pull request com merge concluído +activity.merged_prs_count_n=Pull requests com merge concluído activity.opened_prs_count_1=Pull request proposto activity.opened_prs_count_n=Pull requests propostos activity.title.user_1=%d usuário activity.title.user_n=%d usuários -activity.title.prs_1=%d Pull request -activity.title.prs_n=%d Pull requests +activity.title.prs_1=%d pull request +activity.title.prs_n=%d pull requests activity.title.prs_merged_by=%s com merge aplicado por %s activity.title.prs_opened_by=%s proposto(s) por %s activity.merged_prs_label=Merge aplicado activity.opened_prs_label=Proposto -activity.active_issues_count_1=%d Issue ativa -activity.active_issues_count_n=%d Issues ativas +activity.active_issues_count_1=%d issue ativa +activity.active_issues_count_n=%d issues ativas activity.closed_issues_count_1=Issue fechada activity.closed_issues_count_n=Issues fechadas -activity.title.issues_1=+%d Issue -activity.title.issues_n=+%d Issues +activity.title.issues_1=%d issue +activity.title.issues_n=%d issues activity.title.issues_closed_from=%s fechada por %s activity.title.issues_created_by=%s criada por %s activity.closed_issue_label=Fechado @@ -2016,10 +2081,10 @@ activity.title.unresolved_conv_1=%d conversa não resolvida activity.title.unresolved_conv_n=%d conversas não resolvidas activity.unresolved_conv_desc=Estas issues foram recentemente alteradas e pull requests ainda não foram resolvidos. activity.unresolved_conv_label=Aberta -activity.title.releases_1=%d Versão -activity.title.releases_n=%d Versões +activity.title.releases_1=%d release +activity.title.releases_n=%d releases activity.title.releases_published_by=%s publicada(s) por %s -activity.published_release_label=Publicado +activity.published_release_label=Release activity.no_git_activity=Não houve nenhuma atividade de commit neste período. activity.git_stats_exclude_merges=Excluindo merges, activity.git_stats_author_1=%d autor @@ -2042,8 +2107,7 @@ activity.git_stats_and_deletions=e activity.git_stats_deletion_1=%d exclusão activity.git_stats_deletion_n=%d exclusões -contributors.contribution_type.commits=Commits - +contributors.contribution_type.commits = Commits search=Pesquisar search.search_repo=Pesquisar no repositório... search.type.tooltip=Tipo de pesquisa @@ -2078,22 +2142,22 @@ settings.mirror_settings.direction.pull=Pull settings.mirror_settings.direction.push=Push settings.mirror_settings.last_update=Última atualização settings.mirror_settings.push_mirror.none=Nenhum espelhamento de push configurado -settings.mirror_settings.push_mirror.remote_url=URL do repositório do Git remoto -settings.mirror_settings.push_mirror.add=Adicionar Espelho de Push +settings.mirror_settings.push_mirror.remote_url=URL do repositório Git remoto +settings.mirror_settings.push_mirror.add=Adicionar espelho de push settings.mirror_settings.push_mirror.edit_sync_time=Editar intervalo de sincronização de espelhos settings.sync_mirror=Sincronizar agora settings.site=Site -settings.update_settings=Atualizar configurações -settings.update_mirror_settings=Atualizar espelho -settings.branches.switch_default_branch=Alterar -settings.branches.update_default_branch=Atualizar Branch Padrão -settings.branches.add_new_rule=Adicionar Nova Regra +settings.update_settings=Salvar configurações +settings.update_mirror_settings=Atualizar configurações do espelho +settings.branches.switch_default_branch=Alterar branch padrão +settings.branches.update_default_branch=Atualizar branch padrão +settings.branches.add_new_rule=Adicionar nova regra settings.advanced_settings=Configurações avançadas settings.wiki_desc=Habilitar a wiki do repositório settings.use_internal_wiki=Usar a wiki nativa settings.use_external_wiki=Usar wiki externa -settings.external_wiki_url=URL externa da wiki +settings.external_wiki_url=URL da wiki externa settings.external_wiki_url_error=A URL da wiki externa não é válida. settings.external_wiki_url_desc=Visitantes são redirecionados para a URL da wiki externa ao clicar na aba da wiki. settings.issues_desc=Habilitar issue tracker para o repositório @@ -2111,35 +2175,35 @@ settings.tracker_issue_style.regexp=Expressão Regular settings.tracker_issue_style.regexp_pattern=Padrão de expressão regular settings.tracker_issue_style.regexp_pattern_desc=O primeiro grupo capturado será usado no lugar de {index}. settings.tracker_url_format_desc=Use os espaços reservados {user}, {repo} e {index} para o nome de usuário, nome do repositório e o índice de problemas. -settings.enable_timetracker=Habilitar Cronômetro -settings.allow_only_contributors_to_track_time=Permitir que apenas os colaboradores acompanhem o contador de tempo +settings.enable_timetracker=Habilitar estatísticas de tempo +settings.allow_only_contributors_to_track_time=Permitir que apenas os colaboradores usem estatísticas de tempo settings.pulls_desc=Habilitar pull requests no repositório settings.pulls.ignore_whitespace=Ignorar espaço em branco em conflitos settings.pulls.enable_autodetect_manual_merge=Habilitar a detecção automática de merge manual (Nota: Em alguns casos especiais, podem ocorrer julgamentos errados) settings.pulls.allow_rebase_update=Ativar atualização do branch do pull request por rebase settings.pulls.default_delete_branch_after_merge=Excluir o branch de pull request após o merge por padrão settings.pulls.default_allow_edits_from_maintainers=Permitir edições de mantenedores por padrão -settings.releases_desc=Habilitar versões do Repositório -settings.packages_desc=Habilitar Registro de Pacotes de Repositório -settings.projects_desc=Habilitar Projetos do Repositório -settings.actions_desc=Habilitar ações do repositório -settings.admin_settings=Configurações do administrador +settings.releases_desc=Habilitar releases no repositório +settings.packages_desc=Habilitar registro de pacotes do repositório +settings.projects_desc=Habilitar projetos do repositório +settings.actions_desc=Habilitar pipelines integradas de CI/CD com Forgejo Actions +settings.admin_settings=Configurações de administrador settings.admin_enable_health_check=Habilitar verificações de integridade (git fsck) no repositório settings.admin_code_indexer=Indexador de código -settings.admin_stats_indexer=Indexador de Estatísticas do Código -settings.admin_indexer_commit_sha=Último SHA indexado +settings.admin_stats_indexer=Indexador de estatísticas de código +settings.admin_indexer_commit_sha=Último commit indexado settings.admin_indexer_unindexed=Não indexado settings.reindex_button=Adicionar à fila de reindexação -settings.reindex_requested=Reindexação requisitada +settings.reindex_requested=Reindexação solicitada settings.admin_enable_close_issues_via_commit_in_any_branch=Fechar issue via commit em um branch não padrão settings.danger_zone=Zona de perigo settings.new_owner_has_same_repo=O novo proprietário já tem um repositório com o mesmo nome. Por favor, escolha outro nome. -settings.convert=Converter para repositório tradicional +settings.convert=Converter para repositório comum settings.convert_desc=Você pode converter este espelhamento em um repositório tradicional. Esta ação não pode ser revertida. settings.convert_notices_1=Esta operação vai converter este espelhamento em um repositório tradicional. Esta ação não pode ser desfeita. -settings.convert_confirm=Converter o repositório +settings.convert_confirm=Converter repositório settings.convert_succeed=O espelhamento foi convertido em um repositório tradicional. -settings.convert_fork=Converter Para Um Repositório Normal +settings.convert_fork=Converter para um repositório comum settings.convert_fork_desc=Você pode converter este fork em um repositório normal. Esta ação não pode ser desfeita. settings.convert_fork_notices_1=Esta operação irá converter o fork em um repositório normal e não pode ser desfeita. settings.convert_fork_confirm=Converter repositório @@ -2156,12 +2220,12 @@ settings.transfer_notices_1=- Você perderá o acesso ao repositório se transfe settings.transfer_notices_2=- Você manterá acesso ao repositório se transferi-lo para uma organização que você também é proprietário. settings.transfer_notices_3=- Se o repositório for privado e for transferido para um usuário individual, esta ação certifica que o usuário tem pelo menos permissão de leitura (e altera as permissões se necessário). settings.transfer_owner=Novo proprietário -settings.transfer_perform=Executar Transferência +settings.transfer_perform=Executar transferência settings.transfer_started=`Este repositório foi marcado para transferência e aguarda a confirmação de "%s"` settings.transfer_succeed=O repositório foi transferido. -settings.signing_settings=Configurações de Verificação de Assinatura -settings.trust_model=Modelo de Confiança na Assinatura -settings.trust_model.default=Modelo Padrão de Confiança +settings.signing_settings=Configurações de verificação de assinatura +settings.trust_model=Modelo de confiança para assinaturas +settings.trust_model.default=Modelo padrão de confiança settings.trust_model.default.desc=Use o modelo de confiança de repositório padrão para esta instalação. settings.trust_model.collaborator=Colaborador settings.trust_model.collaborator.long=Colaborador: Confiar em assinaturas feitas por colaboradores @@ -2198,7 +2262,7 @@ settings.org_not_allowed_to_be_collaborator=Organizações não podem ser adicio settings.change_team_access_not_allowed=Alteração do acesso da equipe para o repositório está restrito ao proprietário da organização settings.team_not_in_organization=A equipe não está na mesma organização que o repositório settings.teams=Equipes -settings.add_team=Adicionar Equipe +settings.add_team=Adicionar equipe settings.add_team_duplicate=A equipe já tem o repositório settings.add_team_success=A equipe agora tem acesso ao repositório. settings.search_team=Pesquisar Equipe… @@ -2222,10 +2286,10 @@ settings.webhook.replay.description=Executar novamente esse webhook. settings.webhook.delivery.success=Um evento foi adicionado à fila de envio. Pode levar alguns segundos até que ele apareça no histórico de envio. settings.githooks_desc=Hooks do Git são executados pelo próprio Git. Você pode editar arquivos de hook abaixo para configurar operações personalizadas. settings.githook_edit_desc=Se o hook não estiver ativo, o conteúdo de exemplo será apresentado. Deixar o conteúdo em branco irá desabilitar esse hook. -settings.githook_name=Nome do Hook -settings.githook_content=Conteúdo do Hook -settings.update_githook=Atualizar Hook -settings.add_webhook_desc=Forgejo enviará requisições POST com um tipo de conteúdo especificado para a URL de destino. Leia mais no guia de webhooks. +settings.githook_name=Nome do hook +settings.githook_content=Conteúdo do hook +settings.update_githook=Atualizar hook +settings.add_webhook_desc=Forgejo enviará requisições POST com um Content-Type especificado para a URL de destino. Leia mais no guia de webhooks. settings.payload_url=URL de destino settings.http_method=Método HTTP settings.content_type=Tipo de conteúdo POST @@ -2235,11 +2299,11 @@ settings.slack_icon_url=URL do ícone settings.slack_color=Cor settings.discord_username=Nome de usuário settings.discord_icon_url=URL do ícone -settings.event_desc=Acionado em: +settings.event_desc=Acionar em: settings.event_push_only=Eventos de push settings.event_send_everything=Todos os eventos -settings.event_choose=Eventos personalizados... -settings.event_header_repository=Eventos do Repositório +settings.event_choose=Eventos personalizados… +settings.event_header_repository=Eventos do repositório settings.event_create=Criar settings.event_create_desc=Branch ou tag criado. settings.event_delete=Excluir @@ -2254,37 +2318,37 @@ settings.event_push=Push settings.event_push_desc=Git push para o repositório. settings.event_repository=Repositório settings.event_repository_desc=Repositório criado ou excluído. -settings.event_header_issue=Eventos da Issue -settings.event_issues=Issues +settings.event_header_issue=Eventos de issues +settings.event_issues=Modificação settings.event_issues_desc=Issue aberta, fechada, reaberta ou editada. -settings.event_issue_assign=Issue Atribuída +settings.event_issue_assign=Atribuição settings.event_issue_assign_desc=Issue atribuída ou não atribuída. -settings.event_issue_label=Issue Rotulada -settings.event_issue_label_desc=Rótulos da issue atualizados ou removidos. -settings.event_issue_milestone=Marco Atribuído à Issue -settings.event_issue_milestone_desc=Marco atribuído ou desatribuído à Issue. -settings.event_issue_comment=Comentário da issue +settings.event_issue_label=Rótulos +settings.event_issue_label_desc=Rótulos da issue adicionados ou removidos. +settings.event_issue_milestone=Marcos +settings.event_issue_milestone_desc=Marco adicionado, removido ou modificado. +settings.event_issue_comment=Comentários settings.event_issue_comment_desc=Comentário da issue criado, editado ou excluído. -settings.event_header_pull_request=Eventos de Pull Request -settings.event_pull_request=Pull request +settings.event_header_pull_request=Eventos de pull request +settings.event_pull_request=Modificação settings.event_pull_request_desc=Pull request aberto, fechado, reaberto ou editado. -settings.event_pull_request_assign=Pull Request Atribuído +settings.event_pull_request_assign=Atribuição settings.event_pull_request_assign_desc=Pull request atribuído ou desatribuído. -settings.event_pull_request_label=Pull Request Rotulado -settings.event_pull_request_label_desc=Rótulos do pull request atualizados ou limpos. -settings.event_pull_request_milestone=Marco Atribuído ao Pull Request -settings.event_pull_request_milestone_desc=Marco atribuído ou desatribuído ao pull request. -settings.event_pull_request_comment=Comentário no Pull Request +settings.event_pull_request_label=Rótulos +settings.event_pull_request_label_desc=Rótulos do pull request adicionados ou removidos. +settings.event_pull_request_milestone=Marcos +settings.event_pull_request_milestone_desc=Marco adicionado, removido ou modificado. +settings.event_pull_request_comment=Comentários settings.event_pull_request_comment_desc=Comentário criado, editado ou excluído no pull request. -settings.event_pull_request_review=Pull Request Revisado -settings.event_pull_request_review_desc=Pull request aprovado, rejeitado ou revisão comentada. -settings.event_pull_request_sync=Pull Request Sincronizado -settings.event_pull_request_sync_desc=Pull request sincronizado. +settings.event_pull_request_review=Revisões +settings.event_pull_request_review_desc=Pull request aprovado, rejeitado ou comentários de revisão adicionados. +settings.event_pull_request_sync=Sincronizado +settings.event_pull_request_sync_desc=Branch atualizado automaticamente com o branch alvo. settings.event_package=Pacote settings.event_package_desc=Pacote criado ou excluído em um repositório. settings.branch_filter=Filtro de branch settings.branch_filter_desc=Lista dos branches a serem considerados nos eventos push, criação de branch e exclusão de branch, especificados como padrão glob. Se estiver vazio ou for *, eventos para todos os branches serão relatados. Veja %[2]s documentação da sintaxe. Exemplos: master, {master,release*}. -settings.authorization_header=Header de Autorização +settings.authorization_header=Cabeçalho de autorização settings.authorization_header_desc=Será incluído como header de autorização para solicitações quando estiver presente. Exemplos: %s. settings.active=Ativo settings.active_helper=Informações sobre eventos disparados serão enviadas para esta URL do webhook. @@ -2292,8 +2356,8 @@ settings.add_hook_success=O webhook foi adicionado. settings.update_webhook=Atualizar webhook settings.update_hook_success=O webhook foi atualizado. settings.delete_webhook=Remover webhook -settings.recent_deliveries=Entregas Recentes -settings.hook_type=Tipo de Hook +settings.recent_deliveries=Entregas recentes +settings.hook_type=Tipo de hook settings.slack_token=Token settings.slack_domain=Domínio settings.slack_channel=Canal @@ -2315,8 +2379,8 @@ settings.web_hook_name_packagist=Packagist settings.packagist_username=Nome de usuário no Packagist settings.packagist_api_token=Token de API settings.packagist_package_url=URL do pacote do Packagist -settings.deploy_keys=Chaves de Deploy -settings.add_deploy_key=Nova chave +settings.deploy_keys=Chaves de deploy +settings.add_deploy_key=Adicionar chave de deploy settings.deploy_key_desc=As chaves de deploy possuem somente acesso de leitura (pull) ao repositório. settings.is_writable=Habilitar acesso de escrita settings.is_writable_info=Permitir que esta chave de deploy faça push para o repositório. @@ -2329,13 +2393,13 @@ settings.deploy_key_deletion=Remover chave de deploy settings.deploy_key_deletion_desc=A exclusão de uma chave de deploy irá revogar o seu acesso a este repositório. Continuar? settings.deploy_key_deletion_success=A chave de deploy foi removida. settings.branches=Branches -settings.protected_branch=Proteção de Branch -settings.protected_branch.save_rule=Salvar Regra -settings.protected_branch.delete_rule=Excluir Regra +settings.protected_branch=Proteção de branch +settings.protected_branch.save_rule=Salvar regra +settings.protected_branch.delete_rule=Excluir regra settings.protected_branch_can_push=Permitir push? settings.protected_branch_can_push_yes=Você pode fazer push settings.protected_branch_can_push_no=Você não pode fazer push -settings.branch_protection=Proteção de Branch para '%s' +settings.branch_protection=Regras de proteção do branch "%s" settings.protect_this_branch=Habilitar Proteção de Branch settings.protect_this_branch_desc=Previne a exclusão e restringe o merge e push para o branch. settings.protect_disable_push=Desabilitar push @@ -2343,42 +2407,42 @@ settings.protect_disable_push_desc=Nenhum push será permitido neste branch. settings.protect_enable_push=Habilitar push settings.protect_enable_push_desc=Qualquer pessoa com acesso de escrita terá permissão para realizar push neste branch (mas não forçar o push). settings.protect_enable_merge=Permitir merge -settings.protect_whitelist_committers=Lista permitida para push +settings.protect_whitelist_committers=Push restrito à lista de permissão settings.protect_whitelist_committers_desc=Somente usuários ou equipes da lista permitida serão autorizados realizar push neste branch (mas não forçar o push). settings.protect_whitelist_deploy_keys=Dar permissão às chaves de deploy com acesso de gravação para push. -settings.protect_whitelist_users=Usuários com permissão para realizar push: +settings.protect_whitelist_users=Usuários com permissão para realizar push settings.protect_whitelist_search_users=Pesquisar usuários... -settings.protect_whitelist_teams=Equipes com permissão para realizar push: +settings.protect_whitelist_teams=Equipes com permissão para realizar push settings.protect_whitelist_search_teams=Pesquisar equipes... -settings.protect_merge_whitelist_committers=Habilitar controle de permissão de merge +settings.protect_merge_whitelist_committers=Habilitar lista de permissão de merge settings.protect_merge_whitelist_committers_desc=Permitir que determinados usuários ou equipes possam aplicar merge de pull requests neste branch. -settings.protect_merge_whitelist_users=Usuários com permissão para aplicar merge: -settings.protect_merge_whitelist_teams=Equipes com permissão para aplicar merge: +settings.protect_merge_whitelist_users=Usuários com permissão para fazer merge +settings.protect_merge_whitelist_teams=Equipes com permissão para fazer merge settings.protect_check_status_contexts=Habilitar verificação de status settings.protect_check_status_contexts_desc=Exigir que as verificações de status passem antes de fazer merge. Escolha quais verificações de status devem passar antes que os branches possam ter o merge aplicado em um branch que corresponda a esta regra. Quando habilitado, os commits devem primeiro ser enviados para outro branch, então faça merge ou push diretamente para um branch que corresponde a esta regra após a verificação de status ter passado. Se nenhum contexto for selecionado, o último commit deve ser bem sucedido, independentemente do contexto. settings.protect_check_status_contexts_list=Verificações de status encontradas na última semana para este repositório -settings.protect_required_approvals=Aprovações necessárias: +settings.protect_required_approvals=Aprovações necessárias settings.protect_required_approvals_desc=Permite apenas realizar merge do pull request com avaliações positivas suficientes. settings.protect_approvals_whitelist_enabled=Restringir aprovações a usuários ou equipes da lista permitida settings.protect_approvals_whitelist_enabled_desc=Somente as avaliações de usuários ou equipes da lista permitida serão contadas com as aprovações necessárias. Sem aprovação da lista permitida, as revisões de qualquer pessoa com acesso de escrita contam para as aprovações necessárias. -settings.protect_approvals_whitelist_users=Usuários com permissão de revisão: -settings.protect_approvals_whitelist_teams=Equipes com permissão de revisão: +settings.protect_approvals_whitelist_users=Usuários com permissão de fazer revisões +settings.protect_approvals_whitelist_teams=Equipes com permissão de fazer revisões settings.dismiss_stale_approvals=Descartar aprovações obsoletas settings.dismiss_stale_approvals_desc=Quando novos commits que mudam o conteúdo do pull request são enviados para o branch, as antigas aprovações serão descartadas. -settings.require_signed_commits=Exibir commits assinados +settings.require_signed_commits=Exigir commits assinados settings.require_signed_commits_desc=Rejeitar pushes para este branch se não estiverem assinados ou não forem validáveis. -settings.protect_branch_name_pattern=Padrão de Nome de Branch Protegida +settings.protect_branch_name_pattern=Padrão de nome de branch protegido settings.protect_patterns=Padrões -settings.protect_protected_file_patterns=Padrões de arquivos protegidos (separados usando ponto e vírgula ';'): -settings.protect_protected_file_patterns_desc=Arquivos protegidos não podem ser alterados diretamente, mesmo que o usuário tenha direitos para adicionar, editar ou excluir arquivos neste branch. Vários padrões podem ser separados usando ponto e vírgula (';'). Consulte a documentação github.com/gobwas/glob para a sintaxe padrão. Exemplos: .drone.yml, /docs/**/*.txt. -settings.protect_unprotected_file_patterns=Padrões de arquivos desprotegidos (separados usando ponto e vírgula ';'): -settings.protect_unprotected_file_patterns_desc=Arquivos não protegidos que podem ser alterados diretamente se o usuário tiver acesso de gravação, ignorando as restrições de push. Vários padrões podem ser separados usando ponto e vírgula (\;'). Veja %[2]s documentação para sintaxe de padrões. Exemplos: .drone.yml, /docs/**/*.txt. +settings.protect_protected_file_patterns=Padrões de arquivo protegidos (separados usando ponto e vírgula ";") +settings.protect_protected_file_patterns_desc=Arquivos protegidos não podem ser alterados diretamente, mesmo que o usuário tenha direitos para adicionar, editar ou excluir arquivos neste branch. Vários padrões podem ser separados usando ponto e vírgula (';'). Consulte a documentação %[2]s para a sintaxe padrão. Exemplos: .drone.yml, /docs/**/*.txt. +settings.protect_unprotected_file_patterns=Padrões de arquivo desprotegidos (separados usando ponto e vírgula ";") +settings.protect_unprotected_file_patterns_desc=Arquivos não protegidos que podem ser alterados diretamente se o usuário tiver acesso de gravação, ignorando as restrições de push. Vários padrões podem ser separados usando ponto e vírgula (\;'). Veja %[2]s documentação para sintaxe de padrões. Exemplos: .drone.yml, /docs/**/*.txt. settings.add_protected_branch=Habilitar proteção settings.delete_protected_branch=Desabilitar proteção settings.update_protect_branch_success=Proteção do branch "%s" foi atualizada. settings.remove_protected_branch_success=Proteção do branch "%s" foi desabilitada. settings.remove_protected_branch_failed=Removendo regra de proteção de branch "%s" falhou. -settings.protected_branch_deletion=Desabilitar proteção de branch +settings.protected_branch_deletion=Remover proteção de branch settings.protected_branch_deletion_desc=Desabilitar a proteção de branch permite que os usuários com permissão de escrita realizem push. Continuar? settings.block_rejected_reviews=Bloquear merge em revisões rejeitadas settings.block_rejected_reviews_desc=O merge não será possível quando são solicitadas alterações pelos revisores oficiais, mesmo que haja aprovação suficiente. @@ -2387,35 +2451,35 @@ settings.block_on_official_review_requests_desc=O merge não será possível qua settings.block_outdated_branch=Bloquear o merge se o pull request estiver desatualizado settings.block_outdated_branch_desc=O merge não será possível quando o branch de topo estiver atrás do branch base. settings.default_branch_desc=Selecione um branch padrão para pull requests e commits de código: -settings.merge_style_desc=Estilos de Merge -settings.default_merge_style_desc=Estilo de merge padrão para pull requests: +settings.merge_style_desc=Estilos de merge +settings.default_merge_style_desc=Estilo de merge padrão settings.choose_branch=Escolha um branch... settings.no_protected_branch=Não há branches protegidos. settings.edit_protected_branch=Editar settings.protected_branch_required_rule_name=Nome da regra é obrigatório -settings.protected_branch_duplicate_rule_name=Regra com nome duplicado +settings.protected_branch_duplicate_rule_name=Já existe uma regra para este conjunto de branches settings.protected_branch_required_approvals_min=Aprovações necessárias não podem ser negativas. settings.tags=Tags -settings.tags.protection=Proteção das Tags -settings.tags.protection.pattern=Padrão de Tag +settings.tags.protection=Proteção de tags +settings.tags.protection.pattern=Padrão de tag settings.tags.protection.allowed=Permitido settings.tags.protection.allowed.users=Usuários permitidos settings.tags.protection.allowed.teams=Equipes permitidas settings.tags.protection.allowed.noone=Ninguém -settings.tags.protection.create=Proteger tag +settings.tags.protection.create=Adicionar regra settings.tags.protection.none=Não há tags protegidas. -settings.bot_token=Token do Bot +settings.bot_token=Token do bot settings.chat_id=ID do Chat settings.matrix.homeserver_url=URL do Homeserver settings.matrix.room_id=ID da Sala -settings.matrix.message_type=Tipo de Mensagem +settings.matrix.message_type=Tipo de mensagem settings.archive.button=Arquivar repositório settings.archive.header=Arquivar este repositório settings.archive.success=O repositório foi arquivado com sucesso. settings.archive.error=Um erro ocorreu enquanto estava sendo arquivado o repositório. Veja o log para mais detalhes. settings.archive.error_ismirror=Você não pode arquivar um repositório espelhado. -settings.archive.branchsettings_unavailable=Configurações do branch não estão disponíveis quando o repositório está arquivado. -settings.archive.tagsettings_unavailable=As configurações de tag não estão disponíveis se o repositório estiver arquivado. +settings.archive.branchsettings_unavailable=Configurações de branch não estão disponíveis em repositórios arquivados. +settings.archive.tagsettings_unavailable=Configurações de tag não estão disponíveis em repositórios arquivados. settings.update_avatar_success=O avatar do repositório foi atualizado. settings.lfs=LFS settings.lfs_filelist=Arquivos LFS armazenados neste repositório @@ -2424,23 +2488,23 @@ settings.lfs_findcommits=Encontrar commits settings.lfs_lfs_file_no_commits=Nenhum commit encontrado para este arquivo LFS settings.lfs_noattribute=Este caminho não possui atributo bloqueável no branch padrão settings.lfs_delete=Excluir arquivo LFS com OID %s -settings.lfs_delete_warning=A exclusão de um arquivo LFS pode causar erros do tipo 'o objeto não existe' no checkout. Você tem certeza? +settings.lfs_delete_warning=A exclusão de um arquivo LFS pode causar erros do tipo "o objeto não existe" ao fazer checkout. Você tem certeza? settings.lfs_findpointerfiles=Encontre arquivos de ponteiro settings.lfs_locks=Bloqueios settings.lfs_invalid_locking_path=Caminho inválido: %s settings.lfs_invalid_lock_directory=Não é possível bloquear o diretório: %s settings.lfs_lock_already_exists=O bloqueio já existe: %s settings.lfs_lock=Bloqueio -settings.lfs_lock_path=Caminho de arquivo para bloquear... +settings.lfs_lock_path=Caminho de arquivo para travar… settings.lfs_locks_no_locks=Sem bloqueios settings.lfs_lock_file_no_exist=Arquivo bloqueado não existe no branch padrão settings.lfs_force_unlock=Forçar desbloqueio settings.lfs_pointers.found=Encontrado %d ponteiro(s) de blob - %d associado, %d não associado (%d ausente na loja) -settings.lfs_pointers.sha=SHA Blob +settings.lfs_pointers.sha=Hash do blob settings.lfs_pointers.oid=OID settings.lfs_pointers.inRepo=No repositório settings.lfs_pointers.exists=Existe na loja -settings.lfs_pointers.accessible=Acessível ao Usuário +settings.lfs_pointers.accessible=Acessível ao usuário settings.lfs_pointers.associateAccessible=Associar %d OIDs acessíveis settings.rename_branch_failed_exist=Não é possível renomear o branch porque existe o branch %s. settings.rename_branch_failed_not_exist=Não é possível renomear o branch %s porque ele não existe. @@ -2453,11 +2517,11 @@ diff.browse_source=Ver código fonte diff.parent=pai diff.commit=commit diff.git-notes=Notas -diff.data_not_available=Conteúdo de diff não disponível -diff.options_button=Opções de diferenças +diff.data_not_available=O conteúdo do diff não está disponível +diff.options_button=Opções de visualização de diferenças diff.show_diff_stats=Mostrar estatísticas -diff.download_patch=Baixar arquivo de patch -diff.download_diff=Baixar arquivo de diferenças +diff.download_patch=Baixar arquivo patch +diff.download_diff=Baixar arquivo diff diff.show_split_view=Visão dividida diff.show_unified_view=Visão unificada diff.whitespace_button=Espaço em branco @@ -2483,12 +2547,12 @@ diff.load=Carregar Diff diff.generated=gerado diff.vendored=externo diff.comment.placeholder=Deixe um comentário -diff.comment.markdown_info=Estilo com markdown é suportado. +diff.comment.markdown_info=Estilo com Markdown é suportado. diff.comment.add_single_comment=Adicionar um único comentário diff.comment.add_review_comment=Adicionar comentário diff.comment.start_review=Iniciar revisão diff.comment.reply=Responder -diff.review=Revisão +diff.review=Finalizar revisão diff.review.header=Enviar revisão diff.review.placeholder=Comentário da revisão diff.review.comment=Comentar @@ -2509,12 +2573,12 @@ releases.desc=Acompanhe as versões e downloads do projeto. release.releases=Versões release.detail=Detalhes da versão release.tags=Tags -release.new_release=Nova versão +release.new_release=Nova release release.draft=Rascunho -release.prerelease=Versão prévia +release.prerelease=Pré-release release.stable=Estável release.compare=Comparar -release.edit=editar +release.edit=Editar release.ahead.commits=%d commits release.ahead.target=para %s desde esta versão tag.ahead.target=para %s desde esta tag @@ -2529,15 +2593,15 @@ release.tag_helper_existing=Tag existente. release.title=Título da versão release.title_empty=O título não pode estar em branco. release.message=Descreva esta versão -release.prerelease_desc=Marcar como pré-lançamento +release.prerelease_desc=Marcar como pré-release release.prerelease_helper=Marcar esta versão como inadequada para uso em produção. release.cancel=Cancelar -release.publish=Publicar versão +release.publish=Publicar release release.save_draft=Salvar rascunho -release.edit_release=Atualizar versão -release.delete_release=Excluir versão -release.delete_tag=Apagar Tag -release.deletion=Excluir versão +release.edit_release=Atualizar release +release.delete_release=Excluir release +release.delete_tag=Excluir tag +release.deletion=Excluir release release.deletion_success=A versão foi excluída. release.deletion_tag_desc=A tag será excluída do repositório. Conteúdo do repositório e histórico permanecerão inalterados. Continuar? release.deletion_tag_success=A tag foi excluída. @@ -2548,15 +2612,15 @@ release.tag_already_exist=Este nome de tag já existe. release.downloads=Downloads release.download_count=Downloads: %s release.add_tag_msg=Use o título e o conteúdo do lançamento como mensagem da tag. -release.add_tag=Criar apenas a tag +release.add_tag=Criar tag release.releases_for=Versões para %s release.tags_for=Tags para %s -branch.name=Nome do Branch +branch.name=Nome do branch branch.already_exists=Um branch com o nome "%s" já existe. branch.delete_head=Excluir -branch.delete=`Excluir branch "%s"` -branch.delete_html=Excluir Branch +branch.delete=Excluir branch "%s" +branch.delete_html=Excluir branch branch.deletion_success=Branch "%s" excluído. branch.deletion_failed=Falha ao excluir o branch "%s". branch.delete_branch_has_new_commits=O branch "%s" não pode ser excluído porque novos commits foram feitos após o merge. @@ -2569,9 +2633,9 @@ branch.restore_success=Branch "%s" restaurado. branch.restore_failed=Ocorreu um erro ao restaurar o branch "%s". branch.protected_deletion_failed=Branch "%s" é protegido. Ele não pode ser excluído. branch.default_deletion_failed=Branch "%s" é o branch padrão. Ele não pode ser excluído. -branch.restore=`Restaurar branch "%s"` -branch.download=`Baixar branch "%s"` -branch.rename=`Renomear branch "%s"` +branch.restore=Restaurar branch "%s" +branch.download=Baixar branch "%s" +branch.rename=Renomear branch "%s" branch.included_desc=Este branch faz parte do branch padrão branch.included=Incluído branch.create_new_branch=Criar branch a partir do branch: @@ -2591,11 +2655,11 @@ tag.create_tag_from=`Criar nova tag a partir de "%s"` tag.create_success=Tag "%s" criada. -topic.manage_topics=Gerenciar Tópicos +topic.manage_topics=Gerenciar tópicos topic.done=Feito topic.count_prompt=Você não pode selecionar mais de 25 tópicos -find_file.go_to_file=Ir para arquivo +find_file.go_to_file=Encontrar um arquivo find_file.no_matching=Nenhum arquivo correspondente encontrado error.csv.too_large=Não é possível renderizar este arquivo porque ele é muito grande. @@ -2609,13 +2673,13 @@ issues.role.collaborator = Colaborador(a) issues.label_archived_filter = Mostrar etiquetas arquivadas pulls.status_checks_hide_all = Esconder todas as verificações pulls.status_checks_show_all = Mostrar todas as verificações -pulls.cmd_instruction_hint = `Ver as instruções da linha de comando.` +pulls.cmd_instruction_hint = Ver instruções de linha de comando wiki.cancel = Cancelar settings.unarchive.success = O repositório foi desarquivado. settings.unarchive.button = Desarquivar repositório settings.unarchive.header = Desarquivar este repositório diff.comment.add_line_comment = Adicionar comentário na linha -new_repo_helper = Um repositório contém todos os arquivos de projeto, incluindo o histórico de revisões. Já hospeda um repositório em outra plataforma? Migrar repositório +new_repo_helper = Um repositório contém todos os arquivos de projeto, incluindo o histórico de revisões. Já hospeda um repositório em outra plataforma? Migrar repositório. blame.ignore_revs.failed = Falha ao ignorar as revisões em .git-blame-ignore-revs. migrate.forgejo.description = Migrar dados do codeberg.org ou outras servidores Forgejo. commits.browse_further = Ver mais @@ -2625,10 +2689,10 @@ issues.role.contributor = Contribuidor(a) issues.role.member_helper = Este usuário é membro da organização proprietária deste repositório. issues.role.collaborator_helper = Este(a) usuário(a) foi convidado(a) para colaborar neste repositório. pulls.cmd_instruction_checkout_title = Checkout -settings.wiki_globally_editable = Permitir que qualquer pessoa possa editar a wiki +settings.wiki_globally_editable = Permitir que qualquer pessoa edite a wiki settings.transfer_abort_success = A transferência de repositório para %s foi cancelada. settings.enter_repo_name = Digite os nomes do dono e do repositório exatamente neste formato: -issues.blocked_by_user = Você não pode criar uma questão neste repositório porque você foi bloqueado pelo dono do repositório. +issues.blocked_by_user = Você não pode criar issues neste repositório porque você foi bloqueado pelo dono do repositório. settings.new_owner_blocked_doer = Você foi bloqueado pelo novo dono do repositório. settings.wiki_rename_branch_main_notices_1 = NÃO É POSSÃVEL desfazer esta ação. tree_path_not_found_commit = O caminho %[1]s não existe no commit %[2]s @@ -2639,7 +2703,7 @@ admin.update_flags = Atualizar sinalizadores admin.flags_replaced = Os sinalizadores do repositório foram substituídos all_branches = Todos os ramos fork_branch = Branch a ser clonada para o fork -object_format_helper = O formato utilizado para armazenar os objetos do repositório, sendo SHA1 o mais compatível. Esta ação é IRREVERSÃVEL. +object_format_helper = O formato utilizado para armazenar os objetos do repositório. Não pode ser alterado depois. SHA1 é o mais compatível. object_format = Formato dos objetos tree_path_not_found_branch = O caminho %[1]s não existe no ramo %[2]s tree_path_not_found_tag = O caminho %[1]s não existe na etiqueta %[2]s @@ -2651,16 +2715,15 @@ issues.role.contributor_helper = Este usuário fez commits para o repositório a issues.choose.invalid_config = A configuração de issue contém erros: pulls.made_using_agit = AGit contributors.contribution_type.filter_label = Tipo de contribuição: -contributors.contribution_type.commits = Commits settings.webhook.test_delivery_desc_disabled = Ative este webhook para testá-lo com um evento simulado. activity.navbar.contributors = Contribuidores issues.label_archive_tooltip = Etiquetas arquivadas não serão exibidas nas sugestões de pesquisa de etiquetas. activity.navbar.pulse = Recente settings.units.overview = Geral -settings.units.add_more = Adicionar mais... +settings.units.add_more = Habilitar mais pulls.commit_ref_at = `referenciou este pedido de mesclagem no commit %[2]s` pulls.cmd_instruction_merge_title = Mesclar -settings.units.units = Funcionalidades +settings.units.units = Unidades vendored = Externo issues.num_participants_one = %d participante issues.archived_label_description = (arquivada) %s @@ -2673,7 +2736,7 @@ settings.confirm_wiki_branch_rename = Renomar o ramo da wiki pulls.merged_title_desc_one = mesclou %[1]d commit de %[2]s em %[3]s %[4]s activity.navbar.recent_commits = Commits recentes size_format = %[1]s: %[2]s; %[3]s: %[4]s -pulls.title_desc_one = quer mesclar %[1]d commit de %[2]s em %[3]s +pulls.title_desc_one = quer mesclar %[1]d commit de %[2]s em %[3]s pulls.cmd_instruction_merge_desc = Mescle as alterações e enviar para o Forgejo. pulls.ready_for_review = Pronto para revisão? commits.search_branch = Este ramo @@ -2701,11 +2764,11 @@ comments.edit.already_changed = Falha ao salvar as alterações ao comentário. activity.navbar.code_frequency = Frequência de código settings.protect_status_check_matched = Correspondente branch.tag_collision = O ramo "%s" não pode ser criado porque já existe uma etiqueta com o mesmo nome no repositório. -settings.archive.mirrors_unavailable = As réplicas ficarão indisponíveis se o repositório estiver arquivado. +settings.archive.mirrors_unavailable = Réplicas não estão disponíveis em repositórios arquivados. release.download_count_one = %s download settings.mirror_settings.docs.no_new_mirrors = O seu repositório está replicando alterações de ou para outro repositório. Observe que não é possível criar novas réplicas no momento. settings.mirror_settings.docs.pull_mirror_instructions = Para configurar uma réplica de outro repositório, consulte: -settings.wiki_rename_branch_main_desc = Renomear o ramo usado internamente pela wiki para "%s". Esta ação é IRREVERSÃVEL. +settings.wiki_rename_branch_main_desc = Renomear o branch usado internamente pela Wiki para "%s". Esta ação é permanente e não pode ser desfeita. settings.enforce_on_admins = Impor esta regra aos administradores de repositórios settings.enforce_on_admins_desc = Administradores de repositório não podem burlar esta regra. subscribe.issue.guest.tooltip = Faça login para receber notificações desta questão @@ -2720,8 +2783,8 @@ release.system_generated = Este anexo foi gerado automaticamente. settings.wiki_branch_rename_failure = Falha ao regularizar o nome do ramo da wiki do repositório. settings.add_collaborator_blocked_them = Não foi possível adicionar o(a) colaborador(a) porque ele(a) bloqueou o(a) proprietário(a) do repositório. settings.thread_id = ID da discussão -issues.edit.already_changed = Não foi possível salvar as alterações desta questão porque o conteúdo foi alterado por outro(a) usuário(a). Atualize a página e tente novamente para evitar sobrescrever as alterações. -pulls.edit.already_changed = Não foi possível salvar as alterações deste pedido de integração porque o conteúdo foi alterado por outro(a) usuário(a). Atualize a página e tente novamente para evitar sobrescrever as alterações. +issues.edit.already_changed = Não foi possível salvar as alterações desta questão. O conteúdo parece já ter sido alterado por outro(a) usuário(a). Atualize a página e tente novamente para evitar sobrescrever estas alterações. +pulls.edit.already_changed = Não foi possível salvar as alterações deste pull request. Parece que o conteúdo já foi alterado por outro(a) usuário(a). Atualize a página e tente novamente para evitar sobrescrever estas alterações. editor.commit_id_not_matching = O arquivo foi alterado durante a edição. Salve as alterações em um novo ramo e realize a mesclagem. blame.ignore_revs = As revisões em .git-blame-ignore-revs foram ignoradas. Clique aqui para retornar à visualização normal. topic.format_prompt = Os tópicos devem começar com um caracter alfanumérico, podem incluir hífens ("-") e pontos ("."), e podem ter até 35 caracteres. As letras devem ser minúsculas. @@ -2732,8 +2795,130 @@ activity.published_tag_label = Etiqueta issues.author.tooltip.issue = Este(a) usuário(a) é o(a) autor(a) desta questão. no_eol.text = Sem EOL no_eol.tooltip = Não há um caractere de fim de linha no final do arquivo. +pulls.fast_forward_only_merge_pull_request = Apenas fast-forward +pulls.has_merged = Falha: O pull request foi merged, você não pode merge novamente ou mudar o branch destino. +issues.author.tooltip.pr = Esse usuário é o autor dessa solicitação de pull. +editor.push_out_of_date = O push parece estar desatualizado. +issues.comment.blocked_by_user = Você não pode comentar neste issue porque você foi bloqueado pelo dono do repositório ou pelo autor deste issue. +pulls.blocked_by_user = Você não pode criar uma solicitação de pull nesse repositório porque você está bloqueado pelo dono do repositório. +mirror_use_ssh.helper = Forgejo irá espelhar o repositório via Git através de SSH e criar um par de chaves para você ao escolher essa opção. Você deverá garantir que a chave pública gerada está autorizada a fazer push para o repositório de destino. Você não pode usar autorização baseada em senha ao escolher essa opção. +mirror_denied_combination = Não é possível combinar o uso de chave pública e autenticação baseada em senha. +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. +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. +signing.wont_sign.headsigned = O merge não será assinado pois o commit head não está assinado. +settings.mirror_settings.push_mirror.copy_public_key = Copiar chave pública +settings.pull_mirror_sync_in_progress = Fazendo pull das mudanças do remoto %s nesse momento. +pulls.reopen_failed.head_branch = O pull request não pode ser reaberto porque o branch head não existe mais. +pulls.cmd_instruction_checkout_desc = Do repositório do seu projeto, faça checkout de um novo branch e teste as alterações. +settings.mirror_settings.docs.pulling_remote_title = Fazendo pull de um repositório remoto +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. +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. +pulls.reopen_failed.base_branch = O pull request não pode ser reaberto porque o branch base não existe mais. +activity.commit = Atividade de commits +pulls.cmd_instruction_merge_warning = Atenção: A opção "Autodetectar merge manual" não está habilitada para este repositório, você terá que marcar este pull request como um merge manual depois. +settings.federation_following_repos = URLs de Repositórios Seguidores. Separado por ";", sem espaços. +settings.mirror_settings.docs.disabled_push_mirror.info = Espelhos de pull foram desativados pelo administrador do seu site. +settings.mirror_settings.push_mirror.none_ssh = Nenhum +settings.protect_status_check_patterns_desc = Insira padrões para especificar quais verificações de status devem passar com sucesso antes que merges possam ser feitos em branches aos quais esta regra se aplica. Cada linha especifica um padrão. Padrões não podem estar vazios. +settings.archive.text = Arquivar o repositório irá torná-lo totalmente "somente leitura". Ele ficará oculto do painel. Ninguém (nem mesmo você!) poderá fazer novos commits, ou abrir quaisquer issues ou pull requests. +settings.add_key_success = A chave de deploy "%s" foi adicionada. +settings.protect_invalid_status_check_pattern = Padrão de verificação de status inválido: "%s". +settings.web_hook_name_sourcehut_builds = Builds do SourceHut +settings.protect_new_rule = Criar uma nova regra de proteção de branch +settings.wiki_rename_branch_main_notices_2 = Isso irá renomear permanentemente o branch interno da wiki do repositório %s. Checkouts existentes precisarão ser atualizados. +settings.protect_enable_merge_desc = Qualquer pessoa com permissão de escrita terá autorização para fazer merge dos pull requests neste ramo. +settings.protect_no_valid_status_check_patterns = Não há padrões de verificação de status válidos. +settings.event_pull_request_approvals = Aprovações de pull request +settings.event_pull_request_enforcement = Aplicação +settings.ignore_stale_approvals = Ignorar aprovações inativas +settings.update_settings_no_unit = O repositório deve permitir pelo menos algum tipo de interação. +settings.protect_branch_name_pattern_desc = Padrões de nome de branch protegidos. Ver sintaxe de padrões na documentação. Exemplos: main, release/** +settings.webhook.replay.description_disabled = Para executar novamente este webhook, ative-o. +settings.sourcehut_builds.manifest_path = Caminho do manifest de build +settings.sourcehut_builds.secrets_helper = Dar a este job acesso aos segredos de build (requer a permissão SECRETS:RO) +settings.sourcehut_builds.access_token_helper = Token de acesso tem a permissão JOBS:RW. Gere um token builds.sr.ht ou um token builds.sr.ht com acesso a segredos em meta.sr.ht. +settings.matrix.room_id_helper = O ID da sala pode ser obtido do cliente web Element > Configurações da Sala > Avançado > ID interno da sala. Exemplo: %s. +settings.unarchive.error = Ocorreu um erro ao tentar desarquivar o repositório. Veja o log para mais detalhes. +settings.event_pull_request_review_request = Pedidos de revisão +settings.event_pull_request_review_request_desc = Revisão de pull request solicitada ou pedido de revisão removido. +settings.event_pull_request_merge = Merge de pull request +settings.matrix.access_token_helper = É recomendado configurar uma conta Matrix dedicada para isso. O token de acesso pode ser obtido do cliente web Element (em uma aba privada/anônima) > Menu do usuário (acima à esquerda) > Todas as configurações > Ajuda & Sobre > Avançado > Token de acesso (logo abaixo da URL do servidor). Feche a aba privada/anônima (sair da conta irá invalidar o token). +settings.tags.protection.pattern.description = Você pode usar um único nome, um padrão glob ou uma expressão regular para corresponder a várias tags. Saiba mais no guia de tags protegidas. +settings.add_webhook.invalid_path = O caminho não deve conter partes que sejam "." ou ".." ou uma string vazia. Ele não pode começar ou terminar com uma barra. +settings.sourcehut_builds.visibility = Visibilidade do job +settings.unarchive.text = Desarquivar o repositório irá restaurar a possibilidade de receber commits e push, bem como novos issues e pull requests. +settings.ignore_stale_approvals_desc = Não contar aprovações feitas em commits mais antigos (revisões inativas) no número de aprovações de pedidos de merge. Não tem efeito se as revisões inativas já são desconsideradas. +settings.protect_status_check_patterns = Padrões de verificação de status +error.broken_git_hook = Os hooks Git desse repositório parecem estar quebrados. Por favor, siga a documentação para corrigi-los e então faça push de alguns commits para atualizar o status. +release.type_attachment = Anexo +release.type_external_asset = Recurso externo +release.asset_name = Nome do recurso +release.asset_external_url = URL Externa +release.hide_archive_links_helper = Esconder automaticamente arquivos de código fonte gerados para esse release. Por exemplo, se você estiver enviando os seus manualmente. +branch.delete_desc = Apagar um branch é permanente. Ainda que o branch apagado possa continuar a existir por um breve período antes de ser realmente apagado, isso NÃO PODE ser desfeito na maioria dos casos. Continuar? +release.add_external_asset = Adicionar componente externo +release.invalid_external_url = URL externo inválido: "%s" +release.deletion_desc = Eliminar um release apenas o remove do Forgejo. Isso não irá afetar a tag no Git, o conteúdo do seu repositório ou o histórico. Continuar? +issues.all_title = Tudo +issues.new.assign_to_me = Designar a mim +settings.discord_icon_url.exceeds_max_length = A URL do ícone precisa ter 2048 caracteres ou menos +issues.review.add_review_requests = solicitou revisões de %[1]s %[2]s +issues.review.remove_review_requests = removeu pedidos de revisão para %[1]s %[2]s +issues.review.add_remove_review_requests = solicitou revisões de %[1]s e removeu pedidos de revisão para %[2]s %[3]s +pulls.delete_after_merge.head_branch.is_default = O branch head que você quer excluir é o branch padrão e não pode ser excluído. +pulls.delete_after_merge.head_branch.is_protected = O branch head que você quer excluir é um branch protegido e não pode ser excluído. +pulls.delete_after_merge.head_branch.insufficient_branch = Você não tem permissão para excluir o branch head. +issues.filter_sort.relevance = Relevância +diff.git-notes.add = Adicionar anotação +diff.git-notes.remove-header = Remover anotação +diff.git-notes.remove-body = Esta anotação será removida. +issues.num_reviews_one = %d revisão +issues.summary_card_alt = Cartão de resumo de um issue com o título "%s" no repositório %s +issues.num_reviews_few = %d revisões +settings.default_update_style_desc = Estilo padrão de atualização usado para atualizar pull requests que estão atrasados em relação ao branch base. +pulls.sign_in_require = Entre para criar um novo pull request. +new_from_template = Use um modelo +new_from_template_description = Você pode selecionar um modelo de repositório nesta instância e aplicar suas configurações. +new_advanced = Configurações avançadas +new_advanced_expand = Clique para expandir +auto_init_description = Inicializar o histórico do Git com um README e opcionalmente adicionar arquivos License e .gitignore. +issues.reaction.alt_remove = Remover reação %[1]s deste comentário. +issues.reaction.alt_add = Adicionar reação %[1]s ao comentário. +issues.context.menu = Menu de comentário +issues.reaction.add = Adicionar reação +issues.reaction.alt_few = %[1]s reagiu com %[2]s. +issues.reaction.alt_many = %[1]s e mais %[2]d reagiram com %[3]s. +summary_card_alt = Cartão de resumo do repositório %s +release.summary_card_alt = Cartão de resumo de um release intitulado "%s" no repositório %s +archive.pull.noreview = Este repositório está arquivado. Não é possível revisar pull requests. +editor.commit_email = Email de commit +commits.view_single_diff = Ver modificações neste arquivo introduzidas neste commit +pulls.editable = Editável +pulls.editable_explanation = Este pull request permite edições de mantenedores. Voçê pode contribuir diretamenta para ele. +issues.reopen.blocked_by_user = Você não pode reabrir este issue porque você foi bloqueado pelo dono do repositório ou pelo criador deste issue. +pulls.comment.blocked_by_user = Você não pode comentar neste pull request porque você foi bloqueado pelo dono do repositório ou pelo autor do pull request. +issues.filter_no_results = Nenhum resultado +issues.filter_no_results_placeholder = Tente ajustar seus filtros de pesquisa. [graphs] +component_loading = Carregando %s… +component_loading_failed = Não foi possível carregar o(a) %s +component_loading_info = Pode demorar um pouco… +contributors.what = contribuições +code_frequency.what = frequência de código +recent_commits.what = commits recentes +component_failed_to_load = Ocorreu um erro inesperado. + [org] org_name_holder=Nome da organização @@ -2755,7 +2940,7 @@ team_name_helper=Nomes de equipe devem ser curtos e memoráveis. team_desc_helper=Descreva a finalidade ou o papel da equipe. team_access_desc=Acesso ao repositório team_permission_desc=Permissão -team_unit_desc=Permitir o acesso a seções de repositório +team_unit_desc=Permitir acesso a seções do repositório team_unit_disabled=(Desabilitado) form.name_reserved=O nome de organização "%s" está reservado. @@ -2770,12 +2955,12 @@ settings.permission=Permissões settings.repoadminchangeteam=O administrador do repositório pode adicionar e remover o acesso para equipes settings.visibility=Visibilidade settings.visibility.public=Pública -settings.visibility.limited=Limitado (Visível apenas para usuários autenticados) +settings.visibility.limited=Limitado (visível apenas para usuários autenticados) settings.visibility.limited_shortname=Limitado -settings.visibility.private=Privada (Visível apenas para membros da organização) +settings.visibility.private=Privada (visível apenas para membros da organização) settings.visibility.private_shortname=Privado -settings.update_settings=Atualizar Configurações +settings.update_settings=Atualizar configurações settings.update_setting_success=Configurações da organização foram atualizadas. settings.change_orgname_redirect_prompt=O nome antigo irá redirecionar até que seja reivindicado. settings.update_avatar_success=O avatar da organização foi atualizado. @@ -2789,29 +2974,29 @@ settings.hooks_desc=Adicionar Webhooks que serão acionados para todos o settings.labels_desc=Adicionar rótulos que possam ser usadas em issues para todos os repositórios desta organização. -members.membership_visibility=Visibilidade da associação: +members.membership_visibility=Visibilidade de membros: members.public=Público -members.public_helper=tornar privado +members.public_helper=Tornar privado members.private=Privado -members.private_helper=tornar público -members.member_role=Categoria de membro: +members.private_helper=Tornar público +members.member_role=Papel do membro: members.owner=Proprietário members.member=Membro members.remove=Remover members.remove.detail=Remover %[1]s de %[2]s? members.leave=Sair -members.leave.detail=Sair de %s? +members.leave.detail=Você tem certeza que quer sair da organização "%s"? members.invite_desc=Adicionar novo membro em %s: members.invite_now=Convidar agora teams.join=Juntar-se teams.leave=Deixar -teams.leave.detail=Sair de %s? +teams.leave.detail=Você tem certeza que quer sair da equipe "%s"? teams.can_create_org_repo=Criar repositórios teams.can_create_org_repo_helper=Membros podem criar novos repositórios na organização. O criador terá acesso administrativo ao novo repositório. -teams.none_access=Sem Acesso -teams.none_access_helper=Os membros não podem ver ou fazer qualquer outra ação nesta unidade. -teams.general_access=Acesso Geral +teams.none_access=Sem acesso +teams.none_access_helper=A opção "sem acesso" só tem efeito em repositórios privados. +teams.general_access=Acesso personalizado teams.general_access_helper=As permissões dos membros serão decididas pela tabela de permissões abaixo. teams.read_access=Leitura teams.read_access_helper=Os membros podem ver e clonar os repositórios da equipe. @@ -2833,7 +3018,7 @@ teams.delete_team_desc=A exclusão de uma equipe revoga o acesso ao repositório teams.delete_team_success=A equipe foi excluída. teams.read_permission_desc=Essa equipe concede acesso para Leitura: membros podem ver e clonar os repositórios da equipe. teams.write_permission_desc=Esta equipe concede acesso para escrita: Membros podem ler e fazer push para os repositórios da equipe. -teams.admin_permission_desc=Esta equipe concede acesso de Administrador: Membros podem ler, fazer push e adicionar outros colaboradores para os repositórios da equipe. +teams.admin_permission_desc=Esta equipe concede acesso de Administrador: membros podem ler, fazer push e adicionar outros colaboradores em repositórios da equipe. teams.create_repo_permission_desc=Além disso, esta equipe concede permissão de Criar repositório: membros podem criar novos repositórios na organização. teams.repositories=Repositórios da equipe teams.search_repo_placeholder=Pesquisar repositório... @@ -2841,7 +3026,7 @@ teams.remove_all_repos_title=Remover todos os repositórios da equipe teams.remove_all_repos_desc=Isto irá remover todos os repositórios da equipe. teams.add_all_repos_title=Adicionar todos os repositórios teams.add_all_repos_desc=Isto irá adicionar todos os repositórios da organização à equipe. -teams.add_nonexistent_repo=O repositório que você está tentando adicionar não existe. Crie-o antes de adicioná-lo. +teams.add_nonexistent_repo=O repositório que você está tentando adicionar não existe, por favor crie-o primeiro. teams.add_duplicate_users=Usuário já é um membro da equipe. teams.repos.none=Nenhum repositório pode ser acessado por essa equipe. teams.members.none=Nenhum membro nesta equipe. @@ -2860,6 +3045,8 @@ open_dashboard = Abrir painel settings.change_orgname_prompt = Obs.: Alterar o nome de uma organização resultará na alteração do URL dela e disponibilizará o nome antigo para uso. follow_blocked_user = Não foi possível seguir esta organização porque ela bloqueou-o(a). form.name_pattern_not_allowed = O padrão "%s" não é permitido no nome de uma organização. +settings.change_orgname_redirect_prompt.with_cooldown.one = O nome de organização antigo ficará disponível para qualquer pessoa após um período de proteção de %[1]d dia, você ainda pode recuperar o nome antigo durante este período de proteção. +settings.change_orgname_redirect_prompt.with_cooldown.few = O nome de organização antigo ficará disponível para qualquer pessoa após um período de espera de %[1]d dia, você ainda pode recuperar o nome antigo durante este período de espera. [admin] dashboard=Painel @@ -2869,7 +3056,7 @@ repositories=Repositórios hooks=Webhooks integrations=Integrações authentication=Fontes de autenticação -emails=E-mails do Usuário +emails=E-mails do usuário config=Configuração notices=Avisos do sistema monitor=Monitoramento @@ -2902,62 +3089,62 @@ dashboard.delete_repo_archives.started=A tarefa de remover todos os arquivos foi dashboard.delete_missing_repos=Excluir todos os repositórios que não possuem seus arquivos Git dashboard.delete_missing_repos.started=Foi iniciada a tarefa de excluir todos os repositórios que não têm arquivos Git. dashboard.delete_generated_repository_avatars=Excluir avatares gerados do repositório -dashboard.update_mirrors=Atualizar espelhamentos +dashboard.update_mirrors=Atualizar espelhos dashboard.repo_health_check=Verificar estado de saúde de todos os repositórios dashboard.check_repo_stats=Verificar estatísticas de todos os repositórios dashboard.archive_cleanup=Apagar arquivos antigos de repositório dashboard.deleted_branches_cleanup=Realizar limpeza de branches apagados dashboard.update_migration_poster_id=Sincronizar os IDs do remetente da migração dashboard.git_gc_repos=Coleta de lixo em todos os repositórios -dashboard.resync_all_sshkeys=Atualizar o arquivo '.ssh/authorized_keys' com as chaves SSH do Forgejo. -dashboard.resync_all_sshprincipals=Atualizar o arquivo '.ssh/authorized_principals' com os diretores do Forgejo SSH. -dashboard.resync_all_hooks=Ressincronizar hooks pre-receive, update e post-receive de todos os repositórios. +dashboard.resync_all_sshkeys=Atualizar o arquivo ".ssh/authorized_keys" com as chaves SSH do Forgejo. +dashboard.resync_all_sshprincipals=Atualizar o arquivo ".ssh/authorized_principals" com os principals SSH do Forgejo. +dashboard.resync_all_hooks=Ressincronizar hooks pre-receive, update e post-receive de todos os repositórios dashboard.reinit_missing_repos=Reinicializar todos os repositórios Git perdidos cujos registros existem dashboard.sync_external_users=Sincronizar dados de usuário externo dashboard.cleanup_hook_task_table=Limpar tabela hook_task dashboard.cleanup_packages=Limpar pacotes expirados -dashboard.server_uptime=Tempo de atividade do Servidor -dashboard.current_goroutine=Goroutines Atuais +dashboard.server_uptime=Tempo de atividade do servidor +dashboard.current_goroutine=Goroutines atuais dashboard.current_memory_usage=Uso de memória atual dashboard.total_memory_allocated=Total de memória alocada dashboard.memory_obtained=Memória obtida -dashboard.pointer_lookup_times=Nº de consultas a ponteiros +dashboard.pointer_lookup_times=Número de consultas a ponteiros dashboard.memory_allocate_times=Alocações de memória dashboard.memory_free_times=Liberações de memória dashboard.current_heap_usage=Uso atual da heap dashboard.heap_memory_obtained=Memória de heap obtida -dashboard.heap_memory_idle=Memória da heap ociosa -dashboard.heap_memory_in_use=Memória da heap em uso -dashboard.heap_memory_released=Memória da heap liberada +dashboard.heap_memory_idle=Memória de heap ociosa +dashboard.heap_memory_in_use=Memória de heap em uso +dashboard.heap_memory_released=Memória de heap liberada dashboard.heap_objects=Objetos na heap dashboard.bootstrap_stack_usage=Uso de pilha bootstrap dashboard.stack_memory_obtained=Memória de pilha obtida -dashboard.mspan_structures_usage=Uso de estruturas de MSpan -dashboard.mspan_structures_obtained=Estruturas de MSpan obtidas -dashboard.mcache_structures_usage=Uso de estruturas de MCache -dashboard.mcache_structures_obtained=Estruturas de MCache obtidas -dashboard.profiling_bucket_hash_table_obtained=Perfil obtido da Bucket Hash Table +dashboard.mspan_structures_usage=Uso de estruturas MSpan +dashboard.mspan_structures_obtained=Estruturas MSpan obtidas +dashboard.mcache_structures_usage=Uso de estruturas MCache +dashboard.mcache_structures_obtained=Estruturas MCache obtidas +dashboard.profiling_bucket_hash_table_obtained=Hash table de profiling bucket obtida dashboard.gc_metadata_obtained=Metadados do GC obtidos dashboard.other_system_allocation_obtained=Outra alocação de sistema obtida dashboard.next_gc_recycle=Próxima reciclagem do GC -dashboard.last_gc_time=Desde da ultima vez do GC +dashboard.last_gc_time=Tempo desde última GC dashboard.total_gc_time=Pausa total do GC -dashboard.total_gc_pause=Pausa total do GC -dashboard.last_gc_pause=Última pausa do GC -dashboard.gc_times=Nº de execuções do GC -dashboard.delete_old_actions=Excluir todas as ações antigas do banco de dados -dashboard.delete_old_actions.started=A exclusão de todas as ações antigas do banco de dados foi iniciada. +dashboard.total_gc_pause=Pausa total de GC +dashboard.last_gc_pause=Última pausa de GC +dashboard.gc_times=Número de execuções do GC +dashboard.delete_old_actions=Excluir todas as atividades antigas do banco de dados +dashboard.delete_old_actions.started=A exclusão de todas as atividades antigas do banco de dados foi iniciada. dashboard.update_checker=Verificador de atualização dashboard.delete_old_system_notices=Excluir todos os avisos de sistema antigos do banco de dados dashboard.gc_lfs=Coletar lixos dos meta-objetos LFS -dashboard.stop_zombie_tasks=Parar tarefas zumbi -dashboard.stop_endless_tasks=Parar tarefas infinitas -dashboard.cancel_abandoned_jobs=Cancelar trabalhos abandonados +dashboard.stop_zombie_tasks=Parar tarefas de actions zumbi +dashboard.stop_endless_tasks=Parar tarefas infinitas de actions +dashboard.cancel_abandoned_jobs=Cancelar trabalhos abandonados de actions -users.user_manage_panel=Gerenciamento de conta de usuário +users.user_manage_panel=Gerenciar contas de usuário users.new_account=Criar conta de usuário users.name=Nome de usuário -users.full_name=Nome Completo +users.full_name=Nome completo users.activated=Ativado users.admin=Administrador users.restricted=Restrito @@ -2966,11 +3153,11 @@ users.2fa=2FA users.repos=Repositórios users.created=Criado users.last_login=Último acesso -users.never_login=Nunca acessado -users.send_register_notify=Enviar notificação de cadastro de usuário +users.never_login=Nunca entrou +users.send_register_notify=Notificar sobre cadastros via e-mail users.new_success=Usuário "%s" criado. users.edit=Editar -users.auth_source=Fonte da autenticação +users.auth_source=Fonte de autenticação users.local=Local users.auth_login_name=Nome de acesso da autenticação users.password_helper=Deixe a senha em branco para mantê-la inalterada. @@ -2978,21 +3165,21 @@ users.update_profile_success=A conta de usuário foi atualizada. users.edit_account=Editar a conta de usuário users.max_repo_creation=Número máximo de repositórios users.max_repo_creation_desc=(Use -1 para usar o limite padrão global.) -users.is_activated=Conta de usuário está ativada -users.prohibit_login=Desabilitar acesso -users.is_admin=É administrador -users.is_restricted=Está restrito -users.allow_git_hook=Pode criar hooks Git -users.allow_git_hook_tooltip=Hooks Git são executados como o usuário do SO que executa Forgejo e terá o mesmo nível de acesso ao servidor. Como resultado, os usuários com esse privilégio especial de Hook do Git podem acessar e modificar todos os repositórios do Forgejo, bem como o banco de dados usado pelo Forgejo. Por conseguinte, podem também obter privilégios de administrador do Forgejo. +users.is_activated=Conta ativada +users.prohibit_login=Conta suspensa +users.is_admin=Conta de administrador +users.is_restricted=Conta restrita +users.allow_git_hook=Pode criar hooks do Git +users.allow_git_hook_tooltip=Hooks do Git são executados como o usuário do SO que executa Forgejo e terão o mesmo nível de acesso ao servidor. Como resultado, usuários com esse privilégio especial de hooks do Git podem acessar e modificar todos os repositórios do Forgejo, bem como o banco de dados usado pelo Forgejo. Por isso, eles também podem obter privilégios de administrador do Forgejo. users.allow_import_local=Pode importar repositórios locais users.allow_create_organization=Pode criar organizações users.update_profile=Atualizar conta de usuário users.delete_account=Excluir conta de usuário -users.cannot_delete_self=Você não pode excluir você mesmo +users.cannot_delete_self=Você não pode excluir a si mesmo users.still_own_repo=Este usuário ainda possui um ou mais repositórios. Exclua ou transfira esses repositórios primeiro. users.still_has_org=Este usuário é membro de uma organização. Remova o usuário de qualquer organização primeiro. users.purge=Eliminar usuário -users.purge_help=Exclua forçosamente o usuário e quaisquer repositórios, organizações e pacotes pertencentes ao usuário. Todos os comentários também serão excluídos. +users.purge_help=Exclua forçosamente o usuário e quaisquer repositórios, organizações e pacotes pertencentes ao usuário. Todos os comentários e issues criados por esse usuário também serão excluídos. users.still_own_packages=Este usuário é dono de um ou mais pacotes. Exclua estes pacotes antes de continuar. users.deletion_success=A conta de usuário foi excluída. users.reset_2fa=Reinicializar 2FA @@ -3001,12 +3188,12 @@ users.list_status_filter.reset=Reset users.list_status_filter.is_active=Ativo users.list_status_filter.not_active=Inativo users.list_status_filter.is_admin=Administrador -users.list_status_filter.not_admin=Não Administrador +users.list_status_filter.not_admin=Não administrador users.list_status_filter.is_restricted=Restrito users.list_status_filter.not_restricted=Não restrito users.list_status_filter.is_prohibit_login=Proibir login users.list_status_filter.not_prohibit_login=Permitir login -users.list_status_filter.is_2fa_enabled=2FA Ativado +users.list_status_filter.is_2fa_enabled=Autenticação de dois fatores ativada users.list_status_filter.not_2fa_enabled=Autenticação em duas etapas desativada users.details=Detalhes do usuário @@ -3029,8 +3216,8 @@ orgs.members=Membros orgs.new_orga=Nova organização repos.repo_manage_panel=Gerenciar repositórios -repos.unadopted=Repositórios Não Adotados -repos.unadopted.no_more=Não foram encontrados mais repositórios não adotados +repos.unadopted=Repositórios não adotados +repos.unadopted.no_more=Não foram encontrados repositórios não adotados. repos.owner=Proprietário(a) repos.name=Nome repos.private=Privado @@ -3054,11 +3241,11 @@ packages.repository=Repositório packages.size=Tamanho packages.published=Publicado -defaulthooks=Webhooks Padrões +defaulthooks=Webhooks padrão defaulthooks.add_webhook=Adicionar Webhook Padrão defaulthooks.update_webhook=Atualizar Webhook Padrão -systemhooks=Webhooks do Sistema +systemhooks=Webhooks do sistema systemhooks.add_webhook=Adicionar Webhook do Sistema systemhooks.update_webhook=Atualizar Webhook do Sistema @@ -3084,20 +3271,20 @@ auths.attribute_username_placeholder=Deixe em branco para usar o nome de usuári auths.attribute_name=Atributo primeiro nome auths.attribute_surname=Atributo sobrenome auths.attribute_mail=Atributo e-mail -auths.attribute_ssh_public_key=Atributo de chave SSH pública -auths.attribute_avatar=Atributo do avatar -auths.attributes_in_bind=Buscar os atributos no contexto de Bind DN +auths.attribute_ssh_public_key=Atributo chave SSH pública +auths.attribute_avatar=Atributo avatar +auths.attributes_in_bind=Obter os atributos no contexto de bind DN auths.allow_deactivate_all=Permitir que um resultado de pesquisa vazio para desativar todos os usuários auths.use_paged_search=Usar pesquisa paginada auths.search_page_size=Tamanho da página auths.filter=Filtro de usuário auths.admin_filter=Filtro de administrador auths.restricted_filter=Filtro restrito -auths.restricted_filter_helper=Deixe em branco para não definir nenhum usuário como restrito. Use um asterisco ('*') para definir todos os usuários que não correspondem ao Filtro de administrador como restritos. +auths.restricted_filter_helper=Deixe em branco para não definir nenhum usuário como restrito. Use um asterisco ("*") para definir todos os usuários que não correspondem ao filtro Administrador como restritos. auths.verify_group_membership=Verificar associação ao grupo no LDAP (deixe o filtro vazio para ignorar) -auths.group_search_base=Grupo de Pesquisa DN Base -auths.group_attribute_list_users=Atributo do Grupo que Contém a Lista de Usuários -auths.user_attribute_in_group=Atributo do Usuário Listado em Grupo +auths.group_search_base=DN Base para pesquisa de grupos +auths.group_attribute_list_users=Atributo do grupo que contém a lista de usuário +auths.user_attribute_in_group=Atributo de usuário listado no grupo auths.map_group_to_team=Mapear grupos LDAP para Organizações (deixe o campo vazio para pular) auths.map_group_to_team_removal=Remover usuários de equipes sincronizadas se o usuário não pertence ao grupo LDAP correspondente auths.enable_ldap_groups=Habilitar grupos LDAP @@ -3128,15 +3315,15 @@ auths.oauth2_emailURL=URL do e-mail auths.skip_local_two_fa=Ignorar autenticação em duas etapas local auths.skip_local_two_fa_helper=Deixar desligado significa que os usuários locais com 2FA ligada ainda terão que fazer login com 2FA auths.oauth2_tenant=Locatário -auths.oauth2_scopes=Escopos Adicionais -auths.oauth2_required_claim_name=Nome do Claim Obrigatorio +auths.oauth2_scopes=Escopos adicionais +auths.oauth2_required_claim_name=Nome obrigatório do claim auths.oauth2_required_claim_name_helper=Defina este nome para permitir o login desta fonte apenas para usuários que tenham um claim com este nome -auths.oauth2_required_claim_value=Valor do Claim Obrigatorio +auths.oauth2_required_claim_value=Valor obrigatório do claim auths.oauth2_required_claim_value_helper=Defina este valor para permitir o login desta fonte apenas para usuários que tenham um claim com este nome e valor auths.oauth2_group_claim_name=Nome do claim que fornece os nomes dos grupos para esta fonte. (Opcional) -auths.oauth2_admin_group=Valor do Claim de Grupo para os usuários administradores. (Opcional - requer nome do claim acima) -auths.oauth2_restricted_group=Valor do Claim de Grupo para os usuários restritos. (Opcional - requer nome do claim acima) -auths.oauth2_map_group_to_team=Mapear grupos para Organizações. (Opcional - requer nome do claim acima) +auths.oauth2_admin_group=Valor do claim de grupo para os usuários administradores. (Opcional - requer nome do claim acima) +auths.oauth2_restricted_group=Valor do claim de grupo para os usuários restritos. (Opcional - requer nome do claim acima) +auths.oauth2_map_group_to_team=Mapear grupos do claim a equipes da organização. (Opcional - requer nome do claim acima) auths.oauth2_map_group_to_team_removal=Remover usuários de equipes sincronizadas se o usuário não pertence ao grupo correspondente. auths.enable_auto_register=Habilitar cadastro automático auths.sspi_auto_create_users=Criar usuários automaticamente @@ -3171,7 +3358,7 @@ auths.new_success=A fonte de autenticação "%s" foi adicionada. auths.update_success=A fonte de autenticação foi atualizada. auths.update=Atualizar fonte de autenticação auths.delete=Excluir fonte de autenticação -auths.delete_auth_title=Excluir a Fonte de Autenticação +auths.delete_auth_title=Excluir fonte de autenticação auths.delete_auth_desc=A exclusão de uma fonte de autenticação impede que os usuários a usem para acessar. Continuar? auths.still_in_used=A fonte de autenticação ainda está em uso. Converta ou exclua todos os usuários que usam essa fonte de autenticação primeiro. auths.deletion_success=A fonte de autenticação foi excluída. @@ -3183,20 +3370,20 @@ auths.invalid_openIdConnectAutoDiscoveryURL=URL do Auto Discovery inválida (dev config.server_config=Configuração do servidor config.app_name=Nome do servidor config.app_ver=Versão do Forgejo -config.app_url=URL base do Forgejo -config.custom_conf=Caminho do Arquivo de Configuração -config.custom_file_root_path=Caminho raiz para arquivo personalizado +config.app_url=URL base +config.custom_conf=Localização do arquivo de configuração +config.custom_file_root_path=Localização raiz dos arquivos personalizados config.domain=Domínio do servidor config.offline_mode=Modo local -config.disable_router_log=Desabilitar o Log do roteador -config.run_user=Executar como nome de usuário +config.disable_router_log=Desabilitar log do roteador +config.run_user=Executar como este usuário config.run_mode=Modo de execução config.git_version=Versão do Git -config.repo_root_path=Caminho raiz do repositório -config.lfs_root_path=Caminho raiz do LFS -config.log_file_root_path=Caminho do log +config.repo_root_path=Localização raiz do repositório +config.lfs_root_path=Localização raiz de LFS +config.log_file_root_path=Localização do log config.script_type=Tipo de script -config.reverse_auth_user=Usuário de autenticação reversa +config.reverse_auth_user=Usuário de autenticação do proxy reverso config.ssh_config=Configuração de SSH config.ssh_enabled=Habilitado @@ -3204,16 +3391,16 @@ config.ssh_start_builtin_server=Usar o servidor embutido config.ssh_domain=Domínio do servidor SSH config.ssh_port=Porta config.ssh_listen_port=Porta de escuta -config.ssh_root_path=Caminho da raiz -config.ssh_key_test_path=Caminho da chave de teste -config.ssh_keygen_path=Caminho do keygen ('ssh-keygen') +config.ssh_root_path=Caminho raiz +config.ssh_key_test_path=Localização de teste para chave +config.ssh_keygen_path=Localização do gerador de chaves ("ssh-keygen") config.ssh_minimum_key_size_check=Verificar tamanho mínimo da chave config.ssh_minimum_key_sizes=Tamanhos mínimos da chave config.lfs_config=Configuração de LFS config.lfs_enabled=Habilitado -config.lfs_content_path=Caminho do conteúdo LFS -config.lfs_http_auth_expiry=Expiração da autenticação HTTP LFS +config.lfs_content_path=Localização do conteúdo LFS +config.lfs_http_auth_expiry=Tempo de expiração da autenticação HTTP de LFS config.db_config=Configuração do banco de dados config.db_type=Tipo @@ -3226,42 +3413,42 @@ config.db_path=Caminho config.service_config=Configuração do serviço config.register_email_confirm=Exigir confirmação de e-mail para se cadastrar -config.disable_register=Desabilitar auto-cadastro -config.allow_only_internal_registration=Permitir Registro Somente Através do Próprio Forgejo -config.allow_only_external_registration=Permitir cadastro somente por meio de serviços externos -config.enable_openid_signup=Habilitar o auto-cadastro via OpenID +config.disable_register=Desabilitar autocadastro +config.allow_only_internal_registration=Permitir cadastro somente através do próprio Forgejo +config.allow_only_external_registration=Permitir cadastro somente através de serviços externos +config.enable_openid_signup=Habilitar autocadastro via OpenID config.enable_openid_signin=Habilitar acesso via OpenID config.show_registration_button=Mostrar botão de cadastro -config.require_sign_in_view=Exigir acesso do usuário para a visualização de páginas -config.mail_notify=Habilitar notificações de e-mail +config.require_sign_in_view=Exigir cadastro para visualização de páginas +config.mail_notify=Habilitar notificações via e-mail config.enable_captcha=Habilitar o CAPTCHA -config.active_code_lives=Ativar Code Lives -config.reset_password_code_lives=Tempo de expiração do código de recuperação de conta +config.active_code_lives=Tempo de expiração do código de ativação +config.reset_password_code_lives=Tempo de expiração do código de recuperação config.default_keep_email_private=Ocultar endereços de e-mail por padrão config.default_allow_create_organization=Permitir a criação de organizações por padrão -config.enable_timetracking=Habilitar Cronômetro -config.default_enable_timetracking=Habilitar o Cronômetro por Padrão +config.enable_timetracking=Habilitar estatísticas de tempo +config.default_enable_timetracking=Habilitar estatísticas de tempo por padrão config.allow_dots_in_usernames = Permitir pontos em nomes de usuário. Esta opção não afeta contas já existentes. -config.default_allow_only_contributors_to_track_time=Permitir que apenas os colaboradores acompanhem o contador de tempo -config.no_reply_address=Ocultar domínio de e-mail +config.default_allow_only_contributors_to_track_time=Permitir que apenas os colaboradores usem as estatísticas de tempo +config.no_reply_address=Domínio do email oculto config.default_visibility_organization=Visibilidade padrão para novas organizações config.default_enable_dependencies=Habilitar dependências de issue por padrão -config.webhook_config=Configuração de Hook da Web +config.webhook_config=Configuração de webhook config.queue_length=Tamanho da fila -config.deliver_timeout=Intervalo de entrega +config.deliver_timeout=Tempo limite de entrega config.skip_tls_verify=Ignorar verificação de TLS -config.mailer_config=Configuração de Envio de E-mail +config.mailer_config=Configuração de envio de e-mails config.mailer_enabled=Habilitado config.mailer_enable_helo=Ativar HELO config.mailer_name=Nome config.mailer_protocol=Protocolo -config.mailer_smtp_addr=Addr SMTP +config.mailer_smtp_addr=Host SMTP config.mailer_smtp_port=Porta SMTP config.mailer_user=Usuário config.mailer_use_sendmail=Usar o Sendmail -config.mailer_sendmail_path=Caminho do Sendmail +config.mailer_sendmail_path=Localização do Sendmail config.mailer_sendmail_args=Argumentos extras para o Sendmail config.mailer_sendmail_timeout=Tempo limite do Sendmail config.mailer_use_dummy=Dummy @@ -3271,20 +3458,20 @@ config.send_test_mail_submit=Enviar config.test_mail_failed=Ocorreu um erro ao enviar um e-mail de teste para "%s": %v config.test_mail_sent=Um e-mail de teste foi enviado para "%s". -config.oauth_config=Configuração do OAuth +config.oauth_config=Configuração de OAuth config.oauth_enabled=Habilitado config.cache_config=Configuração de cache config.cache_adapter=Adaptador de cache config.cache_interval=Intervalo de cache config.cache_conn=Conexão de cache -config.cache_item_ttl=Item de cache TTL +config.cache_item_ttl=TTL do item de cache -config.session_config=Configuração da sessão -config.session_provider=Provedor da sessão +config.session_config=Configuração de sessão +config.session_provider=Provedor de sessão config.provider_config=Configuração do provedor config.cookie_name=Nome do cookie -config.gc_interval_time=Tempo de Intervalo do GC +config.gc_interval_time=Tempo de intervalo do GC config.session_life_time=Tempo de vida da sessão config.https_only=Apenas HTTPS config.cookie_life_time=Tempo de vida do cookie @@ -3292,25 +3479,25 @@ config.cookie_life_time=Tempo de vida do cookie config.picture_config=Configuração de imagem e avatar config.picture_service=Serviço de imagens config.disable_gravatar=Desabilitar o gravatar -config.enable_federated_avatar=Habilitar avatares federativos +config.enable_federated_avatar=Habilitar avatares federados config.git_config=Configuração do Git -config.git_disable_diff_highlight=Desabilitar realce de mudanças no diff -config.git_max_diff_lines=Máximo de linhas mostradas no diff (para um único arquivo) -config.git_max_diff_line_characters=Máximo de caracteres mostrados no diff (para uma única linha) -config.git_max_diff_files=Máximo de arquivos a serem mostrados no diff +config.git_disable_diff_highlight=Desabilitar realce de sintaxe em diffs +config.git_max_diff_lines=Máximo de linhas por arquivo em diffs +config.git_max_diff_line_characters=Máximo de caracteres por linha em diffs +config.git_max_diff_files=Máximo de arquivos de diff exibidos config.git_gc_args=Argumentos do GC config.git_migrate_timeout=Tempo limite de migração -config.git_mirror_timeout=Tempo limite de atualização de espelhamento -config.git_clone_timeout=Tempo limite para operação de clone -config.git_pull_timeout=Tempo limite para operação de pull -config.git_gc_timeout=Tempo limite para execução do GC +config.git_mirror_timeout=Tempo limite para atualização de espelhos +config.git_clone_timeout=Tempo limite para operações de clonagem +config.git_pull_timeout=Tempo limite para operações de pull +config.git_gc_timeout=Tempo limite para operação de GC config.log_config=Configuração de log config.logger_name_fmt=Logger: %s config.disabled_logger=Desabilitado -config.access_log_mode=Modo log Access -config.access_log_template=Modelo do registro de acesso +config.access_log_mode=Modo do log de acesso +config.access_log_template=Modelo do log de acesso config.xorm_log_sql=Log SQL config.set_setting_failed=Falha ao definir configuração %s @@ -3341,10 +3528,10 @@ monitor.queue=Fila: %s monitor.queue.name=Nome monitor.queue.type=Tipo monitor.queue.exemplar=Tipo de modelo -monitor.queue.numberworkers=Número de executores -monitor.queue.maxnumberworkers=Número máximo de executores -monitor.queue.numberinqueue=Número na Fila -monitor.queue.settings.title=Configurações do conjunto +monitor.queue.numberworkers=Número de workers +monitor.queue.maxnumberworkers=Número máximo de workers +monitor.queue.numberinqueue=Número na fila +monitor.queue.settings.title=Configurações do pool monitor.queue.settings.maxnumberworkers=Número máximo de executores monitor.queue.settings.maxnumberworkers.placeholder=Atualmente %[1]d monitor.queue.settings.maxnumberworkers.error=Número máximo de executores deve ser um número @@ -3354,10 +3541,10 @@ monitor.queue.settings.remove_all_items=Remover tudo monitor.queue.settings.remove_all_items_done=Todos os itens da fila foram removidos. notices.system_notice_list=Avisos do sistema -notices.view_detail_header=Ver detalhes do aviso +notices.view_detail_header=Detalhes do aviso notices.operations=Operações -notices.select_all=Marcar todos -notices.deselect_all=Desmarcar todos +notices.select_all=Selecionar tudo +notices.deselect_all=Desselecionar tudo notices.inverse_selection=Inverter seleção notices.delete_selected=Excluir seleção notices.delete_all=Excluir todos os avisos @@ -3370,12 +3557,12 @@ notices.delete_success=Os avisos do sistema foram excluídos. identity_access = Identidade e acesso settings = Configurações de administrador users.bot = Robô -dashboard.start_schedule_tasks = Iniciar tarefas programadas +dashboard.start_schedule_tasks = Iniciar tarefas de actions programadas users.reserved = Reservado emails.change_email_text = Tem certeza de que deseja atualizar este endereço de e-mail? -self_check = Autodiagnóstico +self_check = Autoverificação auths.tip.gitea = Registre um novo aplicativo OAuth2. A documentação pode ser encontrada em %s/ -dashboard.sync_tag.started = Sincronização de etiquetas iniciada +dashboard.sync_tag.started = Sincronização de tags iniciada self_check.no_problem_found = Por enquanto não há algum problema. config_settings = Configurações config_summary = Resumo @@ -3390,6 +3577,34 @@ dashboard.sync_branch.started = Sincronização de ramos iniciada dashboard.sync_repo_branches = Sincronizar ramos perdidos do Git para o banco de dados packages.cleanup.success = Os dados expirados foram limpos com sucesso monitor.queue.activeworkers = Processos ativos +systemhooks.desc = Os webhooks fazem automaticamente solicitações HTTP POST para um servidor quando certos eventos Forgejo são acionados. Os webhooks definidos aqui atuarão em todos os repositórios do sistema, então, considere quaisquer implicações de desempenho que isso possa ter. Leia mais no guia de webhooks. +defaulthooks.desc = Os webhooks fazem automaticamente solicitações HTTP POST para um servidor quando certos eventos Forgejo são acionados. Os webhooks definidos aqui são padrões e serão copiados para todos os novos repositórios. Leia mais no guia de webhooks. +self_check.database_fix_mysql = Para usuários do MySQL/MariaDB, você pode usar o comando "forgejo doctor convert" para corrigir os problemas de ordenamento, ou também pode corrigir o problema usando "ALTER ... COLLATE ..." SQLs manualmente. +monitor.queue.settings.desc = Os pools crescem dinamicamente quando as filas de seus workers ficam bloqueadas. +config.cache_test_succeeded = Teste de cache bem-sucedido, obteve uma resposta em %s. +self_check.database_inconsistent_collation_columns = O banco de dados está usando o ordenamento %s, mas essas colunas estão usando ordenamentos incompatíveis. Isso pode causar alguns problemas inesperados. +dashboard.rebuild_issue_indexer = Reconstruir indexador de problemas +monitor.queue.review_add = Revisar / adicionar workers +assets = Ativos de código +config.open_with_editor_app_help = Os editores "Abrir com" para o menu clone. Se deixado em branco, o padrão será usado. Expanda para ver o padrão. +config.cache_test_slow = Teste de cache bem-sucedido, mas a resposta é lenta: %s. +config.cache_test = Cache de Teste +config.cache_test_failed = Falha ao sondar o cache: %v. +self_check.database_collation_mismatch = Esperar que o banco de dados use o ordenamento: %s +dashboard.cleanup_actions = Limpar logs expirados e artefatos de ações +emails.delete = Deletar email +emails.delete_primary_email_error = Você não pode excluir o email principal. +emails.deletion_success = O endereço de email foi excluído. +emails.delete_desc = Tem certeza de que deseja excluir este endereço de e-mail? +dashboard.cron.cancelled = Cron: %[1]s cancelado: %[3]s +users.activated.description = Conclusão da verificação de e-mail. O proprietário de uma conta não ativada não poderá efetuar login até que a verificação de e-mail seja concluída. +users.block.description = Bloquear este usuário de interagir com este serviço através de sua conta e proibir o login. +users.admin.description = Conceda a este usuário acesso total a todos os recursos administrativos disponíveis por meio da interface do usuário da Web e da API. +users.restricted.description = Permitir interação somente com os repositórios e organizações onde este usuário é adicionado como colaborador. Isso impede o acesso a repositórios públicos nesta instância. +users.organization_creation.description = Permitir a criação de novas organizações. +users.local_import.description = Permitir importar repositórios do sistema de arquivos local do servidor. Isso pode ser um problema de segurança. +self_check.database_collation_case_insensitive = O banco de dados está usando um ordenamento %s, que é um ordenamento insensível. Embora o Forgejo possa funcionar com ele, pode haver alguns casos raros que não funcionam como esperado. +monitor.duration = Duração (s) [action] @@ -3418,7 +3633,7 @@ mirror_sync_create=sincronizou a nova referência %[3]s para mirror_sync_delete=referência excluída e sincronizada %[2]s em %[3]s do espelhamento approve_pull_request=`aprovou %[3]s#%[2]s` reject_pull_request=`sugeriu modificações para %[3]s#%[2]s` -publish_release=`lançou a versão "%[4]s" em %[3]s` +publish_release=`lançou o release "%[4]s" em %[3]s` review_dismissed=`descartou a revisão de %[4]s para %[3]s#%[2]s` review_dismissed_reason=Motivo: create_branch=criou o branch %[3]s em %[4]s @@ -3472,9 +3687,9 @@ error.generate_hash=Falha ao gerar hash de commit error.no_committer_account=Nenhuma conta vinculada ao e-mail do autor do commit error.no_gpg_keys_found=Nenhuma chave conhecida encontrada para esta assinatura no banco de dados error.not_signed_commit=Não é um commit assinado -error.failed_retrieval_gpg_keys=Falha em obter qualquer chave anexada à conta do autor do commit -error.probable_bad_signature=AVISO! Embora exista uma chave com este ID no banco de dados, ela não verifica este commit! Este commit é SUSPEITO. -error.probable_bad_default_signature=AVISO! Embora a chave padrão tenha este ID, ela não verifica este commit! Este commit é SUSPEITO. +error.failed_retrieval_gpg_keys=Falha ao obter qualquer chave anexada à conta do autor do commit +error.probable_bad_signature=ATENÇÃO! Embora exista uma chave com este ID no banco de dados, ela não verifica este commit! Este commit é SUSPEITO. +error.probable_bad_default_signature=ATENÇÃO! Embora a chave padrão tenha este ID, ela não verifica este commit! Este commit é SUSPEITO. [units] unit=Unidade @@ -3501,9 +3716,9 @@ dependencies=Dependências keywords=Palavras-chave details=Detalhes details.author=Autor -details.project_site=Site do Projeto -details.repository_site=Site do Repositório -details.documentation_site=Site da Documentação +details.project_site=Site do projeto +details.repository_site=Site do repositório +details.documentation_site=Site da documentação details.license=Licença assets=Recursos versions=Versões @@ -3525,18 +3740,18 @@ chef.install=Para instalar o pacote, execute o seguinte comando: composer.registry=Configure este registro em seu arquivo ~/.composer/config.json: composer.install=Para instalar o pacote usando o Composer, execute o seguinte comando: composer.dependencies=Dependências -composer.dependencies.development=Dependências de Desenvolvimento +composer.dependencies.development=Dependências de desenvolvimento conan.details.repository=Repositório conan.registry=Configure este registro pela linha de comando: conan.install=Para instalar o pacote usando o Conan, execute o seguinte comando: conda.registry=Configure este registro como um repositório Conda no arquivo .condarc: conda.install=Para instalar o pacote usando o Conda, execute o seguinte comando: -container.details.type=Tipo de Imagem +container.details.type=Tipo de imagem container.details.platform=Plataforma container.pull=Puxe a imagem pela linha de comando: -container.digest=Digest: +container.digest=Digest container.multi_arch=S.O. / Arquitetura -container.layers=Camadas da Imagem +container.layers=Camadas da imagem container.labels=Rótulos container.labels.key=Chave container.labels.value=Valor @@ -3564,9 +3779,9 @@ npm.registry=Configure este registro no arquivo .npmrc do seu proje npm.install=Para instalar o pacote usando o npm, execute o seguinte comando: npm.install2=ou adicione-o ao arquivo package.json: npm.dependencies=Dependências -npm.dependencies.development=Dependências de Desenvolvimento -npm.dependencies.peer=Dependências Peer -npm.dependencies.optional=Dependências Opcionais +npm.dependencies.development=Dependências de desenvolvimento +npm.dependencies.peer=Dependências peer +npm.dependencies.optional=Dependências opcionais npm.details.tag=Tag pub.install=Para instalar o pacote usando Dart, execute o seguinte comando: pypi.requires=Requer Python @@ -3575,12 +3790,12 @@ rpm.registry=Configure este registro pela linha de comando: rpm.distros.redhat=em distribuições baseadas no RedHat rpm.distros.suse=em distribuições baseadas no SUSE rpm.install=Para instalar o pacote, execute o seguinte comando: -rpm.repository=Informações do repositório -rpm.repository.architectures=Arquiteturas +rpm.repository = Informações do repositório +rpm.repository.architectures = Arquiteturas rubygems.install=Para instalar o pacote usando gem, execute o seguinte comando: rubygems.install2=ou adicione-o ao Gemfile: -rubygems.dependencies.runtime=Dependências de Execução -rubygems.dependencies.development=Dependências de Desenvolvimento +rubygems.dependencies.runtime=Dependências de tempo de execução +rubygems.dependencies.development=Dependências de desenvolvimento rubygems.required.ruby=Requer o Ruby versão rubygems.required.rubygems=Requer o RubyGem versão swift.registry=Configure este registro pela linha de comando: @@ -3598,17 +3813,17 @@ settings.delete.description=A exclusão de um pacote é permanente e não pode s settings.delete.notice=Você está prestes a excluir %s (%s). Esta operação é irreversível, tem certeza? settings.delete.success=O pacote foi excluído. settings.delete.error=Falha ao excluir o pacote. -owner.settings.cargo.title=Ãndice do Registro Cargo +owner.settings.cargo.title=Ãndice do registro Cargo owner.settings.cargo.initialize=Inicializar índice owner.settings.cargo.initialize.error=Falha ao inicializar índice Cargo: %v owner.settings.cargo.initialize.success=O índice Cargo foi criado com sucesso. owner.settings.cargo.rebuild=Reconstruir índice owner.settings.cargo.rebuild.error=Falha ao reconstruir índice Cargo: %v owner.settings.cargo.rebuild.success=O índice Cargo foi reconstruído com sucesso. -owner.settings.cleanuprules.title=Gerenciar Regras de Limpeza -owner.settings.cleanuprules.add=Adicionar Regra de Limpeza -owner.settings.cleanuprules.edit=Editar Regra de Limpeza -owner.settings.cleanuprules.preview=Pré-visualizar Regra de Limpeza +owner.settings.cleanuprules.title=Regras de limpeza +owner.settings.cleanuprules.add=Adicionar regra de limpeza +owner.settings.cleanuprules.edit=Editar regra de limpeza +owner.settings.cleanuprules.preview=Pré-visualizar regra de limpeza owner.settings.cleanuprules.preview.overview=%d pacotes agendados para serem removidos. owner.settings.cleanuprules.preview.none=A regra de limpeza não corresponde a nenhum pacote. owner.settings.cleanuprules.enabled=Habilitado @@ -3626,11 +3841,39 @@ owner.settings.cleanuprules.success.update=Regra de limpeza foi atualizada. owner.settings.cleanuprules.success.delete=Regra de limpeza foi excluída. owner.settings.chef.title=Registro Chef owner.settings.chef.keypair=Gerar par de chaves -rpm.repository.architectures = Arquiteturas -rpm.repository = Informações do repositório rpm.repository.multiple_groups = Este pacote está disponível em vários grupos. -npm.dependencies.bundle = Dependências empacotadas +npm.dependencies.bundle = Dependências em bundle registry.documentation = Para mais informações sobre o registro %s, veja a documentação. +arch.version.replaces = Substitui +arch.version.conflicts = Conflitos +arch.version.properties = Propriedades da versão +arch.version.description = Descrição +arch.version.groups = Grupo +arch.version.provides = Fornece +arch.version.depends = Depende +arch.version.optdepends = Depende opcionalmente +arch.pacman.repo.multi.item = Configuração para %s +arch.pacman.sync = Sincronizar pacote com o pacman: +arch.pacman.repo.multi = %s possui a mesma versão em distribuições diferentes. +arch.pacman.helper.gpg = Adicionar certificado de confiança para o pacman: +arch.version.backup = Cópia de Segurança +owner.settings.cleanuprules.none = Não há regras de limpeza ainda. +owner.settings.cargo.rebuild.description = Reconstruir pode ser útil se o índice não estiver sincronizado com os pacotes do Cargo armazenados. +owner.settings.cargo.rebuild.no_index = Não foi possível reconstruir, não há um índice inicializado. +arch.pacman.conf = Adicione o servidor com a distribuição e arquitetura no arquivo /etc/pacman.conf : +arch.version.makedepends = Dependências do make +arch.version.checkdepends = Verificar dependências +owner.settings.cargo.initialize.description = É necessário um repositório Git especial de índice para usar o registro Cargo. Usar esta opção irá (re-)criar o repositório e configurá-lo automaticamente. +owner.settings.chef.keypair.description = É necessário um par de chaves para autenticar no registro Chef. Se você já gerou um par de chaves, gere um novo par e descarte o antigo. +container.images.title = Imagens +search_in_external_registry = Buscar em %s +alt.registry.install = Para instalar o pacote, execute o seguinte comando: +alt.registry = Configurar este registro da linha de comando: +alt.install = Instalar pacote +alt.repository = Informação do repositório +alt.repository.architectures = Arquiteturas +alt.repository.multiple_groups = Este pacote está disponível em múltiplos grupos. +alt.setup = Adicionar um repositório à lista de repositórios conectados (escolha a arquitetura necessária em vez de "_arch_"): [secrets] secrets=Segredos @@ -3650,10 +3893,10 @@ management=Gerenciar segredos [actions] actions=Ações -unit.desc=Gerenciar ações +unit.desc=Gerenciar pipelines integradas de CI/CD com Forgejo Actions. status.unknown=Desconhecido -status.waiting=Em espera +status.waiting=Aguardando status.running=Rodando status.success=Sucesso status.failure=Falha @@ -3662,8 +3905,8 @@ status.skipped=Ignorado status.blocked=Bloqueado runners=Runners -runners.runner_manage_panel=Gerenciamento de Runners -runners.new=Criar novo Runner +runners.runner_manage_panel=Gerenciar runners +runners.new=Criar novo runner runners.new_notice=Como iniciar um runner runners.status=Estado runners.id=ID @@ -3697,7 +3940,7 @@ runners.status.offline=Offline runners.version=Versão runners.reset_registration_token_success=Token de registro de runner redefinido com sucesso -runs.all_workflows=Todos os Workflows +runs.all_workflows=Todos os workflows runs.commit=Commit runs.pushed_by=push feito por runs.invalid_workflow_helper=O arquivo de configuração do workflow é inválido. Por favor, verifique seu arquivo de configuração: %s @@ -3713,7 +3956,7 @@ runners.reset_registration_token = Resetar token de registro runs.scheduled = Programadas variables.creation = Adicionar variável variables.deletion = Remover variável -variables.management = Gerenciamento de variáveis +variables.management = Gerenciar variáveis runs.actors_no_select = Todos os atores variables.none = Ainda não há variáveis. variables.update.failed = Falha ao editar a variável. @@ -3728,15 +3971,38 @@ runs.no_workflows.documentation = Para mais informações sobre Forgejo Actions, runs.no_workflows.quick_start = Forgejo Actions é uma novidade para você? Veja o guia rápido. runs.no_results = Nenhum resultado. variables.description = As variáveis serão passadas para certas ações e não poderão ser lidas de outra forma. +workflow.dispatch.trigger_found = Este workflow tem um disparador de evento workflow_dispatch. +workflow.dispatch.run = Executar workflow +runs.no_runs = O workflow ainda não foi executado. +workflow.dispatch.warn_input_limit = Exibindo apenas as %d primeiras entradas. +runs.no_matching_online_runner_helper = Nenhum runner online encontrado com o rótulo: %s +workflow.disabled = Workflow está desativado. +workflow.dispatch.use_from = Usar workflow de +runs.no_job = O workflow precisa conter pelo menos um trabalho +workflow.disable_success = Workflow "%s" desativado com sucesso. +workflow.enable = Ativar workflow +workflow.disable = Desabilitar workflow +runs.no_workflows = Não há workflows ainda. +runs.no_job_without_needs = O workflow deve conter pelo menos um trabalho sem dependências. +runs.workflow = Workflow +workflow.enable_success = Workflow "%s" ativado com sucesso. +workflow.dispatch.success = Execução do workflow solicitada com sucesso. +workflow.dispatch.input_required = Exigir um valor para a entrada "%s". +workflow.dispatch.invalid_input_type = Tipo de entrada "%s" inválido. +variables.deletion.description = Apagar uma variável é permanente e não pode ser desfeito. Continuar? +runs.expire_log_message = Os logs foram apagados pois eram antigos demais. +runs.no_workflows.help_no_write_access = Para aprender sobre as Actions do Forgejo, veja a documentação. +runs.no_workflows.help_write_access = Não sabe como começar a usar as Actions do Forgejo? Veja o guia de como começar na documentação do usuário para escrever seu primeiro workflow, depois configure um runner do Forgejo para executar trabalhos. +variables.not_found = Não foi possível encontrar a variável. [projects] type-1.display_name=Projeto individual type-2.display_name=Projeto do repositório type-3.display_name=Projeto da organização +deleted.display_name = Projeto Apagado [git.filemode] -; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … symbolic_link=Ligação simbólica changed_filemode = %[1]s → %[2]s directory = Diretório @@ -3746,38 +4012,36 @@ executable_file = Arquivo executável -[graphs] -component_loading = Carregando %s... -component_loading_failed = Não foi possível carregar o(a) %s -component_loading_info = Pode demorar um pouco… -contributors.what = contribuições -code_frequency.what = frequência de código -recent_commits.what = commits recentes -component_failed_to_load = Ocorreu um erro inesperado. - - [search] -org_kind = Buscar organizações... -team_kind = Buscar equipes... -code_kind = Buscar código... -user_kind = Buscar usuários... +org_kind = Buscar organizações… +team_kind = Buscar equipes… +code_kind = Buscar código… +user_kind = Buscar usuários… no_results = Nenhum resultado encontrado. keyword_search_unavailable = A busca por palavras-chave não está disponível. Entre em contato com o administrador. -package_kind = Buscar pacotes... -project_kind = Buscar projetos... -search = Buscar... +package_kind = Buscar pacotes… +project_kind = Buscar projetos… +search = Buscar… fuzzy = Aproximada fuzzy_tooltip = Inclui resultados que se aproximam dos termos de busca match = Correspondente match_tooltip = Inclui apenas os resultados que correspondem exatamente aos termos de busca -repo_kind = Buscar repositórios... +repo_kind = Buscar repositórios… type_tooltip = Tipo de busca code_search_by_git_grep = Os resultados atuais da pesquisa de código são fornecidos por "git grep". Pode haver melhores resultados se o administrador do site ativar o indexador de código. branch_kind = Buscar ramos… commit_kind = Buscar commits… -runner_kind = Pesquisar runners... +runner_kind = Buscar runners… code_search_unavailable = A pesquisa de código não está disponível no momento. Entre em contato com o administrador do site. milestone_kind = Pesquisar marcos... +union_tooltip = Incluir resultados que correspondam a quaisquer palavras-chave separadas por espaços em branco +union = União +exact = Exato +exact_tooltip = Incluir apenas resultados que correspondam exatamente ao termo de pesquisa +issue_kind = Buscar issues… +pull_kind = Buscar pulls… +regexp_tooltip = Interpretar o termo de busca como uma expressão regular +regexp = RegExp [munits.data] b = B @@ -3791,4 +4055,27 @@ eib = EiB [markup] filepreview.line = Linha %[1]d em %[2]s filepreview.lines = Linhas %[1]d a %[2]d em %[3]s -filepreview.truncated = Pré-visualização truncada \ No newline at end of file +filepreview.truncated = Pré-visualização truncada + +[repo.permissions] +pulls.write = Escrita: Encerrar pull requests e gerir metadados como rótulos, marcos, responsáveis, prazos e dependências. +code.read = Leitura: Acessar e clonar o código do repositório. +issues.read = Leitura: Visualizar e criar issues e comentários. +code.write = Escrita: Fazer push para o repositório, criar branches e tags. +issues.write = Escrita: Encerrar issues e gerir metadados como rótulos, marcos, responsáveis, prazos e dependências. +pulls.read = Leitura: Visualizar e criar pull requests. +releases.read = Leitura: Visualizar e baixar releases. +releases.write = Escrita: Publicar editar e apagar releases e seus recursos. +wiki.read = Leitura: Ler a wiki integrada e o histórico dela. +wiki.write = Escrita: Criar, alterar e apagar páginas na wiki integrada. +projects.read = Ler: Acesse os painéis de projetos do repositório. +ext_wiki = Acesse o link para um wiki externo. As permissões são gerenciadas externamente. +actions.write = Escrever: Acione, reinicie, cancele ou aprove manualmente pipelines de CI/CD pendentes. +projects.write = Escrever: Crie projetos e colunas e edite-os. +actions.read = Ler: Visualize pipelines de CI/CD integrados e seus logs. +packages.read = Ler: Visualize e baixe pacotes atribuídos ao repositório. +packages.write = Escrever: Publique e delete pacotes atribuídos ao repositório. +ext_issues = Acesse o link para um issue tracker externo. As permissões são gerenciadas externamente. + +[translation_meta] +test = To preserve its claws, the giant anteater walks on its front knuckles, like gorillas diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index 7f2bb86b79..42866bbf5e 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -112,7 +112,7 @@ preview=Pré-visualizar loading=Carregando… error=Erro -error404=A página que pretende aceder não existe ou não tem autorização para a ver. +error404=A página que pretende aceder não existe, foi removida ou não tem autorização para a ver. go_back=Voltar never=Nunca @@ -142,7 +142,7 @@ confirm_delete_selected=Confirma a exclusão de todos os itens marcados? name=Nome value=Valor -filter.is_fork = Derivações +filter.is_fork = Derivado filter.is_mirror = Réplicas filter.is_template = Modelos filter.public = Público @@ -156,7 +156,7 @@ filter.clear = Retirar filtros filter.is_archived = Arquivado filter.not_template = Não modelos toggle_menu = Comutar menu -filter = Filtro +filter = Filtrar copy_generic = Copiar para a área de transferência test = Teste error413 = Você esgotou a sua quota. @@ -166,6 +166,7 @@ new_org.title = Nova organização new_repo.link = Novo repositório new_migrate.link = Nova migração new_org.link = Nova organização +copy_path = Copiar caminho [aria] navbar=Barra de navegação @@ -199,6 +200,16 @@ buttons.enable_monospace_font=Habilitar tipo de letra mono-espaçado buttons.disable_monospace_font=Desabilitar tipo de letra mono-espaçado buttons.indent.tooltip = Aninhar itens num nível buttons.unindent.tooltip = Desaninhar itens por um nível +buttons.new_table.tooltip = Adicionar tabela +table_modal.header = Adicionar tabela +table_modal.placeholder.header = Cabeçalho +table_modal.placeholder.content = Conteúdo +table_modal.label.rows = Linhas +table_modal.label.columns = Colunas +link_modal.header = Adicionar uma ligação +link_modal.url = URL +link_modal.description = Descrição +link_modal.paste_reminder = Sugestão: Com um URL na área de transferência, pode colar diretamente no editor para criar uma ligação. [filter] string.asc=A - Z @@ -206,7 +217,7 @@ string.desc=Z - A [error] occurred=Ocorreu um erro -report_message=Se acredita de que se trata de um erro do Forgejo, procure, por favor, questões relacionadas no GitHub ou abra uma nova questão, se necessário. +report_message=Se acredita de que se trata de um erro do Forgejo, procure, por favor, questões relacionadas no Codeberg ou abra uma nova questão, se necessário. missing_csrf=Pedido inválido: não há código CSRF invalid_csrf=Pedido inválido: código CSRF inválido not_found=Não foi possível encontrar o destino. @@ -476,6 +487,8 @@ hint_register = Precisa de uma conta? Faça uma inscrição agora.< sign_up_button = Faça uma inscrição agora. back_to_sign_in = Voltar ao iniciar a sessão sign_in_openid = Prosseguir com OpenID +unauthorized_credentials = As credenciais estão erradas ou expiraram. Tente o comando de novo ou veja %s para mais informação +use_onetime_code = Usar código de utilização única [mail] view_it_on=Ver em %s @@ -672,6 +685,8 @@ AccessToken = Código de acesso FullName = Nome completo Description = Descrição Pronouns = Pronomes +username_claiming_cooldown = O nome de utilizador não pode ser reivindicado, porque o período de espera do mesmo ainda não terminou. Pode ser reivindicado em %[1]s. +email_domain_is_not_allowed = O domínio do endereço de email %s do utilizador entra em conflito com EMAIL_DOMAIN_ALLOWLIST ou EMAIL_DOMAIN_BLOCKLIST. Certifique-se de que definiu corretamente o endereço de email. [user] change_avatar=Mude o seu avatar… @@ -715,6 +730,7 @@ public_activity.visibility_hint.self_public = O seu trabalho está visível para public_activity.visibility_hint.admin_public = Este trabalho está visível para todos, mas como administrador/a pode também ver o que consta em espaços privados. public_activity.visibility_hint.self_private = O seu trabalho apenas está visível para si e para os administradores da instância. Configurar. public_activity.visibility_hint.admin_private = Este trabalho está visível para si porque é um/a administrador/a, mas o/a utilizador/a quer permanecer privado/a. +public_activity.visibility_hint.self_private_profile = O seu trabalho está visível somente para si e para os administradores da instância porque o seu perfil é privado. Configure. [settings] profile=Perfil @@ -736,9 +752,9 @@ uid=UID webauthn=Autenticação em dois passos (chaves de segurança) public_profile=Perfil público -biography_placeholder=Conte-nos um pouco sobre si! (Pode usar Markdown) +biography_placeholder=Diga aos outros um pouco sobre si! (Markdown é suportado) location_placeholder=Partilhe a sua localização aproximada com outros -profile_desc=Controle como o seu perfil é apresentado aos outros utilizadores. O seu endereço de email principal será usado para notificações, recuperação de senha e operações Git baseadas na web. +profile_desc=Sobre si password_username_disabled=Utilizadores não-locais não podem mudar os seus nomes de utilizador. Entre em contacto com o administrador do sítio saber para mais detalhes. full_name=Nome completo website=Sítio web @@ -795,7 +811,7 @@ old_password=Senha corrente new_password=Nova senha retype_new_password=Confirme a nova senha password_incorrect=A senha corrente está errada. -change_password_success=A sua senha foi substituída. Inicie a sessão com a nova senha a partir de agora. +change_password_success=A sua senha foi atualizada. A partir de agora, utilize a sua nova senha para iniciar sessão. password_change_disabled=Os utilizadores não-locais não podem alterar a sua senha através da interface web do Forgejo. emails=Endereços de email @@ -803,7 +819,7 @@ manage_emails=Gerir endereços de email manage_themes=Tema padrão manage_openid=Endereços OpenID email_desc=O seu endereço de email principal irá ser usado para notificações, recuperação de senha e, desde que não esteja oculto, operações Git baseados na web. -theme_desc=Este será o seu tema padrão em todo o sítio. +theme_desc=Este tema será usado para a interface web quando tiver sessão iniciada. primary=Principal activated=Em uso requires_activation=Tem que ser habilitado @@ -829,7 +845,7 @@ add_email_success=O novo endereço de email foi adicionado. email_preference_set_success=As preferências relativas ao email foram definidas com sucesso. add_openid_success=O novo endereço OpenID foi adicionado. keep_email_private=Ocultar endereço de email -keep_email_private_popup=Isto irá ocultar o seu endereço de email no seu perfil. Não será mais o predefinido nos cometimentos feitos através da interface web, tais como carregamentos de ficheiros e edições, e não será usado para cometimentos de integração. Ao invés disso, um endereço especial %s poderá ser usado para associar cometimentos à sua conta. Note que mudar esta opção não irá alterar os cometimentos existentes. +keep_email_private_popup=O seu endereço de e-mail não será mostrado no seu perfil e não será o predefinido para cometimentos feitos através da interface web, tais como upload de arquivos, edições e cometimentos de integração. Ao invés disso, um endereço especial %s poderá ser usado para vincular cometimentos à sua conta. Esta opção não irá alterar os cometimentos existentes. openid_desc=O OpenID permite delegar a autenticação num fornecedor externo. manage_ssh_keys=Gerir chaves SSH @@ -932,7 +948,7 @@ select_permissions=Escolher permissões permission_no_access=Sem acesso permission_read=Lidas permission_write=Leitura e escrita -access_token_desc=As permissões dos códigos escolhidos limitam a autorização apenas às rotas da API correspondentes. Leia a documentação para obter mais informação. +access_token_desc=As permissões dos códigos escolhidos limitam a autorização apenas às rotas da API correspondentes. Leia a documentação para obter mais informação. at_least_one_permission=Tem que escolher pelo menos uma permissão para criar um código permissions_list=Permissões: @@ -1024,7 +1040,7 @@ visibility=Visibilidade do utilizador visibility.public=Pública visibility.public_tooltip=Visível para todos visibility.limited=Limitada -visibility.limited_tooltip=Visível apenas para utilizadores autenticados +visibility.limited_tooltip=Visível apenas para utilizadores registados visibility.private=Privada visibility.private_tooltip=Visível apenas para membros das organizações a que se associou additional_repo_units_hint = Sugere a habilitação de unidades do repositório adicionais @@ -1037,7 +1053,7 @@ hints = Sugestões blocked_users = Utilizadores bloqueados blocked_since = Bloqueado desde %s user_block_success = O utilizador foi bloqueado com sucesso. -additional_repo_units_hint_description = Mostrar um botão "Adicionar mais unidades..." para repositórios que não têm todas as unidades disponíveis habilitadas. +additional_repo_units_hint_description = Mostrar uma sugestão "Habilitar mais" para repositórios que não têm todas as unidades disponíveis habilitadas. update_hints_success = As sugestões foram modificadas. blocked_users_none = Não há utilizadores bloqueados. user_unblock_success = O utilizador foi desbloqueado com sucesso. @@ -1045,6 +1061,36 @@ language.title = Idioma predefinido keep_activity_private.description = O seu trabalho público apenas estará visível para si e para os administradores da instância. language.description = Este idioma vai ser guardado na sua conta e ser usado como o predefinido depois de iniciar sessão. language.localization_project = Ajude-nos a traduzir o Forgejo para o seu idioma! Saiba mais. +pronouns_custom_label = Pronomes personalizados +user_block_yourself = Não se pode bloquear a si próprio. +change_username_redirect_prompt.with_cooldown.one = O nome de utilizador antigo estará disponível para todos após um período de espera de %[1]d dia, 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. +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. +keep_pronouns_private = Mostrar os pronomes apenas aos utilizadores autenticados +keep_pronouns_private.description = Isto irá ocultar os seus pronomes dos visitantes que não tenham iniciado sessão. +quota.sizes.git.lfs = Git LFS +quota.sizes.assets.all = Ativos +storage_overview = Panorama geral do armazenamento +quota = Quota +quota.applies_to_org = As seguintes regras de quotas aplicam-se a esta organização +quota.rule.exceeded = Excedido +quota.rule.no_limit = Ilimitado +quota.sizes.all = Tudo +quota.sizes.repos.all = Repositórios +quota.sizes.repos.public = Repositórios públicos +quota.sizes.repos.private = Repositórios privados +quota.sizes.git.all = Conteúdo Git +quota.sizes.assets.attachments.all = Anexos +quota.sizes.assets.attachments.issues = Anexos de questões +quota.sizes.assets.attachments.releases = Anexos de lançamentos +quota.sizes.assets.packages.all = Pacotes +quota.sizes.wiki = Wiki +access_token_regeneration = Regenerar código de acesso +regenerate_token_success = O código foi regenerado. As aplicações que o utilizam já não têm acesso à sua conta e devem ser atualizadas com o novo código. +regenerate_token = Regenerar +access_token_regeneration_desc = A regeneração de um código irá revogar o acesso à sua conta para as aplicações que o utilizam. Isto não pode ser anulado. Continuar? [repo] new_repo_helper=Um repositório contém todos os ficheiros do trabalho, incluindo o histórico das revisões. Já tem um hospedado noutro sítio? Migre o repositório. @@ -1087,13 +1133,13 @@ issue_labels=Rótulos issue_labels_helper=Escolha um conjunto de rótulos license=Licença license_helper=Escolha um ficheiro de licença -license_helper_desc=Uma licença rege o que os outros podem, ou não, fazer com o seu código fonte. Não tem a certeza sobre qual a mais indicada para o seu trabalho? Veja: Escolher uma licença. +license_helper_desc=Uma licença rege o que os outros podem, ou não, fazer com o seu código fonte. Não tem a certeza sobre qual a mais indicada para o seu trabalho? Veja: Escolher uma licença. object_format=Formato dos elementos object_format_helper=Formato dos elementos do repositório. Não poderá ser alterado mais tarde. SHA1 é o mais compatível. readme=README readme_helper=Escolha um modelo de ficheiro README readme_helper_desc=Este é o sítio onde pode escrever uma descrição completa do seu trabalho. -auto_init=Inicializar repositório (adiciona `.gitignore`, `LICENSE` e `README.md`) +auto_init=Inicializar repositório trust_model_helper=Escolha o modelo de confiança para a validação das assinaturas. As opções são: trust_model_helper_collaborator=Colaborador: Confiar nas assinaturas dos colaboradores trust_model_helper_committer=Autor do cometimento: Confiar nas assinaturas que correspondem a autores de cometimentos @@ -1128,7 +1174,7 @@ forks=Derivações reactions_more=e mais %d unit_disabled=O administrador desabilitou esta secção do repositório. language_other=Outros -adopt_search=Insira o nome de utilizador para procurar repositórios adoptados... (deixe em branco para encontrar todos) +adopt_search=Insira o nome de utilizador para procurar repositórios não adotados… (deixe em branco para encontrar todos) adopt_preexisting_label=Usar ficheiros adopt_preexisting=Adoptar ficheiros pré-existentes adopt_preexisting_content=Criar repositório a partir de %s @@ -1171,8 +1217,8 @@ template.issue_labels=Rótulos das questões template.one_item=Tem que escolher pelo menos um item do modelo template.invalid=Tem que escolher um repositório modelo -archive.title=Este repositório está arquivado. Pode ver os seus ficheiros e cloná-lo, mas não pode fazer envios para o repositório nem lançar questões ou fazer pedidos de integração. -archive.title_date=Este repositório foi arquivado em %s. Pode ver os ficheiros e cloná-lo, mas não pode fazer envios ou abrir questões/pedidos de integração. +archive.title=Este repositório está arquivado. Pode ver os ficheiros e cloná-lo, mas não pode fazer quaisquer alterações ao seu estado, tais como fazer envios e criar novas questões, pedidos de integração ou comentários. +archive.title_date=Este repositório foi arquivado em %s. Pode ver os ficheiros e cloná-lo, mas não pode fazer quaisquer alterações ao seu estado, tais como fazer envios e criar novas questões, pedidos de integração ou comentários. archive.issue.nocomment=Este repositório está arquivado. Não pode comentar nas questões. archive.pull.nocomment=Este repositório está arquivado. Não pode comentar nos pedidos de integração. @@ -1212,14 +1258,14 @@ migrate.migrate_items_options=É necessário um código de acesso para migrar it migrated_from=Migrado de %[2]s migrated_from_fake=Migrado de %[1]s migrate.migrate=Migrar de %s -migrate.migrating=Migrando a partir de %s ... +migrate.migrating=Migrando a partir de %s … migrate.migrating_failed=A migração de %s falhou. migrate.migrating_failed.error=Falhou a migração: %s migrate.migrating_failed_no_addr=A migração falhou. migrate.github.description=Migrar dados do github.com ou do GitHub Enterprise server. migrate.git.description=Migrar um repositório somente de qualquer serviço Git. migrate.gitlab.description=Migrar dados de gitlab.com ou de outras instâncias do GitLab. -migrate.gitea.description=Migrar dados de gitea.com ou de outras instâncias do Gitea/Forgejo. +migrate.gitea.description=Migrar dados de gitea.com ou de outras instâncias do Gitea. migrate.gogs.description=Migrar dados de notabug.org ou de outras instâncias do Gogs. migrate.onedev.description=Migrar dados de code.onedev.io ou de outras instâncias do OneDev. migrate.codebase.description=Migrar dados de codebasehq.com. @@ -1307,6 +1353,7 @@ view_git_blame=Ver git blame video_not_supported_in_browser=O seu navegador não suporta a etiqueta "video" do HTML5. audio_not_supported_in_browser=O seu navegador não suporta a etiqueta "audio" do HTML5. stored_lfs=Armazenado com Git LFS +stored_annex=Armazenado com Git Annex symbolic_link=Ligação simbólica executable_file=Ficheiro executável vendored=Externo @@ -1332,6 +1379,7 @@ editor.upload_file=Carregar ficheiro editor.edit_file=Editar ficheiro editor.preview_changes=Pré-visualizar modificações editor.cannot_edit_lfs_files=Ficheiros LFS não podem ser editados na interface web. +editor.cannot_edit_annex_files=Ficheiros Annex não podem ser editados na interface web. editor.cannot_edit_non_text_files=Ficheiros binários não podem ser editados na interface da web. editor.edit_this_file=Editar ficheiro editor.this_file_locked=Ficheiro bloqueado @@ -1346,7 +1394,7 @@ editor.or=ou editor.cancel_lower=Cancelar editor.commit_signed_changes=Cometer modificações assinadas editor.commit_changes=Cometer modificações -editor.add_tmpl=Adicionar "" +editor.add_tmpl=Adicionar "<%s>" editor.add=Adicionar %s editor.update=Modificar %s editor.delete=Eliminar %s @@ -1356,7 +1404,7 @@ editor.fail_to_apply_patch=`Não foi possível aplicar o remendo (patch) "%s"` editor.new_patch=Novo remendo (patch) editor.commit_message_desc=Adicionar uma descrição alargada opcional… editor.signoff_desc=Adicionar "Assinado-por" seguido do autor do cometimento no fim da mensagem do registo de cometimentos. -editor.commit_directly_to_this_branch=Cometer imediatamente no ramo %s. +editor.commit_directly_to_this_branch=Cometer imediatamente no ramo %[1]s. editor.create_new_branch=Crie um novo ramo para este cometimento e inicie um pedido de integração. editor.create_new_branch_np=Criar um novo ramo para este cometimento. editor.propose_file_change=Propor modificação do ficheiro @@ -1372,7 +1420,7 @@ editor.file_is_a_symlink=`"%s" é uma ligação simbólica. Ligações simbólic editor.filename_is_a_directory=O nome de ficheiro "%s" já está a ser usado como um nome de pasta neste repositório. editor.file_editing_no_longer_exists=O ficheiro que está a ser editado, "%s", já não existe neste repositório. editor.file_deleting_no_longer_exists=O ficheiro que está a ser eliminado, "%s", já não existe neste repositório. -editor.file_changed_while_editing=O conteúdo do ficheiro mudou desde que começou a editar. Clique aqui para ver as modificações ou clique em Cometer modificações novamente para escrever por cima. +editor.file_changed_while_editing=O conteúdo do ficheiro mudou desde que abriu o ficheiro. Clique aqui para ver as modificações ou Cometer modificações novamente para escrever por cima. editor.file_already_exists=Já existe um ficheiro com o nome "%s" neste repositório. editor.commit_empty_file_header=Cometer um ficheiro vazio editor.commit_empty_file_text=O ficheiro que está prestes a cometer está vazio. Quer continuar? @@ -1426,7 +1474,7 @@ commitstatus.failure=Falha commitstatus.pending=Pendente commitstatus.success=Sucesso -ext_issues=Acesso a questões externas +ext_issues=Questões externas ext_issues.desc=Ligação para um rastreador de questões externo. projects=Planeamentos @@ -1607,9 +1655,9 @@ issues.no_content=Nenhuma descrição fornecida. issues.close=Encerrar questão issues.comment_pull_merged_at=cometimento %[1]s integrado em %[2]s %[3]s issues.comment_manually_pull_merged_at=cometimento %[1]s integrado manualmente em %[2]s %[3]s -issues.close_comment_issue=Comentar e fechar +issues.close_comment_issue=Fechar com comentário issues.reopen_issue=Reabrir -issues.reopen_comment_issue=Comentar e reabrir +issues.reopen_comment_issue=Reabrir com comentário issues.create_comment=Comentar issues.closed_at=`encerrou esta questão %[2]s` issues.reopened_at=`reabriu esta questão %[2]s` @@ -1722,7 +1770,7 @@ issues.error_modifying_due_date=Falhou a modificação da data de vencimento. issues.error_removing_due_date=Falhou a remoção da data de vencimento. issues.push_commit_1=adicionou %d cometimento %s issues.push_commits_n=adicionou %d cometimentos %s -issues.force_push_codes=`forçou o envio %[1]s de %[2]s para %[4]s %[6]s` +issues.force_push_codes=`forçou o envio %[1]s de %[2]s para %[4]s %[6]s` issues.force_push_compare=Comparar issues.due_date_form=aaaa-mm-dd issues.due_date_form_add=Adicionar data de vencimento @@ -1776,8 +1824,8 @@ issues.review.left_comment=deixou um comentário issues.review.content.empty=Tem que deixar um comentário indicando a(s) modificação(ões) solicitada(s). issues.review.reject=modificações solicitadas %s issues.review.wait=foi solicitada para revisão %s -issues.review.add_review_request=solicitou revisão de %s %s -issues.review.remove_review_request=removeu a solicitação de revisão para %s %s +issues.review.add_review_request=solicitou revisão de %[1]s %[2]s +issues.review.remove_review_request=removeu a solicitação de revisão para %[1]s %[2]s issues.review.remove_review_request_self=recusou-se a rever %s issues.review.pending=Pendente issues.review.pending.tooltip=Este comentário não está visível para os outros utilizadores, neste momento. Para submeter os seus comentários pendentes, escolha "%s" → "%s/%s/%s" no topo da página. @@ -1838,7 +1886,7 @@ pulls.nothing_to_compare_have_tag=O ramo/etiqueta escolhidos são iguais. pulls.nothing_to_compare_and_allow_empty_pr=Estes ramos são iguais. Este pedido de integração ficará vazio. pulls.has_pull_request=`Já existe um pedido de integração entre estes ramos: %[2]s#%[3]d` pulls.create=Criar um pedido de integração -pulls.title_desc_few=quer integrar %[1]d cometimento(s) do ramo %[2]s no ramo %[3]s +pulls.title_desc_few=quer integrar %[1]d cometimento(s) do ramo %[2]s no ramo %[3]s pulls.merged_title_desc_few=integrou %[1]d cometimento(s) do ramo %[2]s no ramo %[3]s %[4]s pulls.change_target_branch_at=`mudou o ramo de destino de %s para %s %s` pulls.tab_conversation=Diálogo @@ -1999,7 +2047,7 @@ signing.wont_sign.commitssigned=A integração não irá ser assinada, uma vez q signing.wont_sign.approved=A integração não irá ser assinada, uma vez que o pedido de integração não foi assinado. signing.wont_sign.not_signed_in=Não tem a sessão iniciada. -ext_wiki=Acesso a wiki externo +ext_wiki=Wiki externo ext_wiki.desc=Ligação para um wiki externo. wiki=Wiki @@ -2329,32 +2377,32 @@ settings.event_push_desc=Envio do Git para um repositório. settings.event_repository=Repositório settings.event_repository_desc=Repositório criado ou eliminado. settings.event_header_issue=Eventos da questão -settings.event_issues=Questões +settings.event_issues=Modificação settings.event_issues_desc=Questão aberta, fechada, reaberta ou editada. -settings.event_issue_assign=Questão atribuída +settings.event_issue_assign=Atribuição settings.event_issue_assign_desc=Encarregado atribuído ou retirado à questão. -settings.event_issue_label=Questão com rótulo -settings.event_issue_label_desc=Rótulos modificados ou retirados às questões. -settings.event_issue_milestone=Questão com etapa atribuída -settings.event_issue_milestone_desc=Etapa atribuída ou retirada à questão. -settings.event_issue_comment=Comentário da questão +settings.event_issue_label=Rótulos +settings.event_issue_label_desc=Rótulos adicionados ou retirados às questões. +settings.event_issue_milestone=Etapas +settings.event_issue_milestone_desc=Etapa atribuída, removida ou modificada. +settings.event_issue_comment=Comentários settings.event_issue_comment_desc=Comentário da questão criado, editado ou eliminado. settings.event_header_pull_request=Eventos de pedidos de integração -settings.event_pull_request=Pedido de integração +settings.event_pull_request=Modificação settings.event_pull_request_desc=Pedido de integração aberto, fechado, reaberto ou editado. -settings.event_pull_request_assign=Encarregado atribuído ao pedido de integração +settings.event_pull_request_assign=Atribuição settings.event_pull_request_assign_desc=Encarregado atribuído ou retirado ao pedido de integração. -settings.event_pull_request_label=Rótulo atribuído ao pedido de integração -settings.event_pull_request_label_desc=Rótulos modificados ou retirados aos pedidos de integração. -settings.event_pull_request_milestone=Etapa atribuída ao pedido de integração -settings.event_pull_request_milestone_desc=Etapa atribuída ou retirada ao pedido de integração. -settings.event_pull_request_comment=Comentário do pedido de integração +settings.event_pull_request_label=Rótulos +settings.event_pull_request_label_desc=Rótulos adicionados ou retirados aos pedidos de integração. +settings.event_pull_request_milestone=Etapas +settings.event_pull_request_milestone_desc=Etapas adicionadas, removidas ou modificadas. +settings.event_pull_request_comment=Comentários settings.event_pull_request_comment_desc=Comentário do pedido de integração criado, editado ou eliminado. -settings.event_pull_request_review=Pedido de integração revisto +settings.event_pull_request_review=Revisões settings.event_pull_request_review_desc=Pedido de integração aprovado, rejeitado ou comentado na revisão. -settings.event_pull_request_sync=Pedido de integração sincronizado -settings.event_pull_request_sync_desc=Pedido de integração sincronizado. -settings.event_pull_request_review_request=Solicitada a revisão do pedido de integração +settings.event_pull_request_sync=Sincronizado +settings.event_pull_request_sync_desc=Ramo sincronizado automaticamente com o ramo de destino. +settings.event_pull_request_review_request=Pedidos de revisão settings.event_pull_request_review_request_desc=A revisão do pedido de integração foi solicitada ou a solicitação de revisão foi removida. settings.event_pull_request_approvals=Aprovações do pedido de integração settings.event_pull_request_merge=Integração constante no pedido @@ -2458,7 +2506,7 @@ settings.protect_branch_name_pattern=Padrão do nome do ramo protegido settings.protect_branch_name_pattern_desc=Padrões de nomes de ramos protegidos. Consulte a documentação para ver a sintaxe dos padrões. Exemplos: main, release/** settings.protect_patterns=Padrões settings.protect_protected_file_patterns=Padrões de ficheiros protegidos (separados com ponto e vírgula ";") -settings.protect_protected_file_patterns_desc=Ficheiros protegidos não podem ser modificados imediatamente, mesmo que o utilizador tenha direitos para adicionar, editar ou eliminar ficheiros neste ramo. Múltiplos padrões podem ser separados com ponto e vírgula (";"). Veja a documentação em github.com/gobwas/glob para ver a sintaxe. Exemplos: .drone.yml, /docs/**/*.txt. +settings.protect_protected_file_patterns_desc=Ficheiros protegidos não podem ser modificados imediatamente, mesmo que o utilizador tenha direitos para adicionar, editar ou eliminar ficheiros neste ramo. Múltiplos padrões podem ser separados com ponto e vírgula (";"). Veja a documentação em %s para ver a sintaxe. Exemplos: .drone.yml, /docs/**/*.txt. settings.protect_unprotected_file_patterns=Padrões de ficheiros desprotegidos (separados com ponto e vírgula ";") settings.protect_unprotected_file_patterns_desc=Ficheiros desprotegidos que podem ser modificados imediatamente se o utilizador tiver direitos de escrita, contornando a restrição no envio. Padrões múltiplos podem ser separados com ponto e vírgula (";"). Veja a documentação em %[2]s para ver a sintaxe. Exemplos: .drone.yml, /docs/**/*.txt. settings.add_protected_branch=Habilitar salvaguarda @@ -2505,9 +2553,9 @@ settings.archive.text=Arquivar o repositório irá torná-lo apenas de leitura. settings.archive.success=O repositório foi arquivado com sucesso. settings.archive.error=Ocorreu um erro enquanto decorria o processo de arquivo do repositório. Veja os registo para obter mais detalhes. settings.archive.error_ismirror=Não pode arquivar um repositório que tenha sido replicado. -settings.archive.branchsettings_unavailable=As configurações dos ramos não estão disponíveis quando o repositório está arquivado. -settings.archive.tagsettings_unavailable=As configurações sobre etiquetas não estão disponíveis quando o repositório está arquivado. -settings.archive.mirrors_unavailable=As réplicas não estão disponíveis se o repositório estiver arquivado. +settings.archive.branchsettings_unavailable=As configurações dos ramos não estão disponíveis em repositórios arquivados. +settings.archive.tagsettings_unavailable=As configurações sobre etiquetas não estão disponíveis em repositórios arquivados. +settings.archive.mirrors_unavailable=As réplicas não estão disponíveis em repositórios arquivados. settings.unarchive.button=Desarquivar repositório settings.unarchive.header=Desarquivar este repositório settings.unarchive.text=Desarquivar o repositório irá restaurar a capacidade de receber cometimentos e envios, assim como novas questões e pedidos de integração. @@ -2528,7 +2576,7 @@ settings.lfs_invalid_locking_path=Localização inválida: %s settings.lfs_invalid_lock_directory=Não foi possível bloquear a pasta: %s settings.lfs_lock_already_exists=Já existe um bloqueio: %s settings.lfs_lock=Bloquear -settings.lfs_lock_path=Localização do ficheiro a bloquear... +settings.lfs_lock_path=Localização do ficheiro a bloquear… settings.lfs_locks_no_locks=Sem bloqueios settings.lfs_lock_file_no_exist=O ficheiro bloqueado não existe no ramo principal settings.lfs_force_unlock=Forçar desbloqueio @@ -2581,7 +2629,7 @@ diff.generated=gerado diff.vendored=externo diff.comment.add_line_comment=Adicionar comentário de linha diff.comment.placeholder=Deixar um comentário -diff.comment.markdown_info=A formatação com markdown é suportada. +diff.comment.markdown_info=A formatação com Markdown é suportada. diff.comment.add_single_comment=Adicionar um único comentário diff.comment.add_review_comment=Adicionar comentário diff.comment.start_review=Iniciar revisão @@ -2612,7 +2660,7 @@ release.draft=Rascunho release.prerelease=Pré-lançamento release.stable=Estável release.compare=Comparar -release.edit=editar +release.edit=Editar release.ahead.commits=%d cometimentos release.ahead.target=para %s desde este lançamento tag.ahead.target=para o ramo %s desde esta etiqueta @@ -2705,7 +2753,7 @@ find_file.no_matching=Não foi encontrado qualquer ficheiro correspondente error.csv.too_large=Não é possível apresentar este ficheiro por ser demasiado grande. error.csv.unexpected=Não é possível apresentar este ficheiro porque contém um caractere inesperado na linha %d e coluna %d. error.csv.invalid_field_count=Não é possível apresentar este ficheiro porque tem um número errado de campos na linha %d. -issues.blocked_by_user = Não pode criar uma questão neste repositório porque foi bloqueado/a pelo/a proprietário/a do repositório. +issues.blocked_by_user = Não pode criar questões neste repositório porque foi bloqueado(a) pelo(a) proprietário(a) do repositório. issues.num_participants_one = %d participante stars = Favoritos editor.invalid_commit_mail = Email inválido para criar um cometimento. @@ -2731,10 +2779,10 @@ migrate.forgejo.description = Migrar dados de codeberg.org ou de outras instânc n_commit_one = %s cometimento editor.commit_id_not_matching = O ficheiro foi modificado enquanto o estava a editar. Cometa para um ramo novo e depois integre. commits.search_branch = Este ramo -pulls.title_desc_one = quer integrar %[1]d cometimento do ramo %[2]s no ramo %[3]s +pulls.title_desc_one = quer integrar %[1]d cometimento do ramo %[2]s no ramo %[3]s pulls.reopen_failed.base_branch = O pedido de integração não pode ser reaberto porque o ramo base já não existe. activity.navbar.code_frequency = Frequência de programação -settings.units.add_more = Adicionar mais... +settings.units.add_more = Habilitar mais settings.wiki_rename_branch_main_desc = Renomear o ramo usado internamente pelo Wiki para "%s". Esta operação é permanente e não poderá ser revertida. settings.add_collaborator_blocked_our = Não foi possível adicionar o/a colaborador/a porque o/a proprietário/a do repositório bloqueou-os. settings.add_webhook.invalid_path = A localização não pode conter "." ou ".." ou ficar em branco. Não pode começar ou terminar com uma barra. @@ -2757,7 +2805,7 @@ release.download_count_one = %s descarga release.download_count_few = %s descargas release.system_generated = Este anexo é gerado automaticamente. pulls.ready_for_review = Pronto/a para rever? -settings.units.units = Unidades do repositório +settings.units.units = Unidades error.broken_git_hook = Os automatismos git deste repositório parecem estar danificados. Consulte a documentação sobre como os consertar e depois envie alguns cometimentos para refrescar o estado. settings.rename_branch_failed_protected = Não é possível renomear o ramo %s porque é um ramo protegido. settings.units.overview = Visão geral @@ -2771,7 +2819,7 @@ settings.sourcehut_builds.secrets = Segredos settings.matrix.room_id_helper = O ID da Sala pode ser obtido no cliente web Element > Configurações da sala > Avançado > ID interno da sala. Exemplo: %s. settings.web_hook_name_sourcehut_builds = Construções do SourceHut settings.enter_repo_name = Insira o nome do/a proprietário/a e do repositório tal como é apresentado: -issues.comment.blocked_by_user = Não pode criar um comentário nesta questão porque foi bloqueado/a pelo/a proprietário/a ou pelo remetente da questão. +issues.comment.blocked_by_user = Não pode comentar nesta questão porque foi bloqueado(a) pelo(a) proprietário(a) ou pelo autor da questão. pulls.merged_title_desc_one = integrou %[1]d cometimento do ramo %[2]s no ramo %[3]s %[4]s pulls.agit_explanation = Criado usando a sequência de trabalho AGit. AGit deixa os contribuidores proporem alterações usando "git push" sem criar uma derivação ou um ramo novo. settings.new_owner_blocked_doer = O/A novo/a proprietário/a bloqueou-o/a. @@ -2819,12 +2867,53 @@ mirror_use_ssh.text = Utilizar a autenticação SSH mirror_denied_combination = Não é possível usar a autenticação baseada em chave pública e senha em combinação. settings.mirror_settings.push_mirror.copy_public_key = Copiar chave pública settings.mirror_settings.push_mirror.none_ssh = Nenhuma -settings.protect_new_rule = Criar uma nova regra de salvaguarda do ramo +settings.protect_new_rule = Criar uma nova regra de proteção de ramo mirror_use_ssh.helper = O Forgejo irá replicar o repositório via Git sobre SSH e criar um par de chaves para si quando escolher esta opção. Tem que se certificar que a chave pública gerada está autorizada a enviar para o repositório de destino. Não pode usar a autorização baseada numa senha quando escolher isto. mirror_use_ssh.not_available = A autenticação por SSH não está disponível. +issues.new.assign_to_me = Atribuir a mim +issues.all_title = Todas +settings.discord_icon_url.exceeds_max_length = O URL do ícone tem que ter 2048 caracteres ou menos +issues.filter_sort.relevance = Relevância +diff.git-notes.add = Adicionar nota +diff.git-notes.remove-header = Remover nota +diff.git-notes.remove-body = Esta nota irá ser removida. +issues.review.add_review_requests = revisões solicitadas de %[1]s %[2]s +issues.review.remove_review_requests = pedidos de revisão removidos para %[1]s %[2]s +issues.review.add_remove_review_requests = pedidos de revisão de %[1]s e pedidos de revisão removidos para %[2]s %[3]s +pulls.delete_after_merge.head_branch.is_default = O ramo de topo que pretende eliminar é o ramo predefinido e não pode ser eliminado. +pulls.delete_after_merge.head_branch.is_protected = O ramo de topo que pretende eliminar é um ramo protegido e não pode ser eliminado. +pulls.delete_after_merge.head_branch.insufficient_branch = Não tem permissão para eliminar o ramo de topo. +issues.summary_card_alt = Cartão de resumo de uma questão com o título "%s" no repositório %s +issues.num_reviews_one = %d revisão +issues.num_reviews_few = %d revisões +editor.add_tmpl.filename = nome do ficheiro +new_from_template = Utilize um template +settings.default_update_style_desc = Estilo de atualização predefinido utilizado para atualizar pedidos de integração que estão atrasados em relação ao ramo base. +pulls.sign_in_require = Inicie sessão para criar um novo pedido de integração. +new_advanced = Configurações avançadas +new_advanced_expand = Clique para expandir +new_from_template_description = Pode selecionar um modelo de repositório existente nesta instância e aplicar as suas definições. +auto_init_description = Iniciar o histórico do Git com um README e, opcionalmente, adicione os ficheiros License e .gitignore. +issues.reaction.add = Adicionar reação +issues.reaction.alt_few = %[1]s reagiu com %[2]s. +issues.reaction.alt_many = %[1]s e mais %[2]d reagiram com %[3]s. +issues.reaction.alt_remove = Remover reação %[1]s deste comentário. +issues.reaction.alt_add = Adicionar reação %[1]s ao comentário. +issues.context.menu = Menu de comentário +summary_card_alt = Cartão de resumo do repositório %s +release.summary_card_alt = Cartão de resumo de um lançamento com o título "%s" no repositório %s +archive.pull.noreview = Este repositório está arquivado. Não é possível rever os pedidos de integração. +editor.commit_email = Endereço de email do cometimento +commits.view_single_diff = Ver alterações a este ficheiro introduzidas neste cometimento +pulls.comment.blocked_by_user = Não pode comentar este pedido de integração porque está bloqueado pelo(a) proprietário(a) do repositório ou pelo(a) autor(a) do pedido de integração. +issues.reopen.blocked_by_user = Não pode reabrir esta questão porque está bloqueado pelo(a) proprietário(a) do repositório ou pelo autor da questão. +pulls.editable = Editável +pulls.editable_explanation = Este pedido de integração permite edições dos responsáveis. Pode contribuir diretamente para ele. +issues.filter_no_results = Nenhum resultado +issues.filter_no_results_placeholder = Tente ajustar os seus filtros de pesquisa. [graphs] -component_loading=A carregar %s... +component_loading=A carregar %s… component_loading_failed=Não foi possível carregar %s component_loading_info=Isto pode demorar um pouco… component_failed_to_load=Ocorreu um erro inesperado. @@ -2869,7 +2958,7 @@ settings.permission=Permissões settings.repoadminchangeteam=O administrador do repositório pode adicionar e remover o acesso às equipas settings.visibility=Visibilidade settings.visibility.public=Público -settings.visibility.limited=Limitada (visível apenas para utilizadores autenticados) +settings.visibility.limited=Limitada (visível apenas para utilizadores regitados) settings.visibility.limited_shortname=Limitada settings.visibility.private=Privada (visível apenas para membros da organização) settings.visibility.private_shortname=Privado @@ -2957,6 +3046,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. [admin] dashboard=Painel de controlo @@ -3142,8 +3233,8 @@ orgs.members=Membros orgs.new_orga=Nova organização repos.repo_manage_panel=Gerir repositórios -repos.unadopted=Repositórios não adoptados -repos.unadopted.no_more=Não foram encontrados mais repositórios não adoptados +repos.unadopted=Repositórios não adotados +repos.unadopted.no_more=Não foram encontrados repositórios não adotados. repos.owner=Proprietário(a) repos.name=Nome repos.private=Privado @@ -3250,9 +3341,9 @@ auths.oauth2_required_claim_name_helper=Defina este nome para restringir o iníc auths.oauth2_required_claim_value=Valor de reivindicação obrigatório auths.oauth2_required_claim_value_helper=Defina este valor para restringir o início de sessão desta fonte a utilizadores que tenham uma reivindicação com este nome e este valor auths.oauth2_group_claim_name=Reivindicar nome que fornece nomes de grupo para esta fonte. (Opcional) -auths.oauth2_admin_group=Valor da reivindicação de grupo para utilizadores administradores (opcional — exige a reivindicação de nome acima). -auths.oauth2_restricted_group=Valor da reivindicação de grupo para utilizadores restritos (opcional — exige a reivindicação de nome acima). -auths.oauth2_map_group_to_team=Mapear grupos reclamados em equipas da organização (opcional — requer nome de reclamação acima). +auths.oauth2_admin_group=Valor da reivindicação de grupo para utilizadores administradores. (Opcional — exige a reivindicação de nome acima) +auths.oauth2_restricted_group=Valor da reivindicação de grupo para utilizadores restritos. (Opcional — exige a reivindicação de nome acima) +auths.oauth2_map_group_to_team=Mapear grupos reclamados em equipas da organização. (Opcional — requer nome de reclamação acima) auths.oauth2_map_group_to_team_removal=Remover utilizadores das equipas sincronizadas se esses utilizadores não pertencerem ao grupo correspondente. auths.enable_auto_register=Habilitar o registo automático auths.sspi_auto_create_users=Criar utilizadores automaticamente @@ -3490,9 +3581,9 @@ notices.delete_success=As notificações do sistema foram eliminadas. self_check.no_problem_found=Nenhum problema encontrado até agora. self_check.database_collation_mismatch=Supor que a base de dados usa a colação: %s -self_check.database_collation_case_insensitive=A base de dados está a usar a colação %s, que é insensível à diferença entre maiúsculas e minúsculas. Embora o Gitea possa trabalhar com ela, pode haver alguns casos raros que não funcionem como esperado. +self_check.database_collation_case_insensitive=A base de dados está a usar a colação %s, que é insensível à diferença entre maiúsculas e minúsculas. Embora o Forgejo possa trabalhar com ela, pode haver alguns casos raros que não funcionem como esperado. self_check.database_inconsistent_collation_columns=A base de dados está a usar a colação %s, mas estas colunas estão a usar colações diferentes. Isso poderá causar alguns problemas inesperados. -self_check.database_fix_mysql=Para utilizadores do MySQL/MariaDB, pode usar o comando "gitea doctor convert" para resolver os problemas de colação. Também pode resolver o problema com comandos SQL "ALTER ... COLLATE ..." aplicados manualmente. +self_check.database_fix_mysql=Para utilizadores do MySQL/MariaDB, pode usar o comando "forgejo doctor convert" para resolver os problemas de colação. Também pode resolver o problema com comandos SQL "ALTER ... COLLATE ..." aplicados manualmente. config_summary = Resumo auths.tips.gmail_settings = Configurações do Gmail: config_settings = Configurações @@ -3515,6 +3606,7 @@ emails.delete = Eliminar email emails.deletion_success = O endereço de email foi eliminado. emails.delete_primary_email_error = Não pode eliminar o endereço de email principal. emails.delete_desc = Tem a certeza que quer eliminar este endereço de email? +monitor.duration = Duração (s) [action] create_repo=criou o repositório %s @@ -3639,7 +3731,7 @@ alpine.registry=Configure este registo adicionando o URL no seu ficheiro / alpine.registry.key=Descarregue a chave RSA pública do registo para dentro da pasta /etc/apk/keys/ para verificar a assinatura do índice: alpine.registry.info=Escolha $branch e $repository da lista abaixo. alpine.install=Para instalar o pacote, execute o seguinte comando: -alpine.repository=Informação do repositório +alpine.repository=Informações do repositório alpine.repository.branches=Ramos alpine.repository.repositories=Repositórios alpine.repository.architectures=Arquitecturas @@ -3659,9 +3751,9 @@ conda.install=Para instalar o pacote usando o Conda, execute o seguinte comando: container.details.type=Tipo de imagem container.details.platform=Plataforma container.pull=Puxar a imagem usando a linha de comandos: -container.digest=Resumo: +container.digest=Resumo container.multi_arch=S.O. / Arquit. -container.layers=Camadas de imagem +container.layers=Camadas da imagem container.labels=Rótulos container.labels.key=Chave container.labels.value=Valor @@ -3670,7 +3762,7 @@ cran.install=Para instalar o pacote, execute o seguinte comando: debian.registry=Configurar este registo usando a linha de comandos: debian.registry.info=Escolha $distribution e $component da lista abaixo. debian.install=Para instalar o pacote, execute o seguinte comando: -debian.repository=Informação do repositório +debian.repository=Informações do repositório debian.repository.distributions=Distribuições debian.repository.components=Componentes debian.repository.architectures=Arquitecturas @@ -3700,12 +3792,12 @@ rpm.registry=Configurar este registo usando a linha de comandos: rpm.distros.redhat=em distribuições baseadas no RedHat rpm.distros.suse=em distribuições baseadas no SUSE rpm.install=Para instalar o pacote, execute o seguinte comando: -rpm.repository=Informação do repositório +rpm.repository=Informações do repositório rpm.repository.architectures=Arquitecturas rpm.repository.multiple_groups=Este pacote está disponível em vários grupos. rubygems.install=Para instalar o pacote usando o gem, execute o seguinte comando: rubygems.install2=ou adicione-o ao ficheiro Gemfile: -rubygems.dependencies.runtime=Dependências do tempo de execução (runtime) +rubygems.dependencies.runtime=Dependências em tempo de execução rubygems.dependencies.development=Dependências de desenvolvimento rubygems.required.ruby=Requer a versão do Ruby rubygems.required.rubygems=Requer a versão do RubyGem @@ -3766,7 +3858,7 @@ arch.version.provides = Fornece arch.pacman.helper.gpg = Adicionar certificado de confiança para o pacman: arch.pacman.conf = Adicionar servidor com distribuição e arquitectura relacionadas a /etc/pacman.conf : arch.pacman.repo.multi = %s tem a mesma versão em distribuições diferentes. -arch.version.optdepends = Dependências opcionais +arch.version.optdepends = Depende opcionalmente arch.version.depends = Depende de arch.version.makedepends = Dependências do make arch.version.groups = Grupo @@ -3774,6 +3866,15 @@ arch.version.checkdepends = Verificar dependências arch.version.conflicts = Conflitos arch.version.backup = Cópia de segurança arch.version.replaces = Substitui +container.images.title = Imagens +search_in_external_registry = Procurar em %s +alt.registry = Configure este registo a partir da linha de comandos: +alt.registry.install = Para instalar o pacote, execute o seguinte comando: +alt.install = Instalar pacote +alt.repository = Informação do repositório +alt.repository.architectures = Arquiteturas +alt.repository.multiple_groups = Este pacote está disponível em vários grupos. +alt.setup = Adicionar um repositório à lista de repositórios ligados (escolha a arquitetura necessária em vez de "_arch_"): [secrets] secrets=Segredos @@ -3793,7 +3894,7 @@ management=Gerir segredos [actions] actions=Operações -unit.desc=Gerir sequências CI/CD integradas com Forgejo Actions +unit.desc=Gerir sequências CI/CD integradas com Forgejo Actions. status.unknown=Desconhecido status.waiting=Aguardando @@ -3892,6 +3993,9 @@ workflow.dispatch.trigger_found = Esta sequência de trabalho é despoletada pel workflow.dispatch.success = A execução da sequência de trabalho foi pedida com sucesso. workflow.dispatch.invalid_input_type = Tipo de entrada "%s" inválido. runs.expire_log_message = Os registos foram purgados por serem demasiado antigos. +runs.no_workflows.help_no_write_access = Para aprender sobre Forgejo Actions, vejaa documentação. +runs.no_workflows.help_write_access = Não sabe como começar com o Forgejo Actions? Consulte o início rápido na documentação do utilizador para escrever a sua primeira sequência de trabalho, depois prepare um executor Forgejo para executar os seus trabalhos. +variables.not_found = Não foi possível encontrar a variável. [projects] type-1.display_name=Planeamento individual @@ -3901,7 +4005,6 @@ deleted.display_name = Planeamento eliminado [git.filemode] changed_filemode=%[1]s → %[2]s -; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … directory=Pasta normal_file=Ficheiro normal executable_file=Ficheiro executável @@ -3911,33 +4014,35 @@ submodule=Submódulo [search] -org_kind = Pesquisar organizações... +org_kind = Pesquisar organizações… keyword_search_unavailable = Pesquisar por palavra-chave não está disponível, neste momento. Entre em contacto com o administrador. code_search_by_git_grep = Os resultados da pesquisa no código-fonte neste momento são fornecidos pelo "git grep". Esses resultados podem ser melhores se o administrador habilitar o indexador de código-fonte. no_results = Não foram encontrados resultados correspondentes. -package_kind = Pesquisar pacotes... -runner_kind = Pesquisar executores... -project_kind = Pesquisar planeamentos... -branch_kind = Pesquisar ramos... -commit_kind = Pesquisar cometimentos... -search = Procurar... +package_kind = Pesquisar pacotes… +runner_kind = Pesquisar executores… +project_kind = Pesquisar planeamentos… +branch_kind = Pesquisar ramos… +commit_kind = Pesquisar cometimentos… +search = Procurar… type_tooltip = Tipo de pesquisa fuzzy = Aproximada fuzzy_tooltip = Incluir também os resultados que estejam próximos do termo de pesquisa match = Fiel match_tooltip = Incluir somente os resultados que correspondam rigorosamente ao termo de pesquisa -repo_kind = Pesquisar repositórios... -user_kind = Pesquisar utilizadores... -team_kind = Pesquisar equipas... -code_kind = Pesquisar código... +repo_kind = Pesquisar repositórios… +user_kind = Pesquisar utilizadores… +team_kind = Pesquisar equipas… +code_kind = Pesquisar código… code_search_unavailable = A pesquisa de código não está disponível, neste momento. Entre em contacto com o administrador. exact = Fiel exact_tooltip = Incluir somente os resultados que correspondam rigorosamente ao termo de pesquisa -issue_kind = Procurar questões... -pull_kind = Procurar pedidos de integração... +issue_kind = Procurar questões… +pull_kind = Procurar pedidos de integração… union = Palavras-chave union_tooltip = Incluir resultados correspondentes a qualquer das palavras-chave separadas por espaços em branco milestone_kind = Procurar etapas... +regexp_tooltip = Interpreta o termo de pesquisa como uma expressão regular +regexp = ExpReg [munits.data] kib = KiB @@ -3954,4 +4059,24 @@ filepreview.line = Linha %[1]d em %[2]s filepreview.truncated = A previsão foi truncada [translation_meta] -test = ok \ No newline at end of file +test = ok :) + +[repo.permissions] +code.read = Ler: Aceder e clonar o código-fonte do repositório. +releases.read = Ler: Ver e descarregar lançamentos. +projects.read = Ler: Aceder aos quadros de planeamento do repositório. +projects.write = Escrever: Criar planeamentos e colunas e editá-las. +packages.read = Ler: Ver e descarregar pacotes atribuídos ao repositório. +packages.write = Escrever: Publicar e eliminar pacotes atribuídos ao repositório. +actions.read = Ler: Ver sequências CI/CD integrados e os seus registos. +actions.write = Escrever: Despoletar, reiniciar, cancelar ou aprovar manualmente sequências CI/CD pendentes. +ext_issues = Aceder à ligação para um rastreador de questões externo. As permissões são geridas externamente. +ext_wiki = Aceder à ligação para um wiki externo. As permissões são geridas externamente. +issues.write = Escrever: Fechar questões e gerir metadados, tais como rótulos, etapas, encarregados, datas de vencimento e dependências. +pulls.read = Ler: Ler e criar pedidos de integração. +releases.write = Escrever: Publicar, editar e eliminar lançamentos e seus recursos. +wiki.read = Ler: Ler o wiki integrado e o seu histórico. +wiki.write = Escrever: Criar, modificar e eliminar páginas no wiki integrado. +code.write = Escrever: Enviar para o repositório, criar ramos e etiquetas. +issues.read = Ler: Ler e criar questões e comentários. +pulls.write = Escrever: Fechar pedidos de integração e gerir metadados, tais como rótulos, etapas, encarregados, datas de vencimento e dependências. diff --git a/options/locale/locale_ro.ini b/options/locale/locale_ro.ini new file mode 100644 index 0000000000..305c34d013 --- /dev/null +++ b/options/locale/locale_ro.ini @@ -0,0 +1,249 @@ + + + +[common] +return_to_forgejo = ÃŽnapoi la Forgejo +explore = Explorează +page = Pagină +licenses = LicenÈ›e +copy_type_unsupported = Acest tip de fiÈ™ier nu poate fi copiat +sign_in = Autentificare +sign_out = Deconectare +sign_in_with_provider = Autentificare cu %s +sign_in_or = sau +toc = Cuprins +admin_panel = Administrare site +artifacts = Artefacte +concept_user_organization = OrganizaÈ›ie +logo = Logo +help = Ajutor +sign_up = ÃŽnregistrare +link_account = Conectare cont +register = ÃŽnregistrare +template = Șablon +language = Limbă +notifications = Notificări +create_new = Creează… +user_profile_and_more = Profil È™i setări… +username = Nume de utilizator +email = Adresă de email +password = Parolă +access_token = Token de acces +captcha = CAPTCHA +twofa = Autentificare prin doi factori +webauthn_insert_key = Inserează cheia de securitate +webauthn_press_button = Apasă butonul de pe cheia de securitate… +webauthn_use_twofa = FoloseÈ™te un cod de verificare de pe telefon +webauthn_error = Cheia de securitate nu a putut fi citită. +webauthn_unsupported_browser = Browserul tău nu are abilități WebAuthn pe moment. +webauthn_error_unable_to_process = Serverul nu a putut procesa cererea. +webauthn_error_duplicated = Cheia de securitate nu este permisă pentru această cerere. Asigură-te că cheia nu este înregistrată deja. +webauthn_error_empty = Trebuie să setezi un nume pentru această cheie. +organization = OrganizaÈ›ie +mirror = Oglindă +settings = Setări +your_profile = Profil +your_starred = Favorite +your_settings = Setări +new_migrate.title = Migrare nouă +new_org.title = OrganizaÈ›ie nouă +new_migrate.link = Migrare nouă +new_org.link = OrganizaÈ›ie nouă +sources = Surse +mirrors = Oglinzi +ok = OK +cancel = Anulare +retry = Reîncearcă +add = Adaugă +edit = Editează +view = Vezi +test = Test +enabled = Activat +disabled = Dezactivat +locked = Blocat +copy = Copiază +copy_generic = Copiază în clipboard +copy_url = Copiază URL +copy_hash = Copiază hash +copy_content = Copiază conÈ›inut +copy_success = Copiat! +preview = Previzualizează +loading = Se încarcă… +error = Eroare +go_back = ÃŽnapoi +never = Niciodată +rss_feed = Flux RSS +confirm_delete_artifact = EÈ™ti sigur că vrei să È™tergi artefactul "%s"? +archived = Arhivat +concept_system_global = Global +show_log_seconds = Arată secunde +name = Nume +filter = Filtru +filter.clear = Șterge filtre +filter.is_archived = Arhivat +enable_javascript = Acest site are nevoie de JavaScript. +webauthn_error_unknown = O eroare necunoscută a apărut. Te rog reîncearcă. +re_type = Confirmă parola +webauthn_sign_in = Apasă butonul de pe cheia de securitate. Dacă cheia de securitate nu are un buton, reintrodu-o. +new_mirror = Oglindă nouă +new_project = Proiect nou +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. +filter.not_archived = Nearhivat +activities = Activități +confirm_delete_selected = Ștergi toate elementele selectate? +webauthn_error_insecure = WebAuthn funcÈ›ionează doar prin conexiuni securizate. Pentru a testa folosind HTTP, poÈ›i folosi "localhost" sau "127.0.0.1" ca origine +webauthn_error_timeout = Limita de timp a fost depășită înainte ca cheia ta să poată fi citită. Reîncarcă pagina È™i reîncearcă. +copy_error = Copiere eÈ™uată +concept_user_individual = Individual +unknown = Necunoscut +home = Acasă +dashboard = Panou de Control +version = Versiune +powered_by = SusÈ›inut de %s +active_stopwatch = Monitorizor de timp activ +more_items = Mai multe elemente + +[editor] +table_modal.header = Adaugă tabel +table_modal.placeholder.content = ConÈ›inut +table_modal.label.rows = Rânduri +table_modal.label.columns = Coloane +buttons.list.ordered.tooltip = Adaugă o listă numerotată +table_modal.placeholder.header = Antet +buttons.italic.tooltip = Adaugă text cursiv +buttons.mention.tooltip = MenÈ›ionează un utilizator sau o echipă +buttons.new_table.tooltip = Adaugă tabel +buttons.bold.tooltip = Adaugă text aldin +buttons.code.tooltip = Adaugă cod +buttons.quote.tooltip = Citează text +buttons.link.tooltip = Adaugă un link + +[filter] +string.asc = A - Z +string.desc = Z - A + +[error] +server_internal = Eroare internă a serverului +network_error = Eroare de reÈ›ea + +[startpage] +install = UÈ™or de instalat +license = Sursă deschisă + +[install] +require_db_desc = Forgejo are nevoie de MySQL, PostgreSQL, SQLite3 sau TiDB (protocol MySQL). +db_title = Setări bază de date +db_type = Tipul bazei de date +user = Nume de utilizator +ssl_mode = SSL +path = Cale +sqlite_helper = Calea fiÈ™ierului pentru baza de date SQLite3.
      Introdu o cale absolută dacă rulezi Forgejo ca serviciu. +reinstall_error = ÃŽncerci să instalezi într-o bază de date Forgejo care există deja +err_empty_db_path = Calea către baza de date SQLite3 nu poate fi goală. +no_admin_and_disable_registration = Nu poÈ›i dezactiva propria înregistrare a utilizatorilor fără un cont de administrator. +err_empty_admin_password = Parola administratorului nu poate fi goală. +err_empty_admin_email = Emailul administratorului nu poate fi gol. +err_admin_name_is_invalid = Numele de utilizator al administratorului este invalid +general_title = Setări generale +ssh_port = Port pentru serverul SSH +ssh_port_helper = Numărul de port care va fi folosit de serverul SSH. Lasă gol pentru a dezactiva serverul SSH. +http_port = Port de ascultare HTTP +http_port_helper = Număr de port care va fi folosit de serverul web Forgejo. +app_url = URL de bază +app_url_helper = Adresa de bază pentru URL-uri de clonare HTTP(S) È™i notificări prin email. +log_root_path = Cale pentru loguri +log_root_path_helper = FiÈ™iere cu loguri vor fi scrise în acest dosar. +optional_title = Setări opÈ›ionale +email_title = Setări pentru email +smtp_addr = Host SMTP +smtp_port = Port SMTP +mailer_user = Nume de utilizator SMTP +mailer_password = Parolă SMTP +mail_notify = PorneÈ™te notificări prin email +server_service_title = Setări pentru server È™i servicii terÈ›e +offline_mode.description = Dezactivează reÈ›ele de livrare a conÈ›inutului (CDN) terÈ›e È™i oferă toate resursele în mod local. +disable_gravatar = Dezactivează Gravatar +openid_signin = PorneÈ™te conectare folosind OpenID +openid_signin.description = Permite utilizatorilor conectarea prin OpenID. +openid_signup = PorneÈ™te înregistrarea proprie folosind OpenID +enable_captcha = PorneÈ™te CAPTCHA pentru înregistrare +enable_captcha.description = Solicită utilizatorilor să treacă de CAPTCHA pentru a crea conturi. +default_keep_email_private = Ascunde adresa de email în mod implicit +default_allow_create_organization = Permite crearea de organizaÈ›ii în mod implicit +default_allow_create_organization.description = Permite utilizatorilor noi să creeze organizaÈ›ii în mod implicit. Când această opÈ›iune este dezactivată, un administrator va trebui să ofere permisiune pentru crearea de organizaÈ›ii noilor utilizatori. +admin_title = Setări pentru contul de administrator +admin_name = Numele de utilizator al administratorului +admin_password = Parola administratorului +install_btn_confirm = Instalează Forgejo +internal_token_failed = Eroare la generarea tokenului intern: %v +secret_key_failed = Eroare la generarea cheii secrete: %v +save_config_failed = Eroare la salvarea configuraÈ›iei: %v +invalid_admin_setting = Setările pentru contul de administrator sunt invalide: %v +allow_dots_in_usernames = Permite utilizatorilor să folosească puncte în numele de utilizator. Conturile existente nu vor fi afectate. +password_algorithm = Algoritm de hash pentru parole +invalid_password_algorithm = Algoritm de hash pentru parole invalid +title = Configurare iniÈ›ială +smtp_from = Trimite email ca +openid_signup.description = Permite utilizatorilor să creeze conturi folosind OpenID dacă înregistrarea proprie este pornită. +test_git_failed = Eroare la testarea comenzii „gitâ€: %v +sqlite3_not_available = Această versiune de Forgejo nu este compatibilă cu SQLite3. Te rog descarcă versiunea binară oficială de la %s (nu versiunea „gobuildâ€). +password = Parolă +reinstall_confirm_message = Reinstalarea cu o bază de date Forgejo care există deja poate cauza probleme multiple. ÃŽn cele mai multe cazuri, ar trebui să îți foloseÈ™ti „app.ini†existent pentru a rula Forgejo. Dacă È™tii ce faci, confirmă următoarele: +reinstall_confirm_check_3 = Confirmi că eÈ™ti absolut sigur că acest Forgejo rulează cu locaÈ›ia app.ini corectă È™i că eÈ™ti sigur că trebuie să reinstalezi. Confirmi că ai luat la cunoÈ™tință riscurile de mai sus. +admin_email = Adresa de email +docker_helper = Dacă rulezi Forgejo în Docker, mai întâi citeÈ™te documentaÈ›ia înainte de a schimba setări. +lfs_path = Cale rădăcină pentru Git LFS +domain_helper = Domeniul sau adresa host pentru acest server. +install = Instalare +db_name = Numele bazei de date +allow_only_external_registration.description = Utilizatorii își vor putea crea conturi noi doar folosind servicii externe configurate. +admin_setting.description = Crearea unui cont de administrator este opÈ›ională. Primul utilizator înregistrat va deveni administrator în mod automat. +confirm_password = Confirmă parola +enable_update_checker = PorneÈ™te verificarea pentru actualizări +db_schema_helper = Lasă gol pentru baza de date implicită („publicâ€). +smtp_from_invalid = Adresa "Trimite email ca" este invalidă +smtp_from_helper = Adresa de email pe care Forgejo o va utiliza. Introdu o adresă de email simplă sau foloseÈ™te formatul „"Nume" â€. +disable_registration = Dezactivează înregistrarea proprie +allow_only_external_registration = Permite înregistrare doar prin servicii externe +default_keep_email_private.description = PorneÈ™te ascunderea adresei de email pentru utilizatori noi în mod implicit astfel încât această informaÈ›ie să nu fie scursă imediat după înregistrare. +invalid_app_data_path = Calea pentru datele aplicaÈ›iei este invalidă: %v +no_reply_address_helper = Domeniu pentru utilizatorii cu adresă de email ascunsă. De exemplu, utilizatorul „joe†va fi conectat la Git ca „joe@noreply.example.org†dacă domeniul pentru adrese de email ascunse este „noreply.example.orgâ€. +reinstall_confirm_check_1 = Datele criptate folosind SECRET_KEY din app.ini ar putea fi pierdute: s-ar putea ca utilizatorii să nu se mai poată conecta folosing 2FA/OTP È™i oglinzile ar putea să nu mai funcÈ›ioneze corect. Bifând această opÈ›iune confirmă că fiÈ™ierul app.ini curent conÈ›ine valoarea corectă pentru SECRET_KEY. +config_location_hint = Aceste opÈ›iuni de configurare vor fi salvate în: +err_admin_name_is_reserved = Numele de utilizator al administratorului este invalid, numele de utilizator este rezervat +invalid_db_table = Tabelul „%s†al bazei de date este invalid: %v +err_admin_name_pattern_not_allowed = Numele de utilizator al administratorului este invalid, numele de utilizator se potriveÈ™te cu un model rezervat +domain = Domeniul serverului +require_sign_in_view.description = Limitează accesul la conÈ›inut către utilizatori conectaÈ›i. OaspeÈ›ii vor putea să viziteze doar paginile de autentificare. +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... +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. + +[aria] +navbar = Bară de navigare +footer = Subsol +footer.software = Despre acest software +footer.links = Link-uri + +[heatmap] +contributions_zero = Nicio contribuÈ›ie +contributions_format = {contributions} pe {day} {month} {year} +contributions_few = contribuÈ›ii +less = Mai puÈ›in +number_of_contributions_in_the_last_12_months = %s contribuÈ›ii în ultimele 12 luni +more = Mai mult +contributions_one = contribuÈ›ie \ No newline at end of file diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 0938d4099c..4820a60ca8 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -17,14 +17,14 @@ page=Страница template=Шаблон language=Язык notifications=Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ -active_stopwatch=Трекер рабочего времени +active_stopwatch=Счётчик затраченного времени create_new=Создать… user_profile_and_more=Профиль и наÑтройки… signed_in_as=Ð’Ñ‹ вошли как enable_javascript=Ð”Ð»Ñ Ñтого Ñайта требуетÑÑ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ° JavaScript. toc=Содержание licenses=Лицензии -return_to_forgejo=ВернутьÑÑ Ðº Forgejo +return_to_forgejo=ВернутьÑÑ Ð² Forgejo username=Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ email=ÐÐ´Ñ€ÐµÑ Ñл. почты @@ -110,7 +110,7 @@ preview=ПредпроÑмотр loading=Загрузка… error=Ошибка -error404=Cтраница, которую вы пытаетеÑÑŒ открыть, не ÑущеÑтвует, либо у Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтаточно прав Ð´Ð»Ñ ÐµÐµ проÑмотра. +error404=Cтраница, которую вы пытаетеÑÑŒ открыть, не ÑущеÑтвует, была удалена, либо у Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтаточно прав Ð´Ð»Ñ ÐµÑ‘ проÑмотра. go_back=Ðазад never=Ðикогда @@ -155,17 +155,18 @@ filter.public = Публичные filter.private = ЧаÑтные filter.is_archived = Ðрхивированные filter.not_mirror = Ðе зеркала -more_items = Больше Ñлементов +more_items = Больше разделов invalid_data = Ðеверные данные: %v copy_generic = Копировать в буфер обмена test = Проверить error413 = Ваша квота иÑчерпана. -new_migrate.link = Выполнить миграцию +new_migrate.link = Выполнить Ð¿ÐµÑ€ÐµÐ½Ð¾Ñ new_org.link = Создать организацию new_repo.title = Ðовый репозиторий -new_migrate.title = ÐÐ¾Ð²Ð°Ñ Ð¼Ð¸Ð³Ñ€Ð°Ñ†Ð¸Ñ +new_migrate.title = Ðовый Ð¿ÐµÑ€ÐµÐ½Ð¾Ñ new_org.title = ÐÐ¾Ð²Ð°Ñ Ð¾Ñ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ new_repo.link = Создать репозиторий +copy_path = Копировать путь [aria] navbar=Панель навигации @@ -199,6 +200,16 @@ buttons.enable_monospace_font=Включить моноширинный шриф buttons.disable_monospace_font=Выключить моноширинный шрифт buttons.unindent.tooltip = Уменьшить вложенноÑть на 1 buttons.indent.tooltip = Увеличить вложенноÑть на 1 +buttons.new_table.tooltip = Создать таблицу +table_modal.label.columns = Кол-во Ñтолбцов +table_modal.header = Создание таблицы +table_modal.placeholder.header = Заголовок +table_modal.placeholder.content = Содержимое +table_modal.label.rows = Кол-во Ñтрок +link_modal.header = Добавить ÑÑылку +link_modal.url = СÑылка +link_modal.description = ОпиÑание +link_modal.paste_reminder = Ð˜Ð¼ÐµÑ ÑÑылку в буфере обмена, вы можете вÑтавить её напрÑмую в текÑÑ‚, чтобы Ñоздать ÑÑылку Ñ Ð¾Ð¿Ð¸Ñанием. [filter] string.asc=A - Я @@ -227,7 +238,7 @@ license_desc=Ð’ÑÑ‘ Ñто на документацией, прежде чем изменÑть любые наÑтройки. +docker_helper=ЕÑли вы запуÑкаете Forgejo под Docker, прежде чем изменÑть любые наÑтройки, пожалуйÑта, ознакомьтеÑÑŒ Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸ÐµÐ¹. require_db_desc=Forgejo требуетÑÑ MySQL, PostgreSQL, SQLite3 или TiDB (по протоколу MySQL). db_title=ÐаÑтройки базы данных db_type=Тип базы данных @@ -249,9 +260,9 @@ 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_pattern_not_allowed=Ðеверное Ð¸Ð¼Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратора, Ð¸Ð¼Ñ Ð¿Ð¾Ð¿Ð°Ð´Ð°ÐµÑ‚ под зарезервированный шаблон -err_admin_name_is_invalid=Ðеверное Ð¸Ð¼Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратора +err_admin_name_is_reserved=ÐеподходÑщее Ð¸Ð¼Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратора, оно зарезервировано +err_admin_name_pattern_not_allowed=ÐеподходÑщее Ð¸Ð¼Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратора, оно попадает под шаблон зарезервированных +err_admin_name_is_invalid=ÐеподходÑщее Ð¸Ð¼Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратора general_title=ОÑновные наÑтройки app_name=Ðазвание Ñервера @@ -265,11 +276,11 @@ run_user_helper=Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð¾Ð¹ ÑÐ¸Ñ domain=Домен Ñервера domain_helper=Домен или Ð°Ð´Ñ€ÐµÑ Ñ…Ð¾Ñта Ð´Ð»Ñ Ñервера. ssh_port=Порт SSH-Ñервера -ssh_port_helper=Ðомер порта, иÑпользуемый SSH-Ñервером. ОÑтавьте пуÑтым Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупа по SSH. +ssh_port_helper=Ðомер порта, иÑпользуемый Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих подключений по SSH. ОÑтавьте пуÑтым Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупа по SSH. http_port=Порт HTTP-Ñервера -http_port_helper=Ðомер порта, иÑпользуемый веб-Ñервером Forgejo. -app_url=Базовый URL Forgejo -app_url_helper=Этот параметр влиÑет на URL Ð´Ð»Ñ ÐºÐ»Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ HTTP/HTTPS и на некоторые ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñл. почте. +http_port_helper=Ðомер порта, который будет проÑлушиватьÑÑ Ð²ÐµÐ±-Ñервером Forgejo. +app_url=Базовый URL +app_url_helper=Этот параметр влиÑет на URL ÐºÐ»Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ HTTP/HTTPS и на ÑÑылки в уведомлениÑÑ… по Ñл. почте. log_root_path=Путь журналов log_root_path_helper=Файлы журнала будут запиÑыватьÑÑ Ð² Ñтот каталог. @@ -277,9 +288,9 @@ optional_title=Дополнительные наÑтройки email_title=ÐаÑтройки Ñл. почты smtp_addr=ÐÐ´Ñ€ÐµÑ SMTP smtp_port=Порт SMTP -smtp_from=ОтправлÑть пиÑьма от +smtp_from=Отправитель smtp_from_helper=ÐÐ´Ñ€ÐµÑ Ñл. почты, который будет иÑпользоватьÑÑ Forgejo. Введите обычный Ð°Ð´Ñ€ÐµÑ Ñл. почты или иÑпользуйте формат "ИмÑ" . -mailer_user=Логин SMTP +mailer_user=Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ SMTP mailer_password=Пароль SMTP register_confirm=Требовать подтверждение по Ñл. почте Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтрации mail_notify=Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñл. почте @@ -309,11 +320,11 @@ confirm_password=Подтверждение Ð¿Ð°Ñ€Ð¾Ð»Ñ admin_email=ÐÐ´Ñ€ÐµÑ Ñл. почты install_btn_confirm=УÑтановить Forgejo test_git_failed=Ðе удалоÑÑŒ проверить команду «git»: %v -sqlite3_not_available=Эта верÑÐ¸Ñ Forgejo не поддерживает SQLite3. ПожалуйÑта, загрузите официальную бинарную Ñборку из %s (не Ñборку «gobuild»). +sqlite3_not_available=Эта верÑÐ¸Ñ Forgejo не поддерживает SQLite3. ПожалуйÑта, Ñкачайте официальную Ñборку из %s (не верÑию «gobuild»). invalid_db_setting=Ðекорректные наÑтройки базы данных: %v invalid_db_table=Таблица «%s» базы данных некорректна: %v -invalid_repo_path=ÐедопуÑтимый путь к корню репозиториÑ: %v -invalid_app_data_path=Ðеверный путь к приложению: %v +invalid_repo_path=Ðеверный путь к корню репозиториев: %v +invalid_app_data_path=Ðеверный путь к данным приложениÑ: %v run_user_not_match=Текущий пользователь не ÑвлÑетÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¼ Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка: %s -> %s internal_token_failed=Ðе удалоÑÑŒ Ñоздать внутренний токен: %v secret_key_failed=Ðе удалоÑÑŒ Ñоздать Ñекретный ключ: %v @@ -334,11 +345,11 @@ password_algorithm_helper=Задайте алгоритм Ñ…ÐµÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ enable_update_checker=Проверка обновлений env_config_keys=ÐаÑтройка Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ env_config_keys_prompt=Следующие переменные Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñ‚Ð°ÐºÐ¶Ðµ будут применены к вашему конфигурационному файлу: -enable_update_checker_helper_forgejo = ПериодичеÑки проверÑть наличие новых верÑий Forgejo через DNS-запиÑÑŒ TXT на release.forgejo.org. +enable_update_checker_helper_forgejo = ПериодичеÑки проверÑть наличие новых верÑий Forgejo через «TXT» DNS-запиÑÑŒ домена release.forgejo.org. allow_dots_in_usernames = Разрешить точки в именах пользователей. Это не повлиÑет на уже Ñозданные учётные запиÑи. smtp_from_invalid = ÐÐ´Ñ€ÐµÑ Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ пиÑем некорректен config_location_hint = Эти наÑтройки конфигурации будут Ñохранены в: -allow_only_external_registration = Разрешить региÑтрацию только через Ñторонние Ñлужбы +allow_only_external_registration = РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ через Ñторонние Ñлужбы app_slogan = Лозунг Ñервера app_slogan_helper = Укажите лозунг вашего Ñервера, либо оÑтавьте пуÑтым Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ. @@ -353,7 +364,7 @@ my_orgs=Организации my_mirrors=Мои зеркала view_home=Показать %s search_repos=ПоиÑк репозиториÑ… -filter=Другие фильтры +filter=Прочие фильтры filter_by_team_repositories=Фильтровать по репозиториÑм команды feed_of=Лента «%s» @@ -387,8 +398,8 @@ user_no_results=ПодходÑщие пользователи не найден org_no_results=ПодходÑщие организации не найдены. code_no_results=СоответÑтвующий поиÑковому запроÑу иÑходный код не найден. code_search_results=Результаты поиÑка «%s» -code_last_indexed_at=ПоÑледний проиндекÑированный %s -relevant_repositories_tooltip=Репозитории, ÑвлÑющиеÑÑ Ð¾Ñ‚Ð²ÐµÑ‚Ð²Ð»ÐµÐ½Ð¸Ñми или не имеющие ни темы, ни значка, ни опиÑаниÑ, Ñкрыты. +code_last_indexed_at=ПоÑледнÑÑ Ð¸Ð½Ð´ÐµÐºÑÐ°Ñ†Ð¸Ñ %s +relevant_repositories_tooltip=Скрыты Ð¾Ñ‚Ð²ÐµÑ‚Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ репозитории, не имеющие ни темы, ни значка, ни опиÑаниÑ. relevant_repositories=Показаны только релевантные репозитории, показать результаты без фильтрации. forks_one = %d ответвление forks_few = %d ответвлений @@ -411,7 +422,7 @@ sign_up_successful=Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ уÑпешно Ñоздана. Д confirmation_mail_sent_prompt=Ðовое пиÑьмо Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¾ отправлено на %s. Ð”Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ€ÐµÐ³Ð¸Ñтрации, пожалуйÑта, перейдите по ÑÑылке внутри в течение %s. ЕÑли был введён неправильный адреÑ, вы можете войти и изменить его. must_change_password=Обновите пароль allow_password_change=Требовать Ñмену Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¼ (рекомендуетÑÑ) -reset_password_mail_sent_prompt=ПиÑьмо Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¾ отправлено на %s. Чтобы выполнить воÑÑтановление учётной запиÑи, перейдите по ÑÑылке внутри в течение %s. +reset_password_mail_sent_prompt=ПиÑьмо Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¾ отправлено на %s. Чтобы завершить процеÑÑ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð¾Ð¹ запиÑи, перейдите по указанной в нём ÑÑылке в течение %s. active_your_account=ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð¾Ð¹ запиÑи account_activated=Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ активирована prohibit_login=Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ приоÑтановлена @@ -476,6 +487,8 @@ sign_up_button = ЗарегиÑтрироватьÑÑ. back_to_sign_in = Ðазад ко входу sign_in_openid = Продолжить Ñ OpenID hint_login = Уже еÑть ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ? Войдите! +unauthorized_credentials = Учётные данные неверны или иÑтекли. Попробуйте повторить команду или ознакомьтеÑÑŒ Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¾ÑÑ‚Ñми по ÑÑылке: %s +use_onetime_code = ИÑпользовать одноразовый код [mail] view_it_on=ПоÑмотреть на %s @@ -514,10 +527,10 @@ issue.action.push_n=@%[1]s отправил(а) %[3]d изменений issue.action.close=@%[1]s закрыл(а) #%[2]d. issue.action.reopen=@%[1]s переоткрыл(а) #%[2]d. issue.action.merge=@%[1]s Ñлил(а) #%[2]d в %[3]s. -issue.action.approve=@%[1]s одобрил(а) Ñтот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние. +issue.action.approve=@%[1]s ÑлиÑние одобрено. issue.action.reject=@%[1]s запроÑил(а) Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Ñтом запроÑе на ÑлиÑние. issue.action.review=@%[1]s прокомментировал(а) Ñтот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние. -issue.action.review_dismissed=@%[1]s отклонил(а) поÑледний отзыв Ñ %[2]s Ð´Ð»Ñ Ñтого запроÑа на ÑлиÑние. +issue.action.review_dismissed=@%[1]s отклонена поÑледнÑÑ Ñ€ÐµÑ†ÐµÐ½Ð·Ð¸Ñ Ñ %[2]s Ð´Ð»Ñ Ñтого запроÑа на ÑлиÑние. issue.action.ready_for_review=@%[1]s отметил(а) Ñтот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние как готовый к раÑÑмотрению. issue.action.new=@%[1]s Ñоздал(а) #%[2]d. issue.in_tree_path=Ð’ %s: @@ -671,6 +684,8 @@ Biography = О Ñебе Website = Веб-Ñайт Location = МеÑтоположение To = Ðазвание ветви +email_domain_is_not_allowed = Домен адреÑа Ñл. почты %s не разрешён к иÑпользованию. УбедитеÑÑŒ, что он введён правильно или попробуйте другой адреÑ. +username_claiming_cooldown = Это Ð¸Ð¼Ñ Ð¿Ð¾ÐºÐ° не может быть занÑто, Ñ‚.к. Ñрок его защиты ещё не вышел. Его получитÑÑ Ð·Ð°Ð½Ñть поÑле %[1]s. [user] @@ -678,13 +693,13 @@ change_avatar=Изменить изображение профилÑ… joined_on=РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ %s repositories=Репозитории activity=ÐŸÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð°Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ñть -followers_few=%d подпиÑчики +followers_few=%d подпиÑчиков starred=Избранные репозитории watched=ОтÑлеживаемые репозитории code=Код projects=Проекты overview=Обзор -following_few=%d подпиÑки +following_few=%d подпиÑок follow=ПодпиÑатьÑÑ unfollow=ОтпиÑатьÑÑ user_bio=О Ñебе @@ -715,6 +730,7 @@ public_activity.visibility_hint.self_public = Ваша активноÑть ви public_activity.visibility_hint.self_private = Ваша активноÑть видна только вам и админиÑтраторам Ñервера. Изменить. public_activity.visibility_hint.admin_private = Эта активноÑть доÑтупна вам, потому что вы админиÑтратор. Этот пользователь желает, чтобы она оÑталаÑÑŒ чаÑтной. public_activity.visibility_hint.admin_public = Эта активноÑть доÑтупна вÑем, но вы, как админиÑтратор, также видите дейÑÑ‚Ð²Ð¸Ñ Ð² приватных меÑтах. +public_activity.visibility_hint.self_private_profile = Ваша активноÑть видна только вам и админиÑтраторам Ñервера, потому что ваш профиль Ñкрыт. Изменить. [settings] profile=Профиль @@ -736,9 +752,9 @@ uid=UID webauthn=Ð”Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ (ключами безопаÑноÑти) public_profile=Публичный профиль -biography_placeholder=РаÑÑкажите немного о Ñебе! (Можно иÑпользовать Markdown) +biography_placeholder=Кратко раÑÑкажите о Ñебе другим! (Можно иÑпользовать Markdown) location_placeholder=ПуÑть вÑе знают, откуда вы -profile_desc=Как ваш профиль будет отображатьÑÑ Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… пользователей. Ваш оÑновной Ð°Ð´Ñ€ÐµÑ Ñл. почты будет иÑпользоватьÑÑ Ð´Ð»Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ð¹, воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¸ веб-операций Ñ Git. +profile_desc=Ваш профиль password_username_disabled=Ðелокальным пользователÑм запрещено изменение их имени пользователÑ. Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ подробной информации обратитеÑÑŒ к админиÑтратору Ñайта. full_name=Полное Ð¸Ð¼Ñ website=Веб-Ñайт @@ -751,7 +767,7 @@ update_language_success=Язык обновлён. update_profile_success=Ваш профиль уÑпешно обновлён. change_username=Ваше Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ñ‹Ð»Ð¾ изменено. change_username_prompt=Обратите внимание: изменение имени Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ‚Ð°ÐºÐ¶Ðµ менÑет URL вашей учётной запиÑи. -change_username_redirect_prompt=Старое Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±ÑƒÐ´ÐµÑ‚ перенаправлÑть на новое до тех пор, пока его не займут. +change_username_redirect_prompt=Старое Ð¸Ð¼Ñ Ð±ÑƒÐ´ÐµÑ‚ перенаправлÑть на новое до тех пор, пока оно не будет занÑто. continue=Далее cancel=Отмена language=Язык @@ -795,15 +811,15 @@ old_password=Текущий пароль new_password=Ðовый пароль retype_new_password=Подтверждение нового Ð¿Ð°Ñ€Ð¾Ð»Ñ password_incorrect=Текущий пароль неправильный. -change_password_success=Ваш пароль был изменён. С Ñтого момента необходимо иÑпользовать новый пароль Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð°. +change_password_success=Ваш пароль был изменён. Теперь при входе иÑпользуйте новый. password_change_disabled=Ðелокальные учётные запиÑи не могут изменить пароль в веб-интерфейÑе Forgejo. emails=ÐдреÑа Ñл. почты manage_emails=Управление адреÑами Ñл. почты -manage_themes=Тема по умолчанию +manage_themes=Тема интерфейÑа manage_openid=ÐдреÑа OpenID email_desc=Ваш оÑновной Ð°Ð´Ñ€ÐµÑ Ñл. почты будет иÑпользоватьÑÑ Ð´Ð»Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ð¹, воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¸, еÑли он не Ñкрыт, Ð´Ð»Ñ Ð´ÐµÐ¹Ñтвий Ñ Git в веб-интерфейÑе. -theme_desc=Это будет темой по умолчанию Ð´Ð»Ñ Ð²Ñего Ñайта. +theme_desc=Эта тема Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð¿Ñ€Ð¸ входе на Ñайт под Ñтой учётной запиÑью. primary=ОÑновной activated=Ðктивирован requires_activation=ТребуетÑÑ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ @@ -931,7 +947,7 @@ select_permissions=Выбрать Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ permission_no_access=Ðет доÑтупа permission_read=Чтение permission_write=Чтение и запиÑÑŒ -access_token_desc=Выбранные облаÑти дейÑÑ‚Ð²Ð¸Ñ Ñ‚Ð¾ÐºÐµÐ½Ð° ограничивают авторизацию только ÑоответÑтвующими маршрутами API. Читайте документацию Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации. +access_token_desc=Выбранные облаÑти дейÑÑ‚Ð²Ð¸Ñ Ñ‚Ð¾ÐºÐµÐ½Ð° ограничивают его иÑпользование до ÑоответÑтвующих маршрутов API. Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¾Ñтей ознакомьтеÑÑŒ Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸ÐµÐ¹ . at_least_one_permission=Ðеобходимо выбрать Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ одно разрешение Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ‚Ð¾ÐºÐµÐ½Ð° permissions_list=РазрешениÑ: @@ -939,7 +955,7 @@ manage_oauth2_applications=Управление приложениÑми OAuth2 edit_oauth2_application=Изменить приложение OAuth2 oauth2_applications_desc=ÐŸÑ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ OAuth2 позволÑет Ñтороннему приложению к безопаÑно аутентифицировать пользователей данной уÑтановки Forgejo. remove_oauth2_application=Удаление Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ OAuth2 -remove_oauth2_application_desc=Удаление Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ OAuth2 отменит доÑтуп ко вÑем подпиÑанным токенам доÑтупа. Продолжить? +remove_oauth2_application_desc=Удаление Ñтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ доÑтуп ко вÑем подпиÑанным токенам доÑтупа. Продолжить? remove_oauth2_application_success=Приложение было уÑпешно удалено. create_oauth2_application=Создать новое приложение OAuth2 create_oauth2_application_button=Создать приложение @@ -950,8 +966,8 @@ oauth2_redirect_uris=URI перенаправлений. Размещайте UR save_application=Сохранить oauth2_client_id=ИД клиента oauth2_client_secret=КлиентÑкий ключ -oauth2_regenerate_secret=Сгенерировать новый ключ -oauth2_regenerate_secret_hint=ПотерÑли Ñвой ключ? +oauth2_regenerate_secret=Создать новый +oauth2_regenerate_secret_hint=Ключ был утерÑн? oauth2_client_secret_hint=Секрет не будет показан поÑле того, как вы покинете или обновите Ñтраницу. УбедитеÑÑŒ, что вы его надёжно Ñохранили. oauth2_application_edit=Изменить oauth2_application_create_description=ÐŸÑ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ OAuth2 предоÑтавлÑет Ñтороннему приложению доÑтуп к учётным запиÑÑм пользователей данного ÑервиÑа. @@ -1018,33 +1034,63 @@ visibility=ВидимоÑть Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ visibility.public=Публичный visibility.public_tooltip=Виден вÑем, кто может открыть Ñтот Ñайт visibility.limited=Ограниченный -visibility.limited_tooltip=Виден только зарегиÑтрированным пользователÑм Ñайта -visibility.private=ЧаÑтный +visibility.limited_tooltip=Виден только зарегиÑтрированным пользователÑм +visibility.private=Скрытый visibility.private_tooltip=Виден только учаÑтникам организаций, в которых вы ÑоÑтоите blocked_users_none = Заблокированных пользователей нет. user_block_success = Пользователь заблокирован. oauth2_application_locked = Forgejo предварительно региÑтрирует некоторые Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ OAuth2 при запуÑке, еÑли Ñто включено в конфигурации. Ð”Ð»Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°Ð½Ð¸Ñ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¸Ñ… Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐ´Ð°Ð»Ñть или редактировать. ОзнакомитьÑÑ Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¾ÑÑ‚Ñми можно в документации OAuth2. hooks.desc = Добавьте веб-хуки, которые будут Ñрабатывать во вÑех ваших репозиториÑÑ…. webauthn_alternative_tip = Возможно, Ñтоит наÑтроить дополнительный метод аутентификации. -blocked_since = Заблокирован Ñ %s +blocked_since = Заблокирован %s user_unblock_success = Пользователь разблокирован. twofa_scratch_token_regenerated = Ваш одноразовый ключ воÑÑтановлениÑ: %s. Сохраните его в надёжном меÑте. Больше он показан не будет. blocked_users = Заблокированные пользователи -keep_email_private_popup = Ваш Ð°Ð´Ñ€ÐµÑ Ñл. почты будет Ñкрыт из профилÑ. Он больше не будет иÑпользоватьÑÑ Ð¿Ð¾ умолчанию Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð¾Ð², Ñделанных из веб-интерфейÑа, таких как загрузки и Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² и не будет иÑпользоватьÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð¾Ð² запроÑов на ÑлиÑние. ВмеÑто него можно будет иÑпользовать Ñпециальный Ð°Ð´Ñ€ÐµÑ %s, чтобы приÑваивать коммиты Ñ Ð²Ð°ÑˆÐ¸Ð¼ аккаунтом. Обратите внимание на то, что изменение данной наÑтройки не повлиÑет на ÑущеÑтвующие коммиты. +keep_email_private_popup = Ваш Ð°Ð´Ñ€ÐµÑ Ñл. почты не будет видим в профиле и не будет иÑпользован по умолчанию Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð¾Ð² из веб-интерфейÑа, таких как загрузка и редактирование файлов, а также Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð¾Ð² ÑлиÑний. ВмеÑто него Ð´Ð»Ñ ÑвÑзи коммитов Ñ ÑƒÑ‡. запиÑью можно иÑпользовать Ñпециальный Ð°Ð´Ñ€ÐµÑ %s. Изменение данной наÑтройки не изменит Ð°Ð´Ñ€ÐµÑ Ð² ÑущеÑтвующих коммитах. oauth2_confidential_client = Конфиденциальный клиент. Выберите Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ð¹, хранÑщих Ñекрет в тайне, например, Ð´Ð»Ñ Ð²ÐµÐ±-приложений. Ðе выбирайте Ð´Ð»Ñ Ð½Ð°Ñ‚Ð¸Ð²Ð½Ñ‹Ñ… приложений, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐŸÐš или Ñмартфонов. change_password = Изменение Ð¿Ð°Ñ€Ð¾Ð»Ñ 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 = Ðе указаны -language.title = Язык по умолчанию +language.title = Язык интерфейÑа keep_activity_private.description = Ваша Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð°Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ñть будет видна только вам и админиÑтраторам Ñервера. language.description = Выбранный Ñзык будет Ñохранён в вашей уч. запиÑи и будет иÑпользован по умолчанию поÑле входа. language.localization_project = Помогите Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ð¾Ð¼ Forgejo на Ñвой Ñзык! Подробнее. +user_block_yourself = ÐÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ ÑебÑ. +pronouns_custom_label = Другие меÑÑ‚Ð¾Ð¸Ð¼ÐµÐ½Ð¸Ñ +change_username_redirect_prompt.with_cooldown.one = Прежнее Ð¸Ð¼Ñ Ð±ÑƒÐ´ÐµÑ‚ доÑтупно Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ пользователÑм поÑле иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ в %[1]d день. Ð’Ñ‹ Ñможете вернуть его Ñебе во Ð²Ñ€ÐµÐ¼Ñ Ñрока защиты. +change_username_redirect_prompt.with_cooldown.few = Прежнее Ð¸Ð¼Ñ Ð±ÑƒÐ´ÐµÑ‚ доÑтупно Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ пользователÑм поÑле иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ в %[1]d дней. Ð’Ñ‹ Ñможете вернуть его Ñебе во Ð²Ñ€ÐµÐ¼Ñ Ñрока защиты. +keep_pronouns_private = Показывать меÑÑ‚Ð¾Ð¸Ð¼ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ зарегиÑтрированным пользователÑм +keep_pronouns_private.description = МеÑÑ‚Ð¾Ð¸Ð¼ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ Ñкрыты от пользователей, не имеющих учётных запиÑей на Ñервере. +quota.applies_to_user = Эти Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð° применÑÑŽÑ‚ÑÑ Ðº вашей учётной запиÑи +quota.applies_to_org = Эти Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð° применÑÑŽÑ‚ÑÑ Ðº Ñтой организации +quota.sizes.repos.public = ОбщедоÑтупные репозитории +storage_overview = ИÑпользование меÑта +quota = ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð° +quota.rule.exceeded = Превышено +quota.rule.exceeded.helper = Суммарный объём объектов в Ñтом правиле превыÑил допуÑтимый. +quota.rule.no_limit = Ðеограниченно +quota.sizes.all = Ð’ÑÑ‘ +quota.sizes.repos.all = Репозитории +quota.sizes.repos.private = ЧаÑтные репозитории +quota.sizes.git.all = Содержимое Git +quota.sizes.git.lfs = Git LFS +quota.sizes.wiki = Вики +quota.sizes.assets.packages.all = Пакеты +quota.sizes.assets.all = Объекты +quota.sizes.assets.attachments.all = Ð’Ñе прикреплённые файлы +quota.sizes.assets.attachments.releases = Файлы выпуÑков +quota.sizes.assets.attachments.issues = Файлы задач +quota.sizes.assets.artifacts = Ðртефакты +regenerate_token = Заменить +access_token_regeneration_desc = Будет Ñоздан новый токен, предыдущий будет отозван. Вам потребуетÑÑ Ð·Ð°Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ токен в приложениÑÑ…, иÑпользующих его. Это дейÑтвие Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ. Продолжить? +regenerate_token_success = Токен был заменён. ПриложениÑ, иÑпользующие его, более не имеют доÑтупа к Ñтой учётной запиÑи и должны получить новый токен. +access_token_regeneration = Замена токена доÑтупа [repo] owner=Владелец @@ -1055,11 +1101,11 @@ repo_size=Размер Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ size_format = `%[1]s: %[2]s; %[3]s: %[4]s` template=Шаблон template_select=Выберите шаблон -template_helper=Сделать репозиторий шаблоном +template_helper=Пометить репозиторий как шаблон template_description=Шаблонные репозитории дают возможноÑть пользователÑм Ñоздавать новые репозитории Ñ Ñ‚Ð¾Ð¹ же Ñтруктурой каталогов, файлами и дополнительными наÑтройками. visibility=ВидимоÑть -visibility_description=Это увидÑÑ‚ только владелец организации или учаÑтники при наличии прав. -visibility_helper=Сделать репозиторий приватным +visibility_description=Он будет видим только владельцу организации и её учаÑтникам при наличии прав. +visibility_helper=ЧаÑтный репозиторий visibility_helper_forced=ÐдминиÑтратор Ñайта наÑтроил параметр видимоÑти новых репозиториев. Репозиторий приватный по умолчанию. visibility_fork_helper=(Это изменит видимоÑть вÑех ответвлений.) clone_helper=Ðужна помощь в клонировании? ПоÑетите Ñтраницу помощи. @@ -1081,16 +1127,16 @@ repo_desc=ОпиÑание repo_desc_helper=Добавьте краткое опиÑание (необÑзательно) repo_lang=Язык repo_gitignore_helper=Выберите шаблоны .gitignore -repo_gitignore_helper_desc=Выберите из ÑпиÑка шаблонов Ð´Ð»Ñ Ð¿Ð¾Ð¿ÑƒÐ»Ñрных Ñзыков , какие файлы не надо отÑлеживать. По умолчанию в .gitignore включены типичные артефакты, Ñоздаваемые инÑтрументами Ñборки каждого Ñзыка. +repo_gitignore_helper_desc=Выберите шаблоны из ÑпиÑка Ð´Ð»Ñ Ð¿Ð¾Ð¿ÑƒÐ»Ñрных Ñзыков. .gitignore определÑет, какие файлы не надо отÑлеживать в проекте. По умолчанию в него включены типичные артефакты, Ñоздаваемые инÑтрументами Ñборки каждого Ñзыка. issue_labels=Метки issue_labels_helper=Выберите набор меток license=Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ license_helper=Выберите лицензию -license_helper_desc=Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñет, что другие люди могут, а что не могут делать Ñ Ð²Ð°ÑˆÐ¸Ð¼ кодом. Ðе уверены, ÐºÐ°ÐºÐ°Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Ð¿Ð¾Ð´Ñ…Ð¾Ð´Ð¸Ñ‚ Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ проекта? Смотрите Выберите лицензию. +license_helper_desc=Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñет, что другие могут и не могут делать Ñ Ð²Ð°ÑˆÐ¸Ð¼ кодом. Ðе знаете, ÐºÐ°ÐºÐ°Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Ð¿Ð¾Ð´Ð¾Ð¹Ð´Ñ‘Ñ‚ Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ проекта? ОзнакомьтеÑÑŒ Ñ Ð’Ñ‹Ð±Ð¾Ñ€Ð¾Ð¼ лицензии. readme=README readme_helper=Выберите шаблон README readme_helper_desc=Это меÑто, где вы можете напиÑать подробное опиÑание вашего проекта. -auto_init=Инициализировать репозиторий (ДобавлÑет .gitignore, LICENSE and README) +auto_init=Инициализировать репозиторий trust_model_helper=Выберите модель Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ подпиÑи. Возможные варианты: trust_model_helper_collaborator=СоучаÑтник: доверÑть подпиÑÑм ÑоучаÑтников trust_model_helper_committer=Ðвтор коммита: доверÑть подпиÑÑм, ÑоответÑтвующим авторам коммитов @@ -1122,7 +1168,7 @@ forks=ÐžÑ‚Ð²ÐµÑ‚Ð²Ð»ÐµÐ½Ð¸Ñ reactions_more=и ещё %d unit_disabled=ÐдминиÑтратор Ñайта отключил Ñтот раздел репозиториÑ. language_other=Разное -adopt_search=Введите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка неутверждённых репозиториев... (оÑтавьте пуÑтым, чтобы найти вÑе) +adopt_search=Введите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка неутверждённых репозиториев… (оÑтавьте пуÑтым, чтобы найти вÑе) adopt_preexisting_label=ПринÑтые файлы adopt_preexisting=ПринÑть уже ÑущеÑтвующие файлы adopt_preexisting_content=Создать репозиторий из %s @@ -1159,8 +1205,8 @@ template.issue_labels=Метки задач template.one_item=Ðеобходимо выбрать Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один Ñлемент шаблона template.invalid=Ðеобходимо выбрать шаблон Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ -archive.issue.nocomment=Этот репозиторий в архиве. Ð’Ñ‹ не можете комментировать задачи. -archive.pull.nocomment=Это репозиторий в архиве. Ð’Ñ‹ не можете комментировать запроÑÑ‹ на ÑлиÑние. +archive.issue.nocomment=Этот репозиторий архивирован. Комментирование в задачах невозможно. +archive.pull.nocomment=Этот репозиторий архивирован. Комментирование в запроÑах ÑлиÑний невозможно. form.reach_limit_of_creation_1=ДоÑтигнуто ограничение на количеÑтво репозиториев: %d. form.reach_limit_of_creation_n=ДоÑтигнуто ограничение на количеÑтво репозиториев: %d. @@ -1186,7 +1232,7 @@ migrate_items_releases=ВыпуÑки migrate_repo=ÐŸÐµÑ€ÐµÐ½Ð¾Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ migrate.clone_address=ÐŸÐµÑ€ÐµÐ½Ð¾Ñ / Клонирование по URL migrate.clone_address_desc=HTTP/HTTPS или Git Ð°Ð´Ñ€ÐµÑ ÑущеÑтвующего Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ -migrate.github_token_desc=Ð’Ñ‹ можете помеÑтить один или неÑколько токенов, разделенных запÑтыми, чтобы уÑкорить миграцию, обходом ограничений ÑкороÑти API GitHub. ПРЕДУПРЕЖДЕÐИЕ: злоупотребление Ñтой функцией может нарушить политику поÑтавщика уÑлуг и привеÑти к блокировке учётной запиÑи. +migrate.github_token_desc=Ð’Ñ‹ можете указать один или неÑколько разделенных запÑтыми токенов, чтобы уÑкорить Ð¿ÐµÑ€ÐµÐ½Ð¾Ñ Ð·Ð° Ñчёт обхода ограничений чаÑтоты обращений к API GitHub. ПРЕДУПРЕЖДЕÐИЕ: злоупотребление Ñтой функцией может нарушить уÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð¾ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÑлуг и привеÑти к блокировке учётной запиÑи. migrate.clone_local_path=или локальный путь на Ñервере migrate.permission_denied=У Ð²Ð°Ñ Ð½ÐµÑ‚ прав на импорт локальных репозиториев. migrate.permission_denied_blocked=Ð’Ñ‹ не можете импортировать Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰Ñ‘Ð½Ð½Ñ‹Ñ… хоÑтов, пожалуйÑта, попроÑите админиÑтратора проверить наÑтройки ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS. @@ -1197,9 +1243,9 @@ migrate.migrate_items_options=Токен доÑтупа необходим дл migrated_from=ПеренеÑено из %[2]s migrated_from_fake=ПеренеÑено из %[1]s migrate.migrate=ÐŸÐµÑ€ÐµÐ½Ð¾Ñ Ð¸Ð· %s -migrate.migrating=ÐŸÐµÑ€ÐµÐ½Ð¾Ñ Ð¸Ð· %s... +migrate.migrating=ÐŸÐµÑ€ÐµÐ½Ð¾Ñ Ð¸Ð· %s… migrate.migrating_failed=ÐŸÐµÑ€ÐµÐ½Ð¾Ñ Ð¸Ð· %s не удалÑÑ. -migrate.migrating_failed.error=Ðе удалоÑÑŒ мигрировать: %s +migrate.migrating_failed.error=Ðе удалоÑÑŒ перенеÑти: %s migrate.migrating_failed_no_addr=ÐŸÐµÑ€ÐµÐ½Ð¾Ñ Ð½Ðµ удалÑÑ. migrate.github.description=ПеренеÑите данные Ñ github.com или Ñервера GitHub Enterprise. migrate.git.description=ПеренеÑти только репозиторий из любого Git ÑервиÑа. @@ -1217,7 +1263,7 @@ migrate.migrating_releases=ÐŸÐµÑ€ÐµÐ½Ð¾Ñ Ð²Ñ‹Ð¿ÑƒÑков migrate.migrating_issues=ÐŸÐµÑ€ÐµÐ½Ð¾Ñ Ð·Ð°Ð´Ð°Ñ‡ migrate.migrating_pulls=ÐŸÐµÑ€ÐµÐ½Ð¾Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов на ÑлиÑние migrate.cancel_migrating_title=Отменить Ð¿ÐµÑ€ÐµÐ½Ð¾Ñ -migrate.cancel_migrating_confirm=Ð’Ñ‹ хотите отменить Ñту миграцию? +migrate.cancel_migrating_confirm=Ð’Ñ‹ хотите отменить переноÑ? mirror_from=зеркало из forked_from=ответвлён от @@ -1290,6 +1336,7 @@ view_git_blame=Показать git blame video_not_supported_in_browser=Ваш браузер не поддерживает Ñ‚Ñг HTML5 «video». audio_not_supported_in_browser=Ваш браузер не поддерживает Ñ‚Ñг HTML5 «audio». stored_lfs=ХранитÑÑ Git LFS +stored_annex=ХранитÑÑ Git Annex symbolic_link=СимволичеÑÐºÐ°Ñ ÑÑылка executable_file=ИÑполнÑемый файл commit_graph=Граф коммитов @@ -1313,6 +1360,7 @@ editor.upload_file=Загрузить файл editor.edit_file=Редактировать файл editor.preview_changes=ПроÑмотр изменений editor.cannot_edit_lfs_files=LFS файлы невозможно редактировать в веб-интерфейÑе. +editor.cannot_edit_annex_files=Annex файлы невозможно редактировать в веб-интерфейÑе. editor.cannot_edit_non_text_files=Двоичные файлы Ð½ÐµÐ»ÑŒÐ·Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ в веб-интерфейÑе. editor.edit_this_file=Редактировать файл editor.this_file_locked=Файл заблокирован @@ -1327,7 +1375,7 @@ editor.or=или editor.cancel_lower=Отменить editor.commit_signed_changes=ЗафикÑировать подпиÑанные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ editor.commit_changes=Сохранить правки -editor.add_tmpl=Добавить «» +editor.add_tmpl=Добавить «<%s>» editor.add=Добавить %s editor.update=Обновить %s editor.delete=Удалить %s @@ -1337,8 +1385,8 @@ editor.fail_to_apply_patch=Ðевозможно применить патч «%s editor.new_patch=ÐÐ¾Ð²Ð°Ñ Ð¿Ñ€Ð°Ð²ÐºÐ° editor.commit_message_desc=Добавьте необÑзательное раÑширенное опиÑание… editor.signoff_desc=Добавить трейлер Signed-off-by Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¾Ð¼ коммита в конце ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð°. -editor.commit_directly_to_this_branch=Сделайте коммит напрÑмую в ветвь %s. -editor.create_new_branch=Создайте новую ветвь Ð´Ð»Ñ Ñтого коммита, и Ñделайте Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние. +editor.commit_directly_to_this_branch=Сохранить коммит напрÑмую в ветвь %[1]s. +editor.create_new_branch=Сохранить коммит в новую ветвь и начать Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние. editor.create_new_branch_np=Создать новую ветвь Ð´Ð»Ñ Ñтого коммита. editor.propose_file_change=Предложить изменение файла editor.new_branch_name=Укажите название новой ветви Ð´Ð»Ñ Ñтого коммита @@ -1353,7 +1401,7 @@ editor.file_is_a_symlink=`«%s» ÑвлÑетÑÑ ÑимволичеÑкой Ñ editor.filename_is_a_directory=Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° «%s» уже иÑпользуетÑÑ Ð² качеÑтве каталога в Ñтом репозитории. editor.file_editing_no_longer_exists=Редактируемый файл «%s» больше не ÑущеÑтвует в Ñтом репозитории. editor.file_deleting_no_longer_exists=УдалÑемый файл «%s» больше не ÑущеÑтвует в Ñтом репозитории. -editor.file_changed_while_editing=Содержимое файла изменилоÑÑŒ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° начала редактированиÑ. Ðажмите здеÑÑŒ, чтобы увидеть, что было изменено, или ЗафикÑировать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñнова, чтобы заменить их. +editor.file_changed_while_editing=Содержимое файла изменилоÑÑŒ поÑле того, как он был открыт. ОзнакомьтеÑÑŒ Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð¾ÑˆÐµÐ´ÑˆÐ¸Ð¼Ð¸ изменениÑми или Ñохраните ещё раз, чтобы перезапиÑать их. editor.file_already_exists=Файл Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¼ «%s» уже ÑущеÑтвует в Ñтом репозитории. editor.commit_empty_file_header=Закоммитить пуÑтой файл editor.commit_empty_file_text=Файл, который вы ÑобираетеÑÑŒ зафикÑировать, пуÑÑ‚. Продолжить? @@ -1406,7 +1454,7 @@ commitstatus.failure=Ðеудача commitstatus.pending=Ожидание commitstatus.success=УÑпешно -ext_issues=ДоÑтуп ко внешним задачам +ext_issues=Внешние задачи ext_issues.desc=СÑылка на внешнюю ÑиÑтему отÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð´Ð°Ñ‡. projects=Проекты @@ -1587,9 +1635,9 @@ issues.no_content=ОпиÑание отÑутÑтвует. issues.close=Закрыть задачу issues.comment_pull_merged_at=коммит %[1]s был добавлен в %[2]s %[3]s issues.comment_manually_pull_merged_at=коммит %[1]s был вручную добавлен в %[2]s %[3]s -issues.close_comment_issue=Прокомментировать и закрыть +issues.close_comment_issue=Закрыть комментарием issues.reopen_issue=Открыть Ñнова -issues.reopen_comment_issue=Прокомментировать и открыть Ñнова +issues.reopen_comment_issue=Открыть Ñнова комментарием issues.create_comment=Комментировать issues.closed_at=`задача была закрыта %[2]s` issues.reopened_at=`задача была открыта Ñнова %[2]s` @@ -1614,9 +1662,9 @@ issues.role.first_time_contributor_helper=Это первое учаÑтие п issues.role.contributor=Соавтор issues.re_request_review=Повторить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° отзыв issues.is_stale=Со времени Ñтого обзора в Ñтот PR были внеÑены некоторые Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ -issues.remove_request_review=Удалить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° отзыв -issues.remove_request_review_block=Ðевозможно удалить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° отзыв -issues.dismiss_review=Отклонить отзыв +issues.remove_request_review=Отменить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñ€ÐµÑ†ÐµÐ½Ð·Ð¸Ð¸ +issues.remove_request_review_block=Ðе удалоÑÑŒ отменить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñ€ÐµÑ†ÐµÐ½Ð·Ð¸Ð¸ +issues.dismiss_review=Отклонить рецензию issues.dismiss_review_warning=Ð’Ñ‹ уверены, что хотите отклонить Ñту рецензию? issues.sign_in_require_desc=Войдите, чтобы приÑоединитьÑÑ Ðº обÑуждению. issues.edit=Изменить @@ -1648,7 +1696,7 @@ issues.num_participants_few=%d учаÑтников issues.attachment.open_tab=`Ðажмите, чтобы поÑмотреть «%s» в новой вкладке` issues.attachment.download=`Ðажмите, чтобы Ñкачать «%s»` issues.subscribe=ПодпиÑатьÑÑ -issues.unsubscribe=ОтказатьÑÑ Ð¾Ñ‚ подпиÑки +issues.unsubscribe=ОтпиÑатьÑÑ issues.unpin_issue=Открепить задачу issues.max_pinned=ÐÐµÐ»ÑŒÐ·Ñ Ð·Ð°ÐºÑ€ÐµÐ¿Ð¸Ñ‚ÑŒ больше задач issues.pin_comment=закрепил(а) Ñту задачу %s @@ -1702,15 +1750,15 @@ issues.error_modifying_due_date=Ðе удалоÑÑŒ изменить Ñрок в issues.error_removing_due_date=Ðе удалоÑÑŒ убрать Ñрок выполнениÑ. issues.push_commit_1=добавлен %d коммит %s issues.push_commits_n=добавлены %d коммита(ов) %s -issues.force_push_codes=`форÑированное обновление изменений %[1]s %[4]s вмеÑто %[2]s %[6]s` +issues.force_push_codes=`форÑированное обновление изменений %[1]s %[4]s вмеÑто %[2]s %[6]s` issues.force_push_compare=Сравнить issues.due_date_form=гггг-мм-дд issues.due_date_form_add=Добавить Ñрок Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ issues.due_date_form_edit=Изменить issues.due_date_form_remove=Удалить issues.due_date_not_set=Срок Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ уÑтановлен. -issues.due_date_added=добавлен Ñрок Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ %s %s -issues.due_date_modified=Ñрок Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ´Ð²Ð¸Ð½ÑƒÑ‚ Ñ %[2]s на %[1]s %[3]s +issues.due_date_added=добавлен Ñрок Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ â€“ %s, %s +issues.due_date_modified=Ñрок Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½Ñ‘Ð½ Ñ %[2]s на %[1]s %[3]s issues.due_date_remove=убран Ñрок Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ %s %s issues.due_date_overdue=ПроÑроченные issues.due_date_invalid=Срок Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½ÐµÐ´ÐµÐ¹Ñтвителен или находитÑÑ Ð·Ð° пределами допуÑтимого диапазона. ПожалуйÑта, иÑпользуйте формат «гггг-мм-дд». @@ -1747,17 +1795,17 @@ issues.dependency.add_error_cannot_create_circular=Ð’Ñ‹ не можете Ñоз issues.dependency.add_error_dep_not_same_repo=Обе задачи должны находитьÑÑ Ð² одном репозитории. issues.review.self.approval=Ð’Ñ‹ не можете одобрить ÑобÑтвенный Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние. issues.review.self.rejection=Ðевозможно запрашивать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñвоего запроÑа на ÑлиÑние. -issues.review.approve=одобрил(а) Ñти Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ %s -issues.review.comment=раÑÑмотрел(а) Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ %s -issues.review.dismissed=отклонил(а) отзыв %s %s +issues.review.approve=Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ð´Ð¾Ð±Ñ€ÐµÐ½Ñ‹ %s +issues.review.comment=оÑтавлена Ñ€ÐµÑ†ÐµÐ½Ð·Ð¸Ñ %s +issues.review.dismissed=отклонена Ñ€ÐµÑ†ÐµÐ½Ð·Ð¸Ñ %s %s issues.review.dismissed_label=Отклонено issues.review.left_comment=оÑтавил комментарий issues.review.content.empty=Ð—Ð°Ð¿Ñ€Ð°ÑˆÐ¸Ð²Ð°Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, вы обÑзаны оÑтавить комментарий Ñ Ð¿Ð¾ÑÑнением Ñвоих пожеланий отноÑительно запроÑа на ÑлиÑние. -issues.review.reject=запроÑил(а) Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ %s +issues.review.reject=запрошены Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ %s issues.review.wait=был запрошен Ð´Ð»Ñ Ð¾Ñ‚Ð·Ñ‹Ð²Ð° %s -issues.review.add_review_request=запроÑил(а) отзыв от %s %s -issues.review.remove_review_request=удалил(а )заÑвку на отзыв Ð´Ð»Ñ %s %s -issues.review.remove_review_request_self=отказалÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»Ñть отзыв %s +issues.review.add_review_request=запрошена Ñ€ÐµÑ†ÐµÐ½Ð·Ð¸Ñ Ð¾Ñ‚ %[1]s %[2]s +issues.review.remove_review_request=отменён Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñ€ÐµÑ†ÐµÐ½Ð·Ð¸Ð¸ от %[1]s %[2]s +issues.review.remove_review_request_self=отказ от Ñ€ÐµÑ†ÐµÐ½Ð·Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ %s issues.review.pending=Ожидание issues.review.pending.tooltip=Этот комментарий в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð½Ðµ виден другим пользователÑм. Чтобы отправить отложенные комментарии, выберите «%s» → «%s/%s/%s» в верхней чаÑти Ñтраницы. issues.review.review=Ð ÐµÑ†ÐµÐ½Ð·Ð¸Ñ @@ -1813,8 +1861,8 @@ pulls.nothing_to_compare=Ðечего Ñравнивать, родительÑк pulls.nothing_to_compare_and_allow_empty_pr=Ветви идентичны. Этот PR будет пуÑтым. pulls.has_pull_request=`Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние Ñтих ветвей уже ÑущеÑтвует: %[2]s#%[3]d` pulls.create=Создать Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние -pulls.title_desc_one=хочет влить %[1]d коммит из %[2]s в %[3]s -pulls.title_desc_few=хочет влить %[1]d коммит(ов) из %[2]s в %[3]s +pulls.title_desc_one=хочет влить %[1]d коммит из %[2]s в %[3]s +pulls.title_desc_few=хочет влить %[1]d коммит(ов) из %[2]s в %[3]s pulls.merged_title_desc_one=Ñлит %[1]d коммит из %[2]s в %[3]s %[4]s pulls.merged_title_desc_few=Ñлито %[1]d коммит(ов) из %[2]s в %[3]s %[4]s pulls.change_target_branch_at=`изменил(а) целевую ветвь Ñ %s на %s %s` @@ -1822,7 +1870,7 @@ pulls.tab_conversation=ОбÑуждение pulls.tab_commits=Коммиты pulls.tab_files=Изменённые файлы pulls.reopen_to_merge=ПожалуйÑта, переоткройте Ñтот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑлиÑниÑ. -pulls.cant_reopen_deleted_branch=Этот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние не может быть открыт заново, потому что ветвь была удалена. +pulls.cant_reopen_deleted_branch=Этот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние не может быть открыт повторно, потому что ветвь была удалена. pulls.merged=Слито pulls.merged_success=Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние удовлетворён и закрыт pulls.closed=Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние закрыт @@ -1896,7 +1944,7 @@ pulls.update_branch_rebase=Обновить ветвь перебазирова pulls.update_branch_success=Ветвь уÑпешно обновлена pulls.update_not_allowed=ÐедоÑтаточно прав Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²ÐµÑ‚Ð²Ð¸ pulls.outdated_with_base_branch=Эта ветвь отÑтает от базовой ветви -pulls.close=Закрыть Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние +pulls.close=Закрыть Ð·Ð°Ð¿Ñ€Ð¾Ñ ÑлиÑÐ½Ð¸Ñ pulls.closed_at=`закрыл Ñтот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние %[2]s` pulls.reopened_at=`переоткрыл Ñтот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние %[2]s` pulls.cmd_instruction_hint=Показать инÑтрукции Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð¹ Ñтроки @@ -1918,7 +1966,7 @@ pulls.auto_merge_newly_scheduled_comment=`запланировал Ñтот за pulls.auto_merge_canceled_schedule_comment=`отменил автоматичеÑкое ÑлиÑние Ñтого запроÑа поÑле Ð¿Ñ€Ð¾Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð²Ñех проверок %[1]s` pulls.delete.title=Удалить Ñтот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние? -pulls.delete.text=Ð’Ñ‹ точно хотите удалить Ñтот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние? (Это навÑегда удалит вÑÑ‘ его Ñодержимое. Возможно, лучше закрыть его в архивных целÑÑ…) +pulls.delete.text=Ð’Ñ‹ точно хотите удалить Ñтот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние? (Это навÑегда удалит вÑÑ‘ его Ñодержимое. Возможно, будет лучше закрыть его в архивных целÑÑ…) pull.deleted_branch=(удалена):%s @@ -1964,7 +2012,7 @@ signing.wont_sign.commitssigned=СлиÑние не будет подпиÑан signing.wont_sign.approved=СлиÑние не будет подпиÑано, так как Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние не одобрен. signing.wont_sign.not_signed_in=Ð’Ñ‹ не вошли в ÑиÑтему. -ext_wiki=ДоÑтуп ко внешней вики +ext_wiki=ВнешнÑÑ Ð²Ð¸ÐºÐ¸ ext_wiki.desc=СÑылка на внешнюю вики. wiki=Вики @@ -2059,8 +2107,7 @@ activity.git_stats_and_deletions=и activity.git_stats_deletion_1=%d удаление activity.git_stats_deletion_n=%d удалений -contributors.contribution_type.commits=коммитов - +contributors.contribution_type.commits = Коммиты search=ПоиÑк search.search_repo=ПоиÑк по репозиторию search.type.tooltip=Тип поиÑка @@ -2088,7 +2135,7 @@ settings.mirror_settings=Зеркалирование 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.pull_mirror_warning=Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñто можно Ñделать только в меню «ÐÐ¾Ð²Ð°Ñ Ð¼Ð¸Ð³Ñ€Ð°Ñ†Ð¸Ñ». Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации, пожалуйÑта, ознакомьтеÑÑŒ: +settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning=Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñто можно Ñделать только через меню «Выполнить переноÑ». Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации, пожалуйÑта, ознакомьтеÑÑŒ: settings.mirror_settings.docs.disabled_push_mirror.info=Push-зеркала отключены админиÑтратором Ñайта. settings.mirror_settings.docs.no_new_mirrors=Ваш репозиторий зеркалирует Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² другой репозиторий или из него. ПожалуйÑта, имейте в виду, что в данный момент невозможно Ñоздавать новые зеркала. settings.mirror_settings.docs.can_still_use=Ð¥Ð¾Ñ‚Ñ Ð²Ñ‹ не можете изменÑть ÑущеÑтвующие зеркала или Ñоздавать новые, вы можете по-прежнему иÑпользовать ÑущеÑтвующее зеркало. @@ -2127,7 +2174,7 @@ settings.use_external_issue_tracker=ИÑпользовать внешнюю Ñи settings.external_tracker_url=СÑылка на внешнюю ÑиÑтему задач settings.external_tracker_url_error=URL внешнего баг-трекера не ÑвлÑетÑÑ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ñ‹Ð¼ URL. settings.external_tracker_url_desc=ПоÑетители будут перенаправлены по указанному адреÑу трекера задач при открытии вкладки. -settings.tracker_url_format=Формат ÑÑылки внешней ÑиÑтемы задач +settings.tracker_url_format=Формат ÑÑылок внешней ÑиÑтемы задач settings.tracker_url_format_error=Формат URL внешнего баг-трекера некорректен. settings.tracker_issue_style=Формат нумерации во внешней ÑиÑтеме задач settings.tracker_issue_style.numeric=Цифровой @@ -2136,7 +2183,7 @@ settings.tracker_issue_style.regexp=РегулÑрное выражение settings.tracker_issue_style.regexp_pattern=Шаблон регулÑрного Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ settings.tracker_issue_style.regexp_pattern_desc=ВмеÑто {index} будет иÑпользоватьÑÑ Ð¿ÐµÑ€Ð²Ð°Ñ Ð·Ð°Ñ…Ð²Ð°Ñ‡ÐµÐ½Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°. settings.tracker_url_format_desc=Ð’Ñ‹ можете иÑпользовать шаблоны {user}, {repo} и {index} Ð´Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸ пользователÑ, Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð¸ номера задачи. -settings.enable_timetracker=Включить отÑлеживание времени +settings.enable_timetracker=Счётчик времени settings.allow_only_contributors_to_track_time=ПодÑчитывать Ð²Ñ€ÐµÐ¼Ñ Ð¼Ð¾Ð³ÑƒÑ‚ только Ñоавторы settings.pulls_desc=Включить запроÑÑ‹ ÑлиÑний settings.pulls.ignore_whitespace=Игнорировать незначащие Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ (пробелы, табулÑцию) при проверке ÑлиÑний на конфликты @@ -2149,7 +2196,7 @@ settings.packages_desc=Включить рееÑтр пакетов settings.projects_desc=Включить проекты settings.actions_desc=Включить интеграцию конвейеров CI/CD Ñ Forgejo Actions settings.admin_settings=ÐаÑтройки админиÑтратора -settings.admin_enable_health_check=ПроверÑть целоÑтноÑть данных в Ñтом репозитории (git fsck) +settings.admin_enable_health_check=ВыполнÑть проверки целоÑтноÑти данных (git fsck) settings.admin_code_indexer=ИндекÑатор кода settings.admin_stats_indexer=ИндекÑатор ÑтатиÑтики кода settings.admin_indexer_commit_sha=ПоÑледний индекÑированный коммит @@ -2186,17 +2233,17 @@ settings.transfer_perform=Выполнить передачу settings.transfer_started=Репозиторий ожидает Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ от «%s» settings.transfer_succeed=Репозиторий перенеÑён. settings.signing_settings=ÐаÑтройки проверки подпиÑей -settings.trust_model=Модель Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи -settings.trust_model.default=Модель Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ Ð¿Ð¾ умолчанию -settings.trust_model.default.desc=ИÑпользовать Ñтандартную модель Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ Ñтой уÑтановки. +settings.trust_model=Факторы Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑм +settings.trust_model.default=Фактор Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ Ð¿Ð¾ умолчанию +settings.trust_model.default.desc=ИÑпользовать фактор Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ Ð¿Ð¾ умолчанию, иÑпользуемый на Ñтом Ñервере. settings.trust_model.collaborator=СоучаÑтник settings.trust_model.collaborator.long=СоучаÑтник: доверÑть подпиÑÑм ÑоучаÑтников settings.trust_model.collaborator.desc=ДейÑтвительные подпиÑи ÑоучаÑтников Ñтого Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ помечены как «доверенные» (незавиÑимо от того, ÑоответÑтвуют ли они автору коммита). Ð’ оÑтальных ÑлучаÑÑ… дейÑтвительные подпиÑи будут помечены как «недоверенные», еÑли подпиÑÑŒ ÑоответÑтвует автору коммита, и «не Ñовпадающие», еÑли нет. -settings.trust_model.committer=Коммитер -settings.trust_model.committer.long=Коммитер: доверÑть подпиÑÑм, ÑоответÑтвующим коммитерам (ÑоответÑтвует GitHub и требует коммиты, подпиÑанные Forgejo, иметь Forgejo в качеÑтве коммитера) +settings.trust_model.committer=Ðвтор коммита +settings.trust_model.committer.long=Ðвтор коммита: доверÑть подпиÑÑм, ÑоответÑтвующим авторам коммитов. Это поведение ÑоответÑтвует GitHub и требует, чтобы коммиты, подпиÑанные Forgejo, имели Forgejo в качеÑтве автора settings.trust_model.committer.desc=ДейÑтвительные подпиÑи будут помечены «доверенными», только еÑли они ÑоответÑтвуют автору коммита, в противном Ñлучае они будут помечены «не Ñовпадающими». Это заÑтавит Forgejo быть автором подпиÑанных коммитов, а фактичеÑкий автор будет обозначен в трейлерах Co-Authored-By: и Co-Committed-By: коммита. Ключ Forgejo по умолчанию должен ÑоответÑтвовать пользователю в базе данных. -settings.trust_model.collaboratorcommitter=СоучаÑтник+Коммитер -settings.trust_model.collaboratorcommitter.long=СоучаÑтник+Коммитер: доверÑть подпиÑÑм ÑоучаÑтников, которые ÑоответÑтвуют автору коммита +settings.trust_model.collaboratorcommitter=СоучаÑтник и автор коммита +settings.trust_model.collaboratorcommitter.long=СоучаÑтник и автор коммита: доверÑть подпиÑÑм ÑоучаÑтников, которые ÑоответÑтвуют автору коммита settings.trust_model.collaboratorcommitter.desc=ДейÑтвительные подпиÑи ÑоучаÑтников Ñтого Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ помечены «доверенными», еÑли они ÑоответÑтвуют автору коммита. ДейÑтвительные подпиÑи будут помечены как «недоверенные», еÑли подпиÑÑŒ ÑоответÑтвует автору коммита, и «не Ñовпадающие» впротивном Ñлучае. Это заÑтавит Forgejo быть отмеченным в качеÑтве автора подпиÑанного коммита, а фактичеÑкий автор будет указан в трейлерах Co-Authored-By: и Co-Committed-By: коммита. Ключ Forgejo по умолчанию должен ÑоответÑтвовать пользователю в базе данных. settings.wiki_delete=Стереть данные вики settings.wiki_delete_desc=Будьте внимательны! Как только вы удалите вики — пути назад не будет. @@ -2239,7 +2286,7 @@ settings.hooks_desc=Веб-хуки позволÑÑŽÑ‚ внешним Ñлужб settings.webhook_deletion=Удаление веб-хука settings.webhook_deletion_desc=Удаление Ñтого веб-хука приведет к удалению вÑей ÑвÑзанной Ñ Ð½Ð¸Ð¼ информации, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¸Ñторию. Хотите продолжить? settings.webhook_deletion_success=Веб-хук был удалён. -settings.webhook.test_delivery=Проверить доÑтавку +settings.webhook.test_delivery=Проверить отправку settings.webhook.test_delivery_desc=Отправить теÑтовое Ñобытие Ð´Ð»Ñ Ñ‚ÐµÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð°Ñтройки веб-хука. settings.webhook.request=Ð—Ð°Ð¿Ñ€Ð¾Ñ settings.webhook.response=Ответ @@ -2253,7 +2300,7 @@ settings.githook_edit_desc=ЕÑли хук не активен, будет по settings.githook_name=Ðазвание хукa settings.githook_content=Содержимое хука settings.update_githook=Обновить хук -settings.add_webhook_desc=Forgejo будет оправлÑть POST-запроÑÑ‹ на указанный URL Ð°Ð´Ñ€ÐµÑ Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ заголовком «Content-Type». ПодробноÑти в инÑтрукции по иÑпользованию веб-хуков. +settings.add_webhook_desc=Forgejo будет оправлÑть POST-запроÑÑ‹ на указанный URL обработчика Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ заголовком «Content-Type». ПодробноÑти доÑтупны в инÑтрукции по иÑпользованию веб-хуков. settings.payload_url=URL обработчика settings.http_method=HTTP-метод settings.content_type=Тип Ñодержимого POST @@ -2264,10 +2311,10 @@ settings.slack_color=Цвет settings.discord_username=Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ settings.discord_icon_url=URL иконки settings.event_desc=Срабатывать на: -settings.event_push_only=Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ +settings.event_push_only=Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ (push) settings.event_send_everything=Ð’Ñе ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ -settings.event_choose=Другие ÑобытиÑ… -settings.event_header_repository=Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ +settings.event_choose=Выбранные ÑобытиÑ… +settings.event_header_repository=Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸ÐµÐ² settings.event_create=Создание settings.event_create_desc=Создание ветвей и тегов. settings.event_delete=Удаление @@ -2283,33 +2330,33 @@ settings.event_push_desc=Отправка изменений в репозито settings.event_repository=Репозиторий settings.event_repository_desc=Создание и удаление репозиториев. settings.event_header_issue=Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð·Ð°Ð´Ð°Ñ‡ -settings.event_issues=Задачи +settings.event_issues=Изменение settings.event_issues_desc=Создание, закрытие, переоткрытие и изменение задач. -settings.event_issue_assign=Ðазначение задач +settings.event_issue_assign=Ðазначение settings.event_issue_assign_desc=Выдача и ÑнÑтие Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ñ‡Ð¸. -settings.event_issue_label=Метки задач -settings.event_issue_label_desc=Изменение и очиÑтка меток задач. -settings.event_issue_milestone=Этапы задач -settings.event_issue_milestone_desc=Добавление задач в Ñтапы и удаление. -settings.event_issue_comment=Комментарии задач +settings.event_issue_label=Метки +settings.event_issue_label_desc=Добавление и удаление меток задач. +settings.event_issue_milestone=Этапы +settings.event_issue_milestone_desc=Добавление задач в Ñтапы, удаление и изменение. +settings.event_issue_comment=Комментарии settings.event_issue_comment_desc=Добавление, изменение и удаление комментариев в задачах. settings.event_header_pull_request=Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов ÑлиÑний -settings.event_pull_request=ЗапроÑÑ‹ ÑлиÑÐ½Ð¸Ñ +settings.event_pull_request=Изменение settings.event_pull_request_desc=Создание, закрытие, переоткрытие и изменение запроÑов ÑлиÑниÑ. -settings.event_pull_request_assign=Ðазначение запроÑов +settings.event_pull_request_assign=Ðазначение settings.event_pull_request_assign_desc=Выдача и ÑнÑтие Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа на ÑлиÑние. -settings.event_pull_request_label=Метки запроÑов ÑлиÑÐ½Ð¸Ñ -settings.event_pull_request_label_desc=Изменение и очиÑтка меток запроÑа ÑлиÑниÑ. -settings.event_pull_request_milestone=Этапы запроÑов ÑлиÑÐ½Ð¸Ñ -settings.event_pull_request_milestone_desc=Добавление запроÑа ÑлиÑÐ½Ð¸Ñ Ð² Ñтап и удаление. -settings.event_pull_request_comment=Комментарии запроÑов на ÑлиÑние +settings.event_pull_request_label=Метки +settings.event_pull_request_label_desc=Добавление и удаление меток запроÑа ÑлиÑниÑ. +settings.event_pull_request_milestone=Этапы +settings.event_pull_request_milestone_desc=Добавление запроÑов ÑлиÑÐ½Ð¸Ñ Ð² Ñтапы, удаление и изменение. +settings.event_pull_request_comment=Комментарии settings.event_pull_request_comment_desc=Добавление, изменение и удаление комментариев в запроÑах на ÑлиÑние. -settings.event_pull_request_review=Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние раÑÑмотрен -settings.event_pull_request_review_desc=Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние утвержден, отклонён или оÑтавлен комментарий. -settings.event_pull_request_sync=Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние Ñинхронизирован -settings.event_pull_request_sync_desc=Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние Ñинхронизирован. -settings.event_pull_request_review_request=Запрошена Ñ€ÐµÑ†ÐµÐ½Ð·Ð¸Ñ Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа на ÑлиÑние -settings.event_pull_request_review_request_desc=Создан или удалён Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° рецензию Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа на ÑлиÑние. +settings.event_pull_request_review=Рецензии +settings.event_pull_request_review_desc=Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² запроÑе ÑлиÑÐ½Ð¸Ñ Ð¾Ð´Ð¾Ð±Ñ€ÐµÐ½Ñ‹, отклонены прокомментированы. +settings.event_pull_request_sync=Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ +settings.event_pull_request_sync_desc=Ветвь Ñинхронизирована Ñ Ñ†ÐµÐ»ÐµÐ²Ð¾Ð¹ ветвью автоматичеÑки. +settings.event_pull_request_review_request=ЗапроÑÑ‹ рецензий +settings.event_pull_request_review_request_desc=Создание и отмена запроÑов рецензий в запроÑах ÑлиÑний. settings.event_pull_request_approvals=ÐžÐ´Ð¾Ð±Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов ÑлиÑний settings.event_pull_request_merge=СлиÑние запроÑа на ÑлиÑние settings.event_package=Пакеты @@ -2318,15 +2365,15 @@ settings.branch_filter=Фильтр ветвей settings.branch_filter_desc=Белый ÑпиÑок ветвей Ð´Ð»Ñ Ñобытий Push, ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²ÐµÑ‚Ð²ÐµÐ¹ и ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð²ÐµÑ‚Ð²ÐµÐ¹, указанных в виде глоб-шаблона. ЕÑли пуÑтой или *, то вÑе Ñобытий Ð´Ð»Ñ Ð²Ñех ветвей будут зарегиÑтрированы. Перейдите по ÑÑылке %[2]s на документацию по ÑинтакÑиÑу. Примеры: master, {master,release*}. settings.authorization_header=Заголовок авторизации settings.authorization_header_desc=Будет включён в качеÑтве заголовка авторизации Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов. Примеры: %s. -settings.active=Ðктивный +settings.active=Ðктивен settings.active_helper=Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ проиÑходÑщих ÑобытиÑÑ… будет отправлÑтьÑÑ Ð½Ð° URL Ñтого веб-хука. settings.add_hook_success=Веб-хук добавлен. settings.update_webhook=Обновить веб-хук settings.update_hook_success=Веб-хук обновлён. settings.delete_webhook=Удалить веб-хук -settings.recent_deliveries=Ðедавние раÑÑылки -settings.hook_type=Тип хука -settings.slack_token=Slack токен +settings.recent_deliveries=Ðедавние отправки +settings.hook_type=Тип веб-хука +settings.slack_token=Токен settings.slack_domain=Домен settings.slack_channel=Канал settings.add_web_hook_desc=Интегрируйте %s Ñ Ñтим репозиторием . @@ -2410,7 +2457,7 @@ settings.protect_branch_name_pattern=Шаблон названий защищё settings.protect_branch_name_pattern_desc=Шаблоны названий защищённых ветвей. О ÑинтакÑиÑе шаблонов читайте в документации. Примеры: main, release/** settings.protect_patterns=Шаблоны settings.protect_protected_file_patterns=Шаблоны защищённых файлов, разделённые точкой Ñ Ð·Ð°Ð¿Ñтой «;» -settings.protect_protected_file_patterns_desc=Защищенные файлы Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ напрÑмую, даже еÑли пользователь имеет право добавлÑть, редактировать или удалÑть файлы в Ñтой ветви. Можно указать неÑколько шаблонов, разделÑÑ Ð¸Ñ… точкой Ñ Ð·Ð°Ð¿Ñтой («;»). О ÑинтакÑиÑе шаблонов читайте в документации github.com/gobwas/glob . Примеры: .drone.yml, /docs/**/*.txt. +settings.protect_protected_file_patterns_desc=Защищенные файлы Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ напрÑмую, даже еÑли пользователь имеет право добавлÑть, редактировать или удалÑть файлы в Ñтой ветви. Можно указать неÑколько шаблонов, разделÑÑ Ð¸Ñ… точкой Ñ Ð·Ð°Ð¿Ñтой («;»). О ÑинтакÑиÑе шаблонов читайте в документации %s . Примеры: .drone.yml, /docs/**/*.txt. settings.protect_unprotected_file_patterns=Шаблоны незащищённых файлов, разделённые точкой Ñ Ð·Ð°Ð¿Ñтой «;» settings.protect_unprotected_file_patterns_desc=Ðезащищенные файлы, которые допуÑкаетÑÑ Ð¸Ð·Ð¼ÐµÐ½Ñть напрÑмую, еÑли пользователь имеет право на запиÑÑŒ, неÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° ограничение отправки изменений. Можно указать неÑколько шаблонов, разделÑÑ Ð¸Ñ… точкой Ñ Ð·Ð°Ð¿Ñтой («;»). О ÑинтакÑиÑе шаблонов читайте в документации %[2]s . Примеры: .drone.yml, /docs/**/*.txt. settings.add_protected_branch=Включить защиту @@ -2454,11 +2501,11 @@ settings.archive.header=ÐÑ€Ñ…Ð¸Ð²Ð°Ñ†Ð¸Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ settings.archive.success=Репозиторий был уÑпешно архивирован. settings.archive.error=Ошибка при попытке архивировать репозиторий. Смотрите логи Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¾Ñтей. settings.archive.error_ismirror=Ð’Ñ‹ не можете помеÑтить зеркалируемый репозиторий в архив. -settings.archive.branchsettings_unavailable=ÐаÑтройки ветви недоÑтупны, еÑли репозиторий архивирован. -settings.archive.tagsettings_unavailable=ÐаÑтройки тегов недоÑтупны, еÑли репозиторий архивирован. +settings.archive.branchsettings_unavailable=ÐаÑтройки ветвей недоÑтупны в архивированных репозиториÑÑ…. +settings.archive.tagsettings_unavailable=ÐаÑтройки тегов недоÑтупны в архивированных репозиториÑÑ…. settings.unarchive.button=Разархивировать settings.unarchive.header=Вернуть Ñтот репозиторий из архива -settings.unarchive.text=Разархивирование Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð²Ð¾ÑÑтановит его ÑпоÑобноÑть принимать изменениÑ, а также новые задачи и запроÑÑ‹ на ÑлиÑние. +settings.unarchive.text=Ð Ð°Ð·Ð°Ñ€Ñ…Ð¸Ð²Ð°Ñ†Ð¸Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð²Ð¾ÑÑтановит возможноÑть отправлÑть в него изменениÑ, а также Ñоздавать новые задачи и запроÑÑ‹ на ÑлиÑние. settings.unarchive.success=Репозиторий был уÑпешно разархивирован. settings.update_avatar_success=Картинка Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð°. settings.lfs=LFS @@ -2475,7 +2522,7 @@ settings.lfs_invalid_locking_path=ÐедопуÑтимый путь: %s settings.lfs_invalid_lock_directory=Ðевозможно заблокировать каталог: %s settings.lfs_lock_already_exists=Блокировка уже ÑущеÑтвует: %s settings.lfs_lock=Заблокировать -settings.lfs_lock_path=Путь к файлу Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸... +settings.lfs_lock_path=Путь к файлу Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸â€¦ settings.lfs_locks_no_locks=Ðет блокировок settings.lfs_lock_file_no_exist=Заблокированный файл не ÑущеÑтвует в ветви по умолчанию settings.lfs_force_unlock=ÐŸÑ€Ð¸Ð½ÑƒÐ´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñ€Ð°Ð·Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ° @@ -2527,7 +2574,7 @@ diff.load=Показать Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ diff.generated=Ñгенерированный diff.vendored=предоÑтавленный diff.comment.placeholder=ОÑтавить комментарий -diff.comment.markdown_info=ПоддерживаетÑÑ ÑинтакÑÐ¸Ñ Markdown. +diff.comment.markdown_info=ПоддерживаетÑÑ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ðµ Ñ Markdown. diff.comment.add_single_comment=Добавить проÑтой комментарий diff.comment.add_review_comment=Добавить комментарий diff.comment.start_review=Ðачать рецензию @@ -2558,7 +2605,7 @@ release.draft=Черновик release.prerelease=Предварительный выпуÑк release.stable=Стабильный release.compare=Сравнить -release.edit=редактировать +release.edit=Редактировать release.ahead.commits=%d коммиты release.ahead.target=%s Ñ Ñтого выпуÑка tag.ahead.target=в %s поÑле Ñтого тега @@ -2639,7 +2686,7 @@ tag.create_tag_from=Создать новый тег из «%s» tag.create_success=Тег «%s» Ñоздан. -topic.manage_topics=Редактировать тематичеÑкие метки +topic.manage_topics=Изменить темы topic.done=Сохранить topic.count_prompt=ÐÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ более 25 тем topic.format_prompt=Темы должны начинатьÑÑ Ñ Ð±ÑƒÐºÐ²Ñ‹ или цифры и могут Ñодержать дефиÑÑ‹ («-») и точки («.»). Длина темы не должна превышать 35 Ñимволов. Ð’Ñе буквы должны быть Ñтрочными. @@ -2652,7 +2699,7 @@ error.csv.unexpected=Ðе удаетÑÑ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð·Ð¸Ñ‚ÑŒ Ñтот файл, error.csv.invalid_field_count=Ðе удаетÑÑ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð·Ð¸Ñ‚ÑŒ Ñтот файл, потому что он имеет неправильное количеÑтво полей в Ñтроке %d. mirror_address_protocol_invalid = Эта ÑÑылка недейÑтвительна. Ð”Ð»Ñ Ð·ÐµÑ€ÐºÐ°Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ иÑпользовать только раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ http(s):// и git:// . fork_no_valid_owners = Ðевозможно Ñоздать ответвление Ñтого репозиториÑ, Ñ‚.к. здеÑÑŒ нет дейÑтвующих владельцев. -new_repo_helper = Репозиторий Ñодержит вÑе файлы проекта и иÑторию изменений. Уже где-то еÑть репозиторий? Выполните миграцию. +new_repo_helper = Репозиторий Ñодержит вÑе файлы проекта и иÑторию изменений. Уже где-то еÑть репозиторий? Выполните переноÑ. mirror_address_url_invalid = Эта ÑÑылка недейÑтвительна. Ðеобходимо правильно указать вÑе чаÑти адреÑа. issues.comment.blocked_by_user = Ð’Ñ‹ не можете комментировать под Ñтой задачей, Ñ‚.к. вы заблокированы владельцем Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð¸Ð»Ð¸ автором задачи. pulls.blocked_by_user = Ðевозможно Ñоздать Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние в Ñтом репозитории, Ñ‚.к. вы заблокированы его владельцем. @@ -2667,7 +2714,7 @@ object_format = Формат объекта clone_in_vscodium = Клонировать в VSCodium mirror_sync = Ñинхронизирован blame.ignore_revs = Правки в .git-blame-ignore-revs проигнорированы. Ðажмите здеÑÑŒ, чтобы обойти Ñтот файл и проÑмотреть авторов полноценно. -issues.blocked_by_user = Ðевозможно Ñоздать задачу в Ñтом репозитории, Ñ‚.к. вы заблокированы его владельцем. +issues.blocked_by_user = Создание задач невозможно в Ñтом репозитории, Ñ‚.к. вы заблокированы его владельцем. settings.new_owner_blocked_doer = Ð’Ñ‹ заблокированы новым владельцем. settings.add_collaborator_blocked_them = Ðевозможно добавить ÑоучаÑтника, Ñ‚.к. им заблокирован владелец репозиториÑ. pulls.blocked_by_changed_protected_files_1 = Этот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние заблокирован, Ñ‚.к. им изменÑетÑÑ Ð·Ð°Ñ‰Ð¸Ñ‰Ñ‘Ð½Ð½Ñ‹Ð¹ файл: @@ -2676,8 +2723,8 @@ pulls.blocked_by_outdated_branch = Этот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние з pulls.blocked_by_changed_protected_files_n = Этот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние заблокирован, Ñ‚.к. им изменÑÑŽÑ‚ÑÑ Ð·Ð°Ñ‰Ð¸Ñ‰Ñ‘Ð½Ð½Ñ‹Ðµ файлы: blame.ignore_revs.failed = Ðе удалоÑÑŒ проигнорировать правки из .git-blame-ignore-revs. desc.sha256 = SHA256 -archive.title = Этот репозиторий архивирован. Ð’Ñ‹ можете проÑматривать его Ñодержимое или клонировать, но не добавлÑть новые комиты, открывать задачи или запроÑÑ‹ на ÑлиÑние. -archive.title_date = С %s Ñтот репозиторий архивирован. Ð’Ñ‹ можете проÑматривать его Ñодержимое или клонировать, но не добавлÑть новые комиты, открывать задачи или запроÑÑ‹ на ÑлиÑние. +archive.title = Этот репозиторий архивирован. Ð’Ñ‹ можете проÑматривать Ñодержимое или клонировать, но не вноÑить изменениÑ: добавлÑть коммиты, Ñоздавать задачи и запроÑÑ‹ ÑлиÑний. +archive.title_date = С %s Ñтот репозиторий архивирован. Ð’Ñ‹ можете проÑматривать Ñодержимое или клонировать, но не вноÑить изменениÑ: добавлÑть коммиты, Ñоздавать задачи и запроÑÑ‹ ÑлиÑний. migrate.forgejo.description = ПеренеÑти данные Ñ codeberg.org или другого Ñервера Forgejo. generated = Сгенерированный pulls.review_only_possible_for_full_diff = ОÑтавить отзыв можно только при проÑмотре вÑех различий @@ -2698,7 +2745,7 @@ pulls.recently_pushed_new_branches = Ð’Ñ‹ отправили коммиты в milestones.new_subheader = Этапы полезны Ð´Ð»Ñ ÑиÑтематизации задач и отÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¸Ñ… выполнениÑ. wiki.cancel = Отмена settings.unarchive.error = При раÑпаковке Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð¾ÑˆÐ»Ð° ошибка. ПодробноÑти доÑтупны в логе. -settings.archive.mirrors_unavailable = Зеркалирование недоÑтупно Ð´Ð»Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ñ‹Ñ… репозиториев. +settings.archive.mirrors_unavailable = ÐаÑтройки Ð·ÐµÑ€ÐºÐ°Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтупны в архивированных репозиториÑÑ…. issues.role.contributor_helper = Ð’ репозитории приÑутÑтвуют коммиты за авторÑтвом Ñтого пользователÑ. settings.wiki_rename_branch_main = Ðормализовать название ветви вики settings.wiki_rename_branch_main_notices_2 = ВнутреннÑÑ Ð²ÐµÑ‚Ð²ÑŒ вики Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ %s будет переименована. ÐеÑохранённые Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±ÑƒÑŽÑ‚ обновлениÑ. @@ -2717,14 +2764,13 @@ settings.wiki_globally_editable = Разрешить редактировани settings.webhook.test_delivery_desc_disabled = Ðктивируйте Ñтот веб-хук Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ теÑтовым Ñобытием. commits.browse_further = Смотреть далее vendored = Сторонний -settings.units.add_more = Доб. больше... +settings.units.add_more = Вкл. больше pulls.fast_forward_only_merge_pull_request = Только fast-forward settings.units.overview = Обзор -settings.units.units = Разделы Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ -pulls.reopen_failed.head_branch = Этот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние не может быть открыт заново, потому что Ð³Ð¾Ð»Ð¾Ð²Ð½Ð°Ñ Ð²ÐµÑ‚Ð²ÑŒ больше не ÑущеÑтвует. +settings.units.units = Разделы +pulls.reopen_failed.head_branch = Этот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние не может быть открыт повторно, так как иÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð²ÐµÑ‚Ð²ÑŒ больше не ÑущеÑтвует. pulls.reopen_failed.base_branch = Этот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние не может быть открыт заново, потому что Ð±Ð°Ð·Ð¾Ð²Ð°Ñ Ð²ÐµÑ‚Ð²ÑŒ больше не ÑущеÑтвует. settings.ignore_stale_approvals = Игнорировать уÑтаревшие Ð¾Ð´Ð¾Ð±Ñ€ÐµÐ½Ð¸Ñ -contributors.contribution_type.commits = Коммиты contributors.contribution_type.additions = Ð”Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ contributors.contribution_type.deletions = Ð£Ð´Ð°Ð»ÐµÐ½Ð¸Ñ contributors.contribution_type.filter_label = Вид деÑтельноÑти: @@ -2734,7 +2780,7 @@ pulls.made_using_agit = AGit activity.navbar.contributors = Соавторы activity.navbar.code_frequency = ЧаÑтота изменений activity.navbar.recent_commits = Ðедавние коммиты -settings.confirmation_string = Подтверждение +settings.confirmation_string = Строка Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ settings.archive.text = ÐÑ€Ñ…Ð¸Ð²Ð°Ñ†Ð¸Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ñделает вÑÑ‘ его Ñодержимое доÑтупным только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ. Он будет Ñкрыт Ñ Ð´Ð¾Ð¼Ð°ÑˆÐ½ÐµÐ³Ð¾ Ñкрана. Ðикто (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð²Ð°Ñ!) не Ñможет добавлÑть коммиты, открывать задачи и запроÑÑ‹ ÑлиÑний. release.deletion_desc = Удаление выпуÑка удалÑет его только в Forgejo. Это дейÑтвие не затронет тег в git, Ñодержимое Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð¸ его иÑторию. Продолжить? pulls.agit_explanation = Создано через рабочий поток AGit. С ним можно предлагать изменениÑ, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñƒ «git push», без необходимоÑти в Ñоздании Ð¾Ñ‚Ð²ÐµÑ‚Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ новой ветви. @@ -2774,7 +2820,7 @@ release.download_count_few = %s Ñкачиваний release.system_generated = Это вложение Ñгенерировано автоматичеÑки. settings.event_pull_request_enforcement = ФорÑирование pulls.cmd_instruction_checkout_desc = Ð’ репозитории вашего проекта перейдите на Ñту ветвь и протеÑтируйте изменениÑ. -error.broken_git_hook = Гит-хуки Ñтого Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ñломаны. ОзнакомьтеÑÑŒ Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸ÐµÐ¹ и почините их, затем отправьте какие-нибудь коммиты Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑтатуÑа. +error.broken_git_hook = Гит-хуки Ñтого Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ñломаны. ОзнакомьтеÑÑŒ Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸ÐµÐ¹ и иÑправьте их, затем отправьте какие-нибудь коммиты Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑтатуÑа. pulls.cmd_instruction_checkout_title = Перейдите к ветви settings.graphql_url = СÑылка GraphQL settings.sourcehut_builds.access_token_helper = Токен builds.sr.ht Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸ÐµÐ¼ JOBS:RW. Создайте обычный токен или токен Ñ Ð´Ð¾Ñтупом к Ñекретам на meta.sr.ht. @@ -2825,8 +2871,57 @@ mirror_use_ssh.helper = Forgejo будет Ñинхронизировать из mirror_denied_combination = Ðевозможно одновременно иÑпользовать аутентификацию по SSH и по паролю. settings.mirror_settings.push_mirror.none_ssh = Ðет settings.mirror_settings.push_mirror.copy_public_key = Копировать публичный ключ +issues.new.assign_to_me = Ðазначить Ñебе +issues.all_title = Ð’Ñе +settings.discord_icon_url.exceeds_max_length = URL иконки не может быть длиннее 2048 Ñимволов +issues.review.add_review_requests = запрошены рецензии от %[1]s %[2]s +issues.review.remove_review_requests = отменены запроÑÑ‹ рецензий от %[1]s %[2]s +issues.review.add_remove_review_requests = запрошены рецензии от %[1]s и отменены запроÑÑ‹ рецензий от %[2]s %[3]s +pulls.delete_after_merge.head_branch.is_default = Ð“Ð¾Ð»Ð¾Ð²Ð½Ð°Ñ Ð²ÐµÑ‚Ð²ÑŒ, которую вы попыталиÑÑŒ удалить, ÑвлÑетÑÑ Ð²ÐµÑ‚Ð²ÑŒÑŽ по умолчанию и не может быть удалена. +pulls.delete_after_merge.head_branch.is_protected = Ð“Ð¾Ð»Ð¾Ð²Ð½Ð°Ñ Ð²ÐµÑ‚Ð²ÑŒ, которую вы попыталиÑÑŒ удалить, защищена от Ñтого и не может быть удалена. +pulls.delete_after_merge.head_branch.insufficient_branch = ОтÑутÑтвует разрешение Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ð²Ð½Ð¾Ð¹ ветви. +issues.filter_sort.relevance = По ÑоответÑтвию +diff.git-notes.remove-header = Удаление заметки +diff.git-notes.remove-body = Заметка будет удалена. +diff.git-notes.add = Добавить заметку +issues.num_reviews_few = %d рецензий +issues.num_reviews_one = %d Ñ€ÐµÑ†ÐµÐ½Ð·Ð¸Ñ +issues.summary_card_alt = Карточка Ñо Ñводкой задачи "%s" в репозитории %s +editor.add_tmpl.filename = Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° +settings.default_update_style_desc = Стиль Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ñтающих ветвей запроÑов на ÑлиÑние по умолчанию. +pulls.sign_in_require = Войдите, чтобы Ñоздать Ð·Ð°Ð¿Ñ€Ð¾Ñ ÑлиÑниÑ. +new_from_template = Применить шаблон +new_from_template_description = Ð’Ñ‹ можете выбрать любой шаблон Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° Ñтом Ñервере и применить его наÑтройки на Ñтом репозитории. +new_advanced = РаÑширенные наÑтройки +new_advanced_expand = Ðажмите, чтобы раÑкрыть +auto_init_description = Ðачать иÑторию коммитов Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ README и, еÑли надо, лицензии и .gitignore. +summary_card_alt = Карточка Ñо Ñводкой о репозитории %s +issues.reaction.add = Добавить реакцию +issues.reaction.alt_few = Ð ÐµÐ°ÐºÑ†Ð¸Ñ %[2]s от %[1]s. +issues.reaction.alt_many = Ð ÐµÐ°ÐºÑ†Ð¸Ñ %[3]s от %[1]s и %[2]d других. +issues.reaction.alt_remove = Убрать реакцию %[1]s Ñ Ñтого комментариÑ. +issues.reaction.alt_add = Добавить реакцию %[1]s к Ñтому комментарию. +issues.context.menu = Меню ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸Ñ +release.summary_card_alt = Карточка Ñо Ñводкой о выпуÑке «%s» в репозитории %s +archive.pull.noreview = Этот репозиторий архивирован. Рецензирование запроÑов ÑлиÑний невозможно. +editor.commit_email = Эл. почта автора +commits.view_single_diff = ПоÑмотреть Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Ñтом файле из Ñтого коммита +pulls.editable = ИзменÑемый +pulls.editable_explanation = Ðвтор разрешил Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ñ‚ ÑоучаÑтников. Ð’Ñ‹ можете напрÑмую отправлÑть в него изменениÑ. +issues.reopen.blocked_by_user = Повторное открытие задачи невозможно, Ñ‚.к. вы заблокированы владельцем Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð¸Ð»Ð¸ автором задачи. +pulls.comment.blocked_by_user = Ð’Ñ‹ не можете комментировать под Ñтим запроÑом ÑлиÑниÑ, Ñ‚.к. вы заблокированы владельцем Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð¸Ð»Ð¸ автором задачи. +issues.filter_no_results = Ðичего не нашлоÑÑŒ +issues.filter_no_results_placeholder = Попробуйте поиÑкать по-другому. [graphs] +component_loading_failed = Ðе удалоÑÑŒ загрузить %s +component_failed_to_load = СлучилаÑÑŒ Ð½ÐµÐ¿Ñ€ÐµÐ´Ð²Ð¸Ð´ÐµÐ½Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°. +contributors.what = ÑоучаÑтие +component_loading = Загрузка %s… +component_loading_info = Это займёт некоторое времÑ… +code_frequency.what = чаÑтота изменений +recent_commits.what = недавние коммиты + [org] org_name_holder=Ðазвание организации @@ -2845,9 +2940,9 @@ org_desc=ОпиÑание team_name=Ðазвание команды team_desc=ОпиÑание team_name_helper=ÐÐ°Ð·Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ должны быть короткими и запоминающимиÑÑ. -team_desc_helper=Опишите назначение или роль команды. -team_access_desc=ДоÑтуп к репозиторию -team_permission_desc=Разрешение +team_desc_helper=Ðазначение или роль Ñтой команды. +team_access_desc=ДоÑтуп к репозиториÑм +team_permission_desc=Ð Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ team_unit_desc=Разрешить доÑтуп к разделам Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ team_unit_disabled=(Отключено) @@ -2865,7 +2960,7 @@ settings.permission=Ð Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ settings.repoadminchangeteam=ÐдминиÑтратор Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ добавлÑть и удалÑть права доÑтупа Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ settings.visibility=ВидимоÑть settings.visibility.public=Публичный -settings.visibility.limited=ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð½Ð°Ñ (видна только авторизованным пользователÑм) +settings.visibility.limited=ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð½Ð°Ñ (видна только зарегиÑтрированным пользователÑм) settings.visibility.limited_shortname=Ограниченный settings.visibility.private=ЧаÑÑ‚Ð½Ð°Ñ (видна только учаÑтникам организации) settings.visibility.private_shortname=ЧаÑÑ‚Ð½Ð°Ñ @@ -2953,6 +3048,8 @@ teams.invite.description=Ðажмите на кнопку ниже, чтобы follow_blocked_user = Ð’Ñ‹ не можете подпиÑатьÑÑ Ð½Ð° Ñту организацию, Ñ‚.к. вы в ней заблокированы. teams.general_access = ÐаÑтраиваемый доÑтуп open_dashboard = Открыть панель +settings.change_orgname_redirect_prompt.with_cooldown.few = Прежнее название будет доÑтупно Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ пользователÑм поÑле иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ в %[1]d дней. Ð’Ñ‹ Ñможете вернуть его во Ð²Ñ€ÐµÐ¼Ñ Ñрока защиты. +settings.change_orgname_redirect_prompt.with_cooldown.one = Прежнее название будет доÑтупно Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ пользователÑм поÑле иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ в %[1]d день. Ð’Ñ‹ Ñможете вернуть его во Ð²Ñ€ÐµÐ¼Ñ Ñрока защиты. [admin] dashboard=Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ @@ -3142,7 +3239,7 @@ repos.lfs_size=Размер LFS packages.package_manage_panel=Управление пакетами packages.total_size=Общий размер: %s -packages.unreferenced_size=Размер по ÑÑылке: %s +packages.unreferenced_size=Ðеуказанный размер: %s packages.cleanup=ОчиÑтить уÑтаревшие данные packages.cleanup.success=ОчиÑтка уÑтаревших данных уÑпешно завершена packages.owner=Владелец @@ -3282,13 +3379,13 @@ auths.invalid_openIdConnectAutoDiscoveryURL=Ðеверный URL Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾ config.server_config=ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñервера config.app_name=Ðазвание Ñервера config.app_ver=ВерÑÐ¸Ñ Forgejo -config.app_url=Базовый URL Forgejo +config.app_url=Базовый URL config.custom_conf=Путь к файлу конфигурации config.custom_file_root_path=Путь до каталога Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸ Ð´Ð»Ñ Ð¿ÐµÑ€Ñонализации config.domain=Домен Ñервера config.offline_mode=Локальный режим config.disable_router_log=Отключение журнала маршрутизатора -config.run_user=Выполнение под пользователем +config.run_user=Работа под пользователем config.run_mode=Режим работы config.git_version=ВерÑÐ¸Ñ git config.app_data_path=Путь к данным Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ @@ -3332,15 +3429,15 @@ config.allow_only_external_registration=РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ че config.enable_openid_signup=СаморегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· OpenID config.enable_openid_signin=Вход через OpenID config.show_registration_button=Кнопка региÑтрации -config.require_sign_in_view=Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñодержимого необходима Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ +config.require_sign_in_view=Требовать авторизацию Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñодержимого config.mail_notify=Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñл. почте config.enable_captcha=CAPTCHA config.active_code_lives=Срок дейÑÑ‚Ð²Ð¸Ñ ÐºÐ¾Ð´Ð° активации учётной запиÑи config.reset_password_code_lives=Срок дейÑÑ‚Ð²Ð¸Ñ ÐºÐ¾Ð´Ð° воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð¾Ð¹ запиÑи config.default_keep_email_private=Скрывать адреÑа Ñл. почты по умолчанию config.default_allow_create_organization=Разрешить Ñоздание организаций по умолчанию -config.enable_timetracking=ОтÑлеживание времени -config.default_enable_timetracking=Включить отÑлеживание времени по умолчанию +config.enable_timetracking=Счётчик времени +config.default_enable_timetracking=Включить Ñчётчик затраченного времени по умолчанию config.allow_dots_in_usernames = Разрешить точки в именах пользователей. Это не повлиÑет на уже Ñозданные учётные запиÑи. config.default_allow_only_contributors_to_track_time=ПодÑчитывать Ð²Ñ€ÐµÐ¼Ñ Ð¼Ð¾Ð³ÑƒÑ‚ только Ñоавторы config.no_reply_address=Домен Ñкрытых адреÑов почты @@ -3400,7 +3497,7 @@ config.git_max_diff_lines=МакÑ. количеÑтво Ñтрок в файл config.git_max_diff_line_characters=МакÑ. количеÑтво Ñимволов в Ñтроке при Ñравнении config.git_max_diff_files=МакÑ. отображаемое количеÑтво файлов при Ñравнении config.git_gc_args=Ðргументы Ñборщика муÑора -config.git_migrate_timeout=Ограничение времени миграций +config.git_migrate_timeout=Ограничение времени переноÑов config.git_mirror_timeout=Ограничение времени на Ñинхронизацию зеркала config.git_clone_timeout=Ограничение времени операций ÐºÐ»Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ config.git_pull_timeout=Ограничение времени на получение изменений @@ -3446,7 +3543,7 @@ monitor.queue.activeworkers=Ðктивные обработчики monitor.queue.maxnumberworkers=МакÑ. количеÑтво обработчиков monitor.queue.numberinqueue=ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ð² очереди monitor.queue.settings.title=ÐаÑтройки пула -monitor.queue.settings.desc=Пулы увеличиваютÑÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸Ñ‡ÐµÑки в ответ на блокировку очередей Ñвоих обработчиков. +monitor.queue.settings.desc=Пулы динамичеÑки раÑтут в завиÑимоÑти от блокировки очередей их рабочих. monitor.queue.settings.maxnumberworkers=МакÑ. количеÑтво обработчиков monitor.queue.settings.maxnumberworkers.placeholder=Ð’ наÑтоÑщий момент %[1]d monitor.queue.settings.maxnumberworkers.error=МакÑимальное количеÑтво обработчиков должно быть чиÑлом @@ -3472,7 +3569,7 @@ notices.delete_success=Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ ÑиÑтемы были удале self_check.no_problem_found = Пока проблем не обнаружено. auths.tip.gitea = ЗарегиÑтрируйте новое приложение OAuth2. ДоÑтупна инÑтрукциÑ: %s auths.tips.oauth2.general.tip = При региÑтрации нового Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ OAuth2 ÑÑылка обратного Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° быть: -self_check.database_fix_mysql = Пользователи MySQL и MariaDB могут иÑправить проблемы Ñ ÑопоÑтавлением командой "gitea doctor convert". Также можно вручную впиÑать "ALTER ... COLLATE ..." в SQL. +self_check.database_fix_mysql = Пользователи MySQL и MariaDB могут иÑправить проблемы Ñ ÑопоÑтавлением командой "forgejo doctor convert". Также можно вручную впиÑать "ALTER ... COLLATE ..." в SQL. dashboard.cleanup_actions = ОчиÑтить уÑтаревшие журналы и артефакты ДейÑтвий dashboard.sync_repo_branches = Синхронизировать ветви из Git в базу данных assets = Кодовые объекты @@ -3510,6 +3607,7 @@ emails.delete = Удалить Ð°Ð´Ñ€ÐµÑ emails.deletion_success = ÐÐ´Ñ€ÐµÑ Ñл. поÑты удалён из учётной запиÑи. emails.delete_primary_email_error = Ðевозможно удалить оÑновной адреÑ. emails.delete_desc = Ð’Ñ‹ точно хотите удалить Ñтот Ð°Ð´Ñ€ÐµÑ Ñл. почты? +monitor.duration = ДлительноÑть (Ñ) [action] @@ -3526,17 +3624,17 @@ comment_issue=`оÑтавлен комментарий под задачей %[3]s#%[2]s` merge_pull_request=`принÑÑ‚ Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние %[3]s#%[2]s` auto_merge_pull_request=`автоматичеÑки принÑÑ‚ Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние %[3]s#%[2]s` -transfer_repo=передан репозиторий %s %s -push_tag=Ñоздан тег %[3]s в %[4]s -delete_tag=удалён Ñ‚Ñг %[2]s из %[3]s -delete_branch=удалена ветвь %[2]s из %[3]s +transfer_repo=репозиторий %s был передан: %s +push_tag=отправлен тег %[3]s в %[4]s +delete_tag=удалён тег %[2]s в %[3]s +delete_branch=удалена ветвь %[2]s в %[3]s compare_branch=Сравнить compare_commits=Сравнить %d коммитов compare_commits_general=Сравнить коммиты mirror_sync_push=Ñинхронизировал(а) коммиты %[3]s в %[4]s из зеркала mirror_sync_create=Ñинхронизировал(а) новую ÑÑылку %[3]s в %[4]s из зеркала mirror_sync_delete=Ñинхронизированные и удалённые ÑÑылки %[2]s на %[3]s из зеркала -approve_pull_request=`одобрен %[3]s#%[2]s` +approve_pull_request=`одобрен Ð·Ð°Ð¿Ñ€Ð¾Ñ ÑлиÑÐ½Ð¸Ñ %[3]s#%[2]s` reject_pull_request=`предложил(а) Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ %[3]s#%[2]s` publish_release=`выпуÑк %[4]s опубликован в %[3]s` review_dismissed=`отклонён отзыв от %[4]s Ð´Ð»Ñ %[3]s#%[2]s` @@ -3598,7 +3696,7 @@ no_subscriptions=Ðет подпиÑок default_key=ПодпиÑано ключом по умолчанию error.extract_sign=Ðе удалоÑÑŒ извлечь подпиÑÑŒ error.generate_hash=Ðе удалоÑÑŒ Ñоздать хеш коммита -error.no_committer_account=Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Ñ Ñл. почтой Ñтого коммитера не найдена +error.no_committer_account=Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Ñ Ñл. почтой автора Ñтого коммита не найдена error.no_gpg_keys_found=Ðе найден ключ, ÑоответÑтвующий данной подпиÑи error.not_signed_commit=ÐеподпиÑанный коммит error.failed_retrieval_gpg_keys=Ðе удалоÑÑŒ получить ни одного ключа GPG автора коммита @@ -3635,7 +3733,7 @@ details.project_site=Веб-Ñайт проекта details.repository_site=Веб-Ñайт Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ details.documentation_site=Веб-Ñайт документации details.license=Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ -assets=РеÑурÑÑ‹ +assets=Объекты versions=ВерÑии versions.view_all=Показать вÑÑ‘ dependency.id=ID @@ -3643,7 +3741,7 @@ dependency.version=ВерÑÐ¸Ñ alpine.registry=ÐаÑтройте Ñтот рееÑтр, добавив URL в файл /etc/apk/repositories: alpine.registry.key=Загрузите публичный ключ RSA рееÑтра в каталог /etc/apk/keys/ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ подпиÑи индекÑа: alpine.registry.info=Выберите $branch и $repository из ÑпиÑка ниже. -alpine.install=Чтобы уÑтановить пакет, выполните Ñледующую команду: +alpine.install=Ð”Ð»Ñ ÑƒÑтановки пакета выполните Ñледующую команду: alpine.repository=О репозитории alpine.repository.branches=Ветви alpine.repository.repositories=Репозитории @@ -3651,43 +3749,43 @@ alpine.repository.architectures=Ðрхитектуры cargo.registry=ÐаÑтройте Ñтот рееÑтр в файле конфигурации Cargo (например, ~/.cargo/config.toml): cargo.install=Чтобы уÑтановить пакет Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Cargo, выполните Ñледующую команду: chef.registry=ÐаÑтройте Ñтот рееÑтр в Ñвоём файле ~/.chef/config.rb: -chef.install=Чтобы уÑтановить пакет, выполните Ñледующую команду: +chef.install=Ð”Ð»Ñ ÑƒÑтановки пакета выполните Ñледующую команду: composer.registry=ÐаÑтройте Ñтот рееÑтр в файле ~/.composer/config.json: composer.install=Чтобы уÑтановить пакет Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Composer, выполните Ñледующую команду: composer.dependencies=ЗавиÑимоÑти composer.dependencies.development=ЗавиÑимоÑти Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ conan.details.repository=Репозиторий -conan.registry=ÐаÑтроить рееÑтр из командной Ñтроки: +conan.registry=Добавьте рееÑтр командой: conan.install=Чтобы уÑтановить пакет Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Conan, выполните Ñледующую команду: conda.registry=Пропишите Ñтот рееÑтр в качеÑтве Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Conda в Ñвоём файле .condarc: conda.install=Чтобы уÑтановить пакет Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Conda, выполните Ñледующую команду: container.details.type=Тип образа container.details.platform=Платформа container.pull=Загрузите образ из командной Ñтроки: -container.digest=Отпечаток: +container.digest=Отпечаток container.multi_arch=ОС / архитектура container.layers=Слои образа container.labels=Метки container.labels.key=Ключ container.labels.value=Значение cran.registry=ÐаÑтройте Ñтот рееÑтр в файле Rprofile.site: -cran.install=Чтобы уÑтановить пакет, выполните Ñледующую команду: -debian.registry=ÐаÑтроить рееÑтр из командной Ñтроки: +cran.install=Ð”Ð»Ñ ÑƒÑтановки пакета выполните Ñледующую команду: +debian.registry=Добавьте рееÑтр командой: debian.registry.info=Выберите $distribution и $component из ÑпиÑка ниже. -debian.install=Чтобы уÑтановить пакет, выполните Ñледующую команду: +debian.install=Ð”Ð»Ñ ÑƒÑтановки пакета выполните Ñледующую команду: debian.repository=О репозитории debian.repository.distributions=ДиÑтрибутивы debian.repository.components=Компоненты debian.repository.architectures=Ðрхитектуры generic.download=Скачать пакет из командной Ñтроки: go.install=УÑтановите пакет из командной Ñтроки: -helm.registry=ÐаÑтроить рееÑтр из командной Ñтроки: -helm.install=Чтобы уÑтановить пакет, выполните Ñледующую команду: +helm.registry=Добавьте рееÑтр командой: +helm.install=Ð”Ð»Ñ ÑƒÑтановки пакета выполните Ñледующую команду: maven.registry=ÐаÑтройте рееÑтр в файле pom.xml вашего проекта: maven.install=Чтобы иÑпользовать пакет, включите в блок dependencies в файле pom.xml Ñледующее: maven.install2=Выполнить через командную Ñтроку: maven.download=Чтобы Ñкачать завиÑимоÑть, запуÑтите в командной Ñтроке: -nuget.registry=ÐаÑтроить рееÑтр из командной Ñтроки: +nuget.registry=Добавьте рееÑтр командой: nuget.install=Чтобы уÑтановить пакет Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ NuGet, выполните Ñледующую команду: nuget.dependency.framework=Целевой фреймворк npm.registry=ÐаÑтройте рееÑтр в файле .npmrc вашего проекта: @@ -3701,19 +3799,19 @@ npm.details.tag=Тег pub.install=Чтобы уÑтановить пакет Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Dart, выполните Ñледующую команду: pypi.requires=ТребуетÑÑ Python pypi.install=Чтобы уÑтановить пакет Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ pip, выполните Ñледующую команду: -rpm.registry=ÐаÑтроить рееÑтр из командной Ñтроки: +rpm.registry=Добавьте рееÑтр командой: rpm.distros.redhat=на диÑтрибутивах ÑемейÑтва RedHat rpm.distros.suse=на диÑтрибутивах ÑемейÑтва SUSE -rpm.install=Чтобы уÑтановить пакет, выполните Ñледующую команду: -rpm.repository=О репозитории -rpm.repository.architectures=Ðрхитектуры +rpm.install=Ð”Ð»Ñ ÑƒÑтановки пакета выполните Ñледующую команду: +rpm.repository = О репозитории +rpm.repository.architectures = Ðрхитектуры rubygems.install=Чтобы уÑтановить пакет Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ gem, выполните Ñледующую команду: rubygems.install2=или добавьте его в Gemfile: rubygems.dependencies.runtime=ЗавиÑимоÑти времени Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ rubygems.dependencies.development=ЗавиÑимоÑти Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ rubygems.required.ruby=ТребуетÑÑ Ð²ÐµÑ€ÑÐ¸Ñ Ruby rubygems.required.rubygems=ТребуетÑÑ Ð²ÐµÑ€ÑÐ¸Ñ RubyGem -swift.registry=ÐаÑтроить рееÑтр из командной Ñтроки: +swift.registry=Добавьте рееÑтр командой: swift.install=Добавьте пакет в Ñвой файл Package.swift: swift.install2=и запуÑтите Ñледующую команду: vagrant.install=Чтобы добавить Ð±Ð¾ÐºÑ Vagrant, выполните Ñледующую команду: @@ -3758,9 +3856,7 @@ owner.settings.cleanuprules.success.delete=Правило очиÑтки уда owner.settings.chef.title=РееÑтр Chef owner.settings.chef.keypair=Создать пару ключей owner.settings.cleanuprules.none = Правил очиÑтки пока нет. -owner.settings.cargo.rebuild.description = ПереÑборка может быть полезной в Ñлучае, еÑли Ð¸Ð½Ð´ÐµÐºÑ Ð½Ðµ Ñинхронизирован Ñ Ñохранёнными пакетами Cargo. -rpm.repository = О репозитории -rpm.repository.architectures = Ðрхитектуры +owner.settings.cargo.rebuild.description = ПереÑборка может быть полезна в Ñлучае, еÑли Ð¸Ð½Ð´ÐµÐºÑ Ð½Ðµ Ñинхронизирован Ñ Ñ…Ñ€Ð°Ð½ÑщимиÑÑ Ð¿Ð°ÐºÐµÑ‚Ð°Ð¼Ð¸ Cargo. rpm.repository.multiple_groups = Этот пакет доÑтупен в неÑкольких группах. owner.settings.chef.keypair.description = Ð”Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ рееÑтра Chef необходима пара ключей. ЕÑли до Ñтого вы уже Ñгенерировали пару ключей, Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð¹ приведёт к прекращению дейÑÑ‚Ð²Ð¸Ñ Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰ÐµÐ¹. owner.settings.cargo.rebuild.no_index = Ðевозможно выполнить переÑборку. Ðет инициализированного индекÑа. @@ -3781,6 +3877,15 @@ arch.version.replaces = ЗаменÑет arch.version.backup = Рез. ÐºÐ¾Ð¿Ð¸Ñ arch.version.conflicts = Конфликтует Ñ arch.version.checkdepends = Проверочные завиÑимоÑти +container.images.title = Образы +search_in_external_registry = Ðайти в %s +alt.repository = О репозитории +alt.repository.architectures = Ðрхитектуры +alt.registry = Добавьте рееÑтр командой: +alt.repository.multiple_groups = Этот пакет доÑтупен в неÑкольких группах. +alt.setup = Добавьте репозиторий в Ñвой ÑпиÑок репозиториев (выберите подходÑщую архитектуру вмеÑто «_arch_»): +alt.install = УÑтановка пакета +alt.registry.install = Ð”Ð»Ñ ÑƒÑтановки пакета выполните Ñледующую команду: [secrets] secrets=Секреты @@ -3800,7 +3905,7 @@ management=Управление Ñекретами [actions] actions=ДейÑÑ‚Ð²Ð¸Ñ -unit.desc=Управление вÑтроенными конвейерами CI/CD Ñ Ð”ÐµÐ¹ÑтвиÑми Forgejo +unit.desc=Управление вÑтроенными конвейерами CI/CD Ñ Ð”ÐµÐ¹ÑтвиÑми Forgejo. status.unknown=ÐеизвеÑтно status.waiting=Ожидает @@ -3899,6 +4004,9 @@ workflow.dispatch.input_required = Требовать значение Ð´Ð»Ñ Ð¿ workflow.dispatch.invalid_input_type = ÐеизвеÑтный тип Ð¿Ð¾Ð»Ñ Â«%s». workflow.dispatch.warn_input_limit = ОтображаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ первые %d полей. runs.expire_log_message = Журнал был удалён из-за ÑтароÑти. +runs.no_workflows.help_write_access = Ðе знаете, как начать иÑпользовать ДейÑÑ‚Ð²Ð¸Ñ Forgejo? ОзнакомьтеÑÑŒ Ñ Ñ€ÑƒÐºÐ¾Ð²Ð¾Ð´Ñтвом по быÑтрому Ñтарту в документации и Ñоздайте первый рабочий поток, затем наÑтройте иÑполнитель Forgejo, который будет выполнÑть задачи. +runs.no_workflows.help_no_write_access = ОзнакомьтеÑÑŒ Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸ÐµÐ¹, чтобы узнать про ДейÑÑ‚Ð²Ð¸Ñ Forgejo. +variables.not_found = Ðе удалоÑÑŒ найти переменную. [projects] type-1.display_name=Индивидуальный проект @@ -3908,7 +4016,6 @@ deleted.display_name = Удалённый проект [git.filemode] changed_filemode=%[1]s → %[2]s -; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … directory=Каталог normal_file=Обычный файл executable_file=ИÑполнÑемый файл @@ -3917,44 +4024,36 @@ submodule=Подмодуль -[graphs] -component_loading_failed = Ðе удалоÑÑŒ загрузить %s -component_failed_to_load = СлучилаÑÑŒ Ð½ÐµÐ¿Ñ€ÐµÐ´Ð²Ð¸Ð´ÐµÐ½Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°. -contributors.what = ÑоучаÑтие -component_loading = Загрузка %s... -component_loading_info = Это займёт некоторое времÑ… -code_frequency.what = чаÑтота изменений -recent_commits.what = недавние коммиты - - [search] -search = ПоиÑк... +search = ПоиÑк… fuzzy_tooltip = Включает результаты, доÑтаточно похожие на запроÑ, даже при наличии неточноÑтей type_tooltip = Тип поиÑка fuzzy = Приблизительный match = Точный -repo_kind = ПоиÑк репозиториев... -user_kind = ПоиÑк пользователей... -org_kind = ПоиÑк организаций... -team_kind = ПоиÑк команд... -code_kind = ПоиÑк по коду... -package_kind = ПоиÑк пакетов... -project_kind = ПоиÑк проектов... -branch_kind = ПоиÑк ветвей... -commit_kind = ПоиÑк коммитов... +repo_kind = Ðайти репозитории… +user_kind = Ðайти пользователей… +org_kind = Ðайти организации… +team_kind = Ðайти команды… +code_kind = Ðайти в коде… +package_kind = Ðайти пакеты… +project_kind = Ðайти проекты… +branch_kind = Ðайти ветви… +commit_kind = Ðайти коммиты… no_results = По запроÑу ничего не найдено. -keyword_search_unavailable = ПоиÑк по ключевым Ñловам недоÑтупен. Уточните подробноÑти у админиÑтратора. +keyword_search_unavailable = ПоиÑк по ключевым Ñловам недоÑтупен. Уточните подробноÑти у админиÑтратора Ñервера. match_tooltip = Включать только результаты, точно ÑоответÑтвующие запроÑу -code_search_unavailable = ПоиÑк по коду ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ´Ð¾Ñтупен. Уточните подробноÑти у админиÑтратора. -runner_kind = ПоиÑк иÑполнителей... -code_search_by_git_grep = Эти результаты получены через «git grep». Результатов может быть больше, еÑли админиÑтратор Ñервера включит индекÑатор кода. +code_search_unavailable = ПоиÑк в коде недоÑтупен. Уточните подробноÑти у админиÑтратора Ñервера. +runner_kind = Ðайти иÑполнителей… +code_search_by_git_grep = Эти результаты получены через «git grep». Результатов может быть больше, еÑли на Ñервере будет включен индекÑатор кода. exact = Точный exact_tooltip = Включает только результаты, в точноÑти ÑоответÑтвующие запроÑу -issue_kind = ПоиÑк задач... -pull_kind = ПоиÑк ÑлиÑний... +issue_kind = Ðайти задачи… +pull_kind = Ðайти ÑлиÑниÑ… union_tooltip = Включает результаты Ñ Ñовпавшими ключевыми Ñловами, разделёнными пробелами union = Обычный -milestone_kind = ПоиÑк Ñтапов... +milestone_kind = Ðайти Ñтапы... +regexp = РегулÑрное выражение +regexp_tooltip = ПоиÑковый Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð±ÑƒÐ´ÐµÑ‚ воÑпринÑÑ‚ как регулÑрное выражение [markup] @@ -3963,4 +4062,24 @@ filepreview.lines = Строки Ñ %[1]d по %[2]d в %[3]s filepreview.truncated = ПредпроÑмотр был обрезан [translation_meta] -test = хи-хи! \ No newline at end of file +test = Forgejo + +[repo.permissions] +code.write = ЗапиÑÑŒ: отправка изменений в репозиторий, Ñоздание веток и тегов. +code.read = Чтение: проÑмотр и клонирование иÑходного кода репозиториÑ. +issues.read = Чтение: проÑмотр и Ñоздание задач и комментариев. +pulls.read = Чтение: проÑмотр и открытие запроÑов ÑлиÑний. +releases.read = Чтение: проÑмотр выпуÑков и Ñкачивание файлов. +releases.write = ЗапиÑÑŒ: публикациÑ, изменение и удаление выпуÑков и их файлов. +wiki.read = Чтение: проÑмотр Ñтраниц и иÑтории Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñтроенной вики. +projects.write = ЗапиÑÑŒ: Ñоздание и изменение проектов и колонок. +packages.write = ЗапиÑÑŒ: Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¸ удаление пакетов в репозитории. +projects.read = Чтение: проÑмотр проектов в репозитории. +ext_wiki = ДоÑтуп ко ÑÑылке на внешнюю вики. ÐаÑтройка разрешений выполнÑетÑÑ Ð²Ð½Ðµ Ñайта. +actions.read = Чтение: проÑмотр интегрированных конвейеров CI/CD и их логов. +pulls.write = ЗапиÑÑŒ: закрытие запроÑов ÑлиÑний и изменение их метаданных: меток, Ñтапа, назначений, Ñрока Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¸ завиÑимоÑтей и пр. +issues.write = ЗапиÑÑŒ: закрытие задач и изменение их метаданных: меток, Ñтапа, назначений, Ñрока Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¸ завиÑимоÑтей и пр. +actions.write = ЗапиÑÑŒ: ручной запуÑк, перезапуÑк, отмена и одобрение работы конвейеров CI/CD. +wiki.write = ЗапиÑÑŒ: Ñоздание, изменение и удаление Ñтраниц во вÑтроенной вики. +packages.read = Чтение: проÑмотр и Ñкачивание пакетов в репозитории. +ext_issues = ДоÑтуп к ÑÑылке на внешний трекер задач. ÐаÑтройка разрешений выполнÑетÑÑ Ð²Ð½Ðµ Ñайта. diff --git a/options/locale/locale_si-LK.ini b/options/locale/locale_si-LK.ini index bfb22176e8..6dbb6dc3c2 100644 --- a/options/locale/locale_si-LK.ini +++ b/options/locale/locale_si-LK.ini @@ -101,6 +101,11 @@ concept_user_organization=සංවිධà·à¶±à¶º name=නම +filter = පෙරහන +filter.is_archived = සංරක්ෂිත +filter.public = à¶´à·Šâ€à¶»à·ƒà·’ද්ධ +filter.private = පෞද්ගලික + [aria] [heatmap] @@ -116,7 +121,6 @@ missing_csrf=නරක ඉල්ලීම: CSRF à¶§à·à¶šà¶±à·Š නොමà·à¶­ app_desc=වේදනà·à¶šà·à¶»à·“, ස්වයං-සත්කà·à¶»à¶š Git සේවà·à·€à¶šà·Š install=ස්ථà·à¶´à¶±à¶ºà¶§ පහසුය platform=හරස් වේදිකà·à·€ -platform_desc=Forgejo ඕනෑම à¶­à·à¶±à¶š à¶°à·à·€à¶±à¶º Go සඳහ෠සම්පà·à¶¯à¶±à¶º à¶šà·… à·„à·à¶šà·’ය: වින්ඩà·à·ƒà·Š, මà·à¶šà·à·ƒà·Š, ලිනක්ස්, ARM, ආදිය ඔබ ආදරය කරන à¶‘à¶šà¶šà·Š à¶­à·à¶»à¶±à·Šà¶±! lightweight=à·ƒà·à·„à·à¶½à·Šà¶½à·” lightweight_desc=Forgejo à¶…à¶©à·” අවම à¶…à·€à·à·Šà¶ºà¶­à· ඇති à¶…à¶­à¶» මිල à¶…à¶©à·” Raspberry Pi මත à¶°à·à·€à¶±à¶º à¶šà·… à·„à·à¶šà·’ය. ඔබේ යන්ත්ර à·à¶šà·Šà¶­à·’ය සුරකින්න! license=විවෘත මූලà·à·à·Šâ€à¶» @@ -822,7 +826,7 @@ migrate.migrating_failed=%s සිට සංක්රමණය වීම migrate.migrating_failed_no_addr=සංක්රමණය à¶…à·ƒà·à¶»à·Šà¶®à¶šà¶ºà·’. migrate.git.description=ඕනෑම Git සේවà·à·€à¶šà·’න් පමණක් ගබඩà·à·€à¶šà·Š සංක්රමණය කරන්න. migrate.gitlab.description=gitlab.com හ෠වෙනත් GitLab අවස්ථ෠වලින් දත්ත සංක්රමණය කරන්න. -migrate.gitea.description=Gitea.com හ෠වෙනත් Gitea/Forgejo අවස්ථ෠වලින් දත්ත සංක්රමණය කරන්න. +migrate.gitea.description=Gitea.com හ෠වෙනත් Gitea අවස්ථ෠වලින් දත්ත සංක්රමණය කරන්න. migrate.gogs.description=notabug.org හ෠වෙනත් Gogs අවස්ථ෠වලින් දත්ත සංක්රමණය කරන්න. migrate.onedev.description=code.onedev.io හ෠වෙනත් OnedeV අවස්ථ෠වලින් දත්ත සංක්රමණය කරන්න. migrate.gitbucket.description=GitBucket අවස්ථ෠වලින් දත්ත සංක්රමණය කරන්න. @@ -890,6 +894,7 @@ file_copy_permalink=à¶´à·’à¶§à¶´à¶­à·Š මà·à¶¸à¶½à·’න්ක් video_not_supported_in_browser=ඔබගේ බ්රව්සරය HTML5 'වීඩියà·' à¶§à·à¶œà¶º සඳහ෠සහය නොදක්වයි. audio_not_supported_in_browser=ඔබගේ බ්රව්සරය HTML5 'à·à·Šà¶»à·€à·Šà¶º' à¶§à·à¶œà¶º සඳහ෠සහය නොදක්වයි. stored_lfs=Git LFS සමඟ ගබඩ෠+stored_annex=Git Annex සමඟ ගබඩ෠symbolic_link=සංකේතà·à¶­à·Šà¶¸à¶š සබà·à¶³à·’ය commit_graph=ප්රස්තà·à¶»à¶º à¶šà·à¶´ commit_graph.select=à·à·à¶›à· à¶­à·à¶»à¶±à·Šà¶± @@ -907,6 +912,7 @@ editor.upload_file=ගොනුව උඩුගත කරන්න editor.edit_file=ගොනුව සංස්කරණය editor.preview_changes=වෙනස්කම් පෙරදසුන editor.cannot_edit_lfs_files=LFS ගොනු වෙබ් අතුරු මුහුණත තුළ සංස්කරණය à¶šà·… නොහà·à¶š. +editor.cannot_edit_annex_files=Annex ගොනු වෙබ් අතුරු මුහුණත තුළ සංස්කරණය à¶šà·… නොහà·à¶š. editor.cannot_edit_non_text_files=ද්විමය ගොනු වෙබ් අතුරු මුහුණත තුළ සංස්කරණය à¶šà·… නොහà·à¶š. editor.edit_this_file=ගොනුව සංස්කරණය editor.this_file_locked=ගොනුවට අගුළු ල෠ඇත @@ -920,10 +926,10 @@ editor.or=à·„à· editor.cancel_lower=අවලංගු කරන්න editor.commit_signed_changes=අත්සන් à¶šà·… වෙනස්කම් සිදු කරන්න editor.commit_changes=වෙනස්කම් සිදු කරන්න -editor.add_tmpl='' à¶‘à¶šà¶­à·” කරන්න +editor.add_tmpl='<%s>' à¶‘à¶šà¶­à·” කරන්න editor.commit_message_desc=විකල්ප දීර්චවිස්තරයක් à¶‘à¶šà·Š කරන්න… editor.signoff_desc=à¶šà·à¶´à·€à·– ලොග් පණිවිඩය අවසà·à¶±à¶ºà·š දී à¶šà·à¶´à¶šà¶»à·” විසින් සිග්නෙඩ්-ඕෆ්-විසින් ට්රේලරයක් à¶‘à¶šà·Š කරන්න. -editor.commit_directly_to_this_branch=%s à·à·à¶›à·à·€à¶§ කෙලින්ම à¶šà·à¶´ කරන්න. +editor.commit_directly_to_this_branch=%[1]s à·à·à¶›à·à·€à¶§ කෙලින්ම à¶šà·à¶´ කරන්න. editor.create_new_branch=මෙම à¶šà·à¶´ කිරීම සඳහ෠නව à·à·à¶›à·à·€à¶šà·Š à·ƒà·à¶¯à· අදින්න ඉල්ලීමක් ආරම්භ කරන්න. editor.create_new_branch_np=මෙම à¶šà·à¶´ කිරීම සඳහ෠නව à·à·à¶›à·à·€à¶šà·Š à·ƒà·à¶¯à¶±à·Šà¶±. editor.propose_file_change=ගොනු වෙනස් කිරීම යà·à¶¢à¶±à· කරන්න @@ -1098,12 +1104,12 @@ issues.reopen_comment_issue=අදහස් දක්ව෠විවෘත à¶š issues.create_comment=අදහස issues.closed_at=`මෙම à¶œà·à¶§à·…ුව වස෠%[2]s` issues.reopened_at=`මෙම à¶œà·à¶§à·…ුව à¶±à·à·€à¶­ විවෘත කරන ලදි %[2]s` -issues.ref_issue_from=මෙම නිකුතුව %[4]s à·„à·’ %[2]s -issues.ref_pull_from=මෙම අදින්න ඉල්ලීම%[4]s %[2]s -issues.ref_closing_from=මෙම à¶œà·à¶§à·…ුව වස෠දමනු ඇත%[4]s මෙම à¶œà·à¶§à·…ුව %[2]s -issues.ref_reopening_from=මෙම à¶œà·à¶§à·…ුව à¶±à·à·€à¶­ විවෘත කරනු ඇත%[4]s මෙම à¶œà·à¶§à·…ුව %[2]s -issues.ref_closed_from=මෙම නිකුතුව%[4]s %[2]s -issues.ref_reopened_from=මෙම නිකුතුව%[4]s %[2]sà¶±à·à·€à¶­ විවෘත කරන ලදි +issues.ref_issue_from=`මෙම නිකුතුව %[4]s à·„à·’ %[2]s` +issues.ref_pull_from=`මෙම අදින්න ඉල්ලීම%[4]s %[2]s` +issues.ref_closing_from=`මෙම à¶œà·à¶§à·…ුව වස෠දමනු ඇත%[4]s මෙම à¶œà·à¶§à·…ුව %[2]s` +issues.ref_reopening_from=`මෙම à¶œà·à¶§à·…ුව à¶±à·à·€à¶­ විවෘත කරනු ඇත%[4]s මෙම à¶œà·à¶§à·…ුව %[2]s` +issues.ref_closed_from=`මෙම නිකුතුව%[4]s %[2]s` +issues.ref_reopened_from=`මෙම නිකුතුව%[4]s %[2]sà¶±à·à·€à¶­ විවෘත කරන ලදි` issues.ref_from=`හිම%[1]s` issues.role.owner=හිමිකරු issues.role.member=à·ƒà·à¶¸à·à¶¢à·’à¶š @@ -1183,7 +1189,7 @@ issues.error_modifying_due_date=නියමිත දිනය වෙනස් issues.error_removing_due_date=නියමිත දිනය ඉවත් කිරීමට අපොහොසත් විය. issues.push_commit_1=à¶‘à¶šà¶­à·” %d à¶šà·à¶´ %s issues.push_commits_n=à¶‘à¶šà¶­à·” %d විවරයන් %s -issues.force_push_codes=`බලය-pushed%[1]s සිට %[2]s %[4]s ගේ %[6]s` +issues.force_push_codes=`බලය-pushed%[1]s සිට %[2]s %[4]s ගේ %[6]s` issues.force_push_compare=සසඳන්න issues.due_date_form=Yyy-mm-dd issues.due_date_form_add=නියමිත දිනය à¶‘à¶šà¶­à·” කරන්න @@ -1269,7 +1275,7 @@ pulls.nothing_to_compare=මෙම à·à·à¶›à· සමà·à¶± වේ. අදි pulls.nothing_to_compare_and_allow_empty_pr=මෙම à·à·à¶›à· සමà·à¶± වේ. මෙම මහජන සම්බන්ධත෠හිස් වනු ඇත. pulls.has_pull_request=`මෙම à·à·à¶›à· à¶…à¶­à¶» අදින්න ඉල්ලීම දà·à¶±à¶§à¶¸à¶­à·Š පවතී: %[2]s #%[3]d` pulls.create=අදින්න ඉල්ලීම නිර්මà·à¶«à¶º -pulls.title_desc_few=%[1]d සිට %[2]s දක්ව෠%[3]s +pulls.title_desc_few=%[1]d සිට %[2]s දක්ව෠%[3]s pulls.merged_title_desc_few=මර්ජ්%[1]d සිට %[2]s දක්ව෠%[3]s %[4]s pulls.change_target_branch_at=`ඉලක්කගත à·à·à¶›à·à·€ %s සිට %s %sදක්ව෠වෙනස් à¶šà¶» ඇත` pulls.tab_conversation=සංවà·à¶¯à¶º @@ -1280,7 +1286,7 @@ pulls.cant_reopen_deleted_branch=à·à·à¶›à·à·€ මක෠දà·à¶¸à·– නි pulls.merged=සංයුක්ත කෙරිණි pulls.manually_merged=අතින් සංයුක්ත à¶šà¶» ඇත pulls.is_closed=අදින්න ඉල්ලීම වස෠දම෠ඇත. -pulls.title_wip_desc=අහම්බෙන් à¶’à¶šà·à¶¶à¶¯à·Šà¶° කිරීමෙන් අදින්න ඉල්ලීම à·€à·à·…à·à¶šà·Šà·€à·“ම සඳහ෠%s සමඟ මà·à¶­à·˜à¶šà·à·€ ආරම්භ කරන්න. +pulls.title_wip_desc=`අහම්බෙන් à¶’à¶šà·à¶¶à¶¯à·Šà¶° කිරීමෙන් අදින්න ඉල්ලීම à·€à·à·…à·à¶šà·Šà·€à·“ම සඳහ෠%s සමඟ මà·à¶­à·˜à¶šà·à·€ ආරම්භ කරන්න.` pulls.cannot_merge_work_in_progress=මෙම අදින්න ඉල්ලීම ක්රියà·à¶­à·Šà¶¸à¶š වන à¶šà·à¶»à·Šà¶ºà¶ºà¶šà·Š ලෙස සලකුණු à¶šà¶» ඇත. pulls.still_in_progress=තවමත් ක්රියà·à¶­à·Šà¶¸à¶š වෙමින් තිබේද? pulls.add_prefix=%s උපසර්ගය à¶‘à¶šà¶­à·” කරන්න @@ -1914,6 +1920,8 @@ error.csv.too_large=එය ඉත෠විà·à·à¶½ නිස෠මෙම à¶œ error.csv.unexpected=%d පේළියේ සහ %dතීරුවේ අනපේක්ෂිත චරිතයක් අඩංගු à¶¶à·à·€à·’න් මෙම ගොනුව විදà·à·„ුම්කරණය à¶šà·… නොහà·à¶š. error.csv.invalid_field_count=මෙම ගොනුව රේඛà·à·€à·š à·€à·à¶»à¶¯à·’ à¶šà·Šà·‚à·šà¶­à·Šà¶» සංඛ්යà·à·€à¶šà·Š ඇති à¶¶à·à·€à·’න් එය විදà·à·„ුම්කරණය à¶šà·… නොහà·à¶š %d. +milestones.filter_sort.name = නම + [graphs] [org] @@ -2463,6 +2471,9 @@ notices.op=ඔප්. notices.delete_success=පද්ධති දà·à¶±à·Šà·€à·“ම් මක෠දම෠ඇත. +config_summary = à·ƒà·à¶»à·à¶‚à·à¶º +config_settings = à·ƒà·à¶šà·ƒà·”ම් + [action] create_repo=නිර්මිත ගබඩà·à·€ %s rename_repo=%[1]s සිට %[3]sදක්ව෠නම් කරන ලද ගබඩà·à·€ @@ -2538,9 +2549,6 @@ owner.settings.cleanuprules.enabled=සබල à¶šà¶» ඇත [secrets] [actions] - - - runners.name=නම runners.owner_type=වර්ගය runners.description=සවිස්තරය @@ -2557,6 +2565,6 @@ runs.commit=à¶šà·à¶´ [projects] [git.filemode] -; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … symbolic_link=සංකේතà·à¶­à·Šà¶¸à¶š සබà·à¶³à·’ය +[search] diff --git a/options/locale/locale_sk-SK.ini b/options/locale/locale_sk-SK.ini index 29824c5b4d..885fcf0433 100644 --- a/options/locale/locale_sk-SK.ini +++ b/options/locale/locale_sk-SK.ini @@ -142,6 +142,12 @@ name=Meno value=Hodnota issues = Problémy +filter.is_archived = Archivované +filter.private = Súkromný + +toggle_menu = Prepni menu +more_items = Viac vecí + [aria] navbar=NavigaÄná liÅ¡ta footer=Päta @@ -176,7 +182,7 @@ string.desc=Z - A [error] occurred=Vyskytla sa chyba -report_message=Ak si myslíte, že ide o chybu Gitea, vyhľadajte problémy na GitHub-e alebo v prípade potreby otvorte nový problém. +report_message=Ak si myslíte, že ide o chybu Forgejo, vyhľadajte problémy na Codeberg-e alebo v prípade potreby otvorte nový problém. missing_csrf=Nesprávna žiadosÅ¥: neprítomný CSFR token invalid_csrf=Nesprávna žiadosÅ¥: nesprávny CSFR token not_found=Nebolo možné nájsÅ¥ cieľ. @@ -187,7 +193,6 @@ app_desc=Jednoducho prístupný vlastný Git install=Jednoduchá inÅ¡talácia install_desc=Jednoducho spustite binárku pre vaÅ¡u platformu, poÅ¡lite ju ako Docker, alebo ju získajte ako balíÄek. platform=Multiplatformový -platform_desc=Forgejo beží vÅ¡ade kde je možné preložiÅ¥ Go: Windows, macOS, Linux, ARM, a podobne. Vyberte si! lightweight=Ľahká lightweight_desc=Forgejo má minimálne požiadavky a môže bežaÅ¥ na Raspberry Pi. Å etrite energiou vášho stroja! license=Otvorený zdrojový kód @@ -1011,6 +1016,7 @@ view_git_blame=ZobraziÅ¥ Git Blame video_not_supported_in_browser=Váš prehliadaÄ nepodporuje HTML5 tag 'video'. audio_not_supported_in_browser=Váš prehliadaÄ nepodporuje HTML5 tag 'audio'. stored_lfs=Uložené pomocou Git LFS +stored_annex=Uložené pomocou Git Annex symbolic_link=Symbolický odkaz commit_graph=Graf commitov line=riadok @@ -1030,7 +1036,7 @@ editor.cancel_lower=ZruÅ¡iÅ¥ editor.commit_signed_changes=OdoslaÅ¥ podpísané zmeny editor.commit_changes=OdoslaÅ¥ zmeny editor.patch=PoužiÅ¥ patch -editor.commit_directly_to_this_branch=OdoslaÅ¥ zmeny revízie priamo do vetvy %s. +editor.commit_directly_to_this_branch=OdoslaÅ¥ zmeny revízie priamo do vetvy %[1]s. editor.cancel=ZruÅ¡iÅ¥ editor.commit_empty_file_header=OdoslaÅ¥ prázdny súbor editor.commit_empty_file_text=Súbor, ktorý sa chystáte odoslaÅ¥, je prázdny. PokraÄovaÅ¥? @@ -1362,9 +1368,6 @@ owner.settings.cleanuprules.enabled=Povolené [secrets] [actions] - - - runners.labels=Å títky @@ -1374,6 +1377,6 @@ runners.labels=Å títky [projects] [git.filemode] -; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … symbolic_link=Symbolický odkaz +[search] \ No newline at end of file diff --git a/options/locale/locale_sl.ini b/options/locale/locale_sl.ini index ffa1e38af6..7754796558 100644 --- a/options/locale/locale_sl.ini +++ b/options/locale/locale_sl.ini @@ -1,26 +1,23 @@ - - - [common] language = Jezik -passcode = Pristopna koda +passcode = Vstopna koda webauthn_error_timeout = Preden je bilo mogoÄe prebrati vaÅ¡ kljuÄ, je bil dosežen Äasovni rok. Ponovno naložite to stran in poskusite znova. cancel = PrekliÄi webauthn_sign_in = Pritisnite gumb na varnostnem kljuÄu. ÄŒe varnostni kljuÄ nima gumba, ga ponovno vstavite. -create_new = Ustvarite… +create_new = Ustvari … disabled = Invalidi go_back = Pojdi nazaj licenses = Licence -sign_in = Prijavite se +sign_in = Prijava activities = Dejavnosti copy_content = Kopiranje vsebine collaborative = Sodelovanje archived = Arhivirano -user_profile_and_more = Profil in nastavitve… +user_profile_and_more = Profil in nastavitve … view = Ogled your_settings = Nastavitve -explore = RaziÅ¡Äite -return_to_forgejo = Vrnitev v Forgejo +explore = RaziÅ¡Äi +return_to_forgejo = Nazaj na Forgejo write = NapiÅ¡ite webauthn_error_unknown = Zgodila se je neznana napaka. Prosimo, poskusite znova. webauthn_reload = Ponovno polnjenje @@ -41,10 +38,10 @@ page = Stran concept_system_global = Globalno forks = Vilice concept_user_organization = Organizacija -link_account = Povezava raÄun +link_account = Poveži raÄun your_profile = Profil copy_hash = Kopiraj hash -sign_out = Odjavite se +sign_out = Odjava settings = Nastavitve locked = Zaklenjeno error = Napaka @@ -79,7 +76,7 @@ active_stopwatch = Aktivno sledenje Äasu organization = Organizacija new_migrate = Nova migracija save = Shrani -sign_in_with_provider = Prijavite se z %s +sign_in_with_provider = Prijava s/z %s manage_org = Upravljanje organizacij new_repo = Nov repozitorij webauthn_error_unable_to_process = Strežnik ni mogel obdelati vaÅ¡e zahteve. @@ -87,24 +84,24 @@ register = Registracija mirror = Zrcalo access_token = Token za dostop download_logs = Prenos dnevnikov -webauthn_insert_key = Vstavite varnostni kljuÄ +webauthn_insert_key = Vnesite varnostni kljuÄ password = Geslo webauthn_error_duplicated = Varnostni kljuÄ za to zahtevo ni dovoljen. PrepriÄajte se, da kljuÄ Å¡e ni registriran. -template = Å ablona +template = Predloga webauthn_press_button = Pritisnite gumb na varnostnem kljuÄu… unknown = Neznano sign_up = Registracija enable_javascript = To spletno mesto zahteva JavaScript. twofa_scratch = Dvofaktorska koda Scratch home = Domov -powered_by = Poganja ga %s +powered_by = Poganja %s retry = Ponovite preview = Predogled mirrors = Ogledala loading = Nalaganje… show_full_screen = Prikaži celoten zaslon webauthn_error_insecure = WebAuthn podpira samo varne povezave. Za testiranje prek protokola HTTP lahko uporabite izvor "localhost" ali "127.0.0.1" -username = Usmerjevalno ime +username = UporabniÅ¡ko ime tracked_time_summary = Povzetek spremljanega Äasa na podlagi filtrov seznama zadev email = E-poÅ¡tni naslov captcha = CAPTCHA @@ -114,7 +111,7 @@ milestones = Mejniki ok = OK copy_branch = Kopiranje imena veje artifacts = Artefakti -signed_in_as = Prijavil se je kot +signed_in_as = Prijavljeni ste kot remove = Odstrani remove_all = Odstrani vse remove_label_str = Odstranite element "%s" @@ -243,7 +240,7 @@ smtp_from_helper = e-poÅ¡tni naslov, ki ga bo uporabljal Forgejo. Vnesite navade [admin] users.allow_git_hook_tooltip = Kljuke Git se izvajajo kot uporabnik operacijskega sistema, v katerem je nameÅ¡Äen program Forgejo, in imajo enako raven dostopa do gostitelja. Uporabniki s tem posebnim privilegijem Git Hook lahko dostopajo do vseh skladiÅ¡Ä Forgejo in spreminjajo vse zbirke Forgejo ter podatkovno bazo, ki jo uporablja Forgejo. PoslediÄno lahko pridobijo tudi skrbniÅ¡ke privilegije Forgejo. auths.force_smtps_helper = SMTPS se vedno uporablja na vratih 465. ÄŒe želite, da se SMTPS uporablja tudi na drugih vratih, to nastavite. (V nasprotnem primeru se bo STARTTLS uporabljal na drugih vratih, Äe ga gostitelj podpira.) -self_check.database_fix_mysql = Uporabniki MySQL/MariaDB lahko za odpravo težav s kollacijo uporabite ukaz "gitea doctor convert", lahko pa težavo odpravite tudi z ukazom "ALTER ... COLLATE ..." SQL roÄno. +self_check.database_fix_mysql = Uporabniki MySQL/MariaDB lahko za odpravo težav s kollacijo uporabite ukaz "forgejo doctor convert", lahko pa težavo odpravite tudi z ukazom "ALTER ... COLLATE ..." SQL roÄno. users.purge_help = Prisilno izbriÅ¡ite uporabnika in vsa skladiÅ¡Äa, organizacije in pakete, ki so v njegovi lasti. Izbrisani bodo tudi vsi komentarji in vpraÅ¡anja, ki jih je objavil ta uporabnik. auths.sspi_default_language_helper = Privzet jezik za uporabnike, samodejno ustvarjene z metodo avtentikacije SSPI. Pustite prazno, Äe želite, da se jezik zazna samodejno. auths.restricted_filter_helper = Pustite prazno, Äe ne želite nastaviti nobenega uporabnika kot omejenega. Uporabite zvezdico ("*"), Äe želite vse uporabnike, ki se ne ujemajo z administratorskim filtrom, nastaviti kot omejene. @@ -312,7 +309,7 @@ appearance = Videz password = Geslo authorized_oauth2_applications_description = Tem aplikacijam tretjih oseb ste odobrili dostop do svojega osebnega raÄuna Forgejo. Prosimo, da prekliÄete dostop do aplikacij, ki jih ne uporabljate veÄ. social_desc = S temi družabnimi raÄuni se lahko prijavite v svoj raÄun. PrepriÄajte se, da jih vse prepoznate. -access_token_desc = Izbrana dovoljenja žetona omejujejo avtorizacijo samo na ustrezne poti API. Za veÄ informacij preberite dokumentacijo. +access_token_desc = Izbrana dovoljenja žetona omejujejo avtorizacijo samo na ustrezne poti API. Za veÄ informacij preberite dokumentacijo. oauth2_client_secret_hint = Skrivnost se ne bo veÄ prikazala, ko zapustite ali osvežite to stran. PrepriÄajte se, da ste jo shranili. twofa_desc = Za zaÅ¡Äito raÄuna pred krajo gesla lahko uporabite pametni telefon ali drugo napravo za prejemanje Äasovno omejenih enkratnih gesel ("TOTP"). twofa_recovery_tip = ÄŒe napravo izgubite, boste lahko z obnovitvenim kljuÄem za enkratno uporabo ponovno pridobili dostop do raÄuna. @@ -555,7 +552,7 @@ repo.collaborator.added.subject = %s vas je dodal v %s team_invite.subject = %[1]s vas je povabil, da se pridružite organizaciji %[2]s issue.action.new = @%[1]s ustvaril #%[2]d. team_invite.text_1 = %[1]s vas je povabil, da se pridružite ekipi %[2]s v organizaciji %[3]s. -team_invite.text_3 = Opomba: To vabilo je bilo namenjeno %[1]. ÄŒe tega vabila niste priÄakovali, ga lahko ignorirate. +team_invite.text_3 = Opomba: To vabilo je bilo namenjeno %[1]s. ÄŒe tega vabila niste priÄakovali, ga lahko ignorirate. reply = ali neposredno odgovorite na to e-poÅ¡tno sporoÄilo activate_email = Preverite svoj e-poÅ¡tni naslov activate_email.title = %s, preverite svoj e-poÅ¡tni naslov @@ -691,4 +688,4 @@ code = Koda owner.settings.chef.keypair.description = Za preverjanje pristnosti v registru Chef je potreben par kljuÄev. ÄŒe ste par kljuÄev ustvarili že prej, se pri ustvarjanju novega para kljuÄev stari par kljuÄev zavrže. [actions] -runners.runner_manage_panel = Upravljanje tekaÄev +runners.runner_manage_panel = Upravljanje tekaÄev \ No newline at end of file diff --git a/options/locale/locale_sr-SP.ini b/options/locale/locale_sr-SP.ini index e091f91a68..56c1a7e650 100644 --- a/options/locale/locale_sr-SP.ini +++ b/options/locale/locale_sr-SP.ini @@ -62,7 +62,7 @@ federated_avatar_lookup_popup=Омогућите federated avatars lookup да enable_captcha_popup=Тражи Captcha приликом региÑтрације кориÑника. admin_password=Лозинка confirm_password=Потврдите лозинку -install_btn_confirm=УÑпоÑтави Gitea +install_btn_confirm=УÑпоÑтави Forgejo test_git_failed=Команда 'git' није уÑпела: %v [home] @@ -89,7 +89,6 @@ has_unconfirmed_mail=Здраво, %s! Имате непотврђену адр resend_mail=Кликните овде да поново пошаљете пиÑмо [mail] - activate_account=Молимо Ð²Ð°Ñ Ð°ÐºÑ‚Ð¸Ð²Ð¸Ñ€Ð°Ñ˜Ñ‚Ðµ ваш налог activate_email=Потврдите вашу адреÑу е-поште @@ -266,7 +265,7 @@ editor.commit_changes=Изврши комит промена editor.add=Додај '%s' editor.update=Ðжурирај '%s' editor.delete=Уклони '%s' -editor.commit_directly_to_this_branch=Изврши комит директно на %s грану. +editor.commit_directly_to_this_branch=Изврши комит директно на %[1]s грану. editor.create_new_branch=Креирај нову грану за овај комит и поднеÑи захтев за Ñпајање. editor.cancel=Откажи editor.branch_already_exists=Грана '%s' већ поÑтоји за ово Ñпремиште. @@ -356,9 +355,6 @@ pulls.tab_commits=Комити pulls.merged=Спојено pulls.can_auto_merge_desc=Овај захтев за Ñпајање може бити обављен аутоматÑки. -; %[2]s
      %[3]s
      - - milestones.new=Ðова фаза milestones.open_tab=%d отворено milestones.close_tab=%d затворено @@ -728,5 +724,4 @@ remove_file=Уклони датотеку [gpg] -[units] - +[units] \ No newline at end of file diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index 71eddbd550..23544b782b 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -16,7 +16,7 @@ template=Mall language=SprÃ¥k notifications=Notiser create_new=Skapa… -user_profile_and_more=Profil och Inställningar… +user_profile_and_more=Profil och inställningar… signed_in_as=Inloggad som toc=InnehÃ¥llsförteckning licenses=Licenser @@ -38,7 +38,7 @@ organization=Organisation mirror=Spegel new_repo=Ny utvecklingskatalog new_migrate=Ny migrering -new_mirror=Ny Spegling +new_mirror=Ny spegling new_fork=Ny förgrening av utvecklingskatalog new_org=Ny organisation new_project=Nytt projekt @@ -57,7 +57,7 @@ collaborative=Kollaborativa forks=Forks activities=Aktiviteter -pull_requests=Pull förfrÃ¥gningar +pull_requests=Pull-förfrÃ¥gningar issues=Ärenden milestones=Milstolpar @@ -77,7 +77,7 @@ write=Skriv preview=Förhandsgranska loading=Laddar… -error404=Sidan du försöker nÃ¥ finns inte eller sÃ¥ har du inte behörighet att se den. +error404=Sidan du försöker nÃ¥ finns inte, har tagits bort eller sÃ¥ har du inte behörighet att se den. @@ -94,22 +94,127 @@ name=Namn logo = Logotyp sign_in_with_provider = Logga in med %s enable_javascript = Denna webbplats kräver JavaScript. +ok = OK +more_items = Fler saker +webauthn_sign_in = Tryck pÃ¥ knappen pÃ¥ din säkerhetsnyckel. Om din säkerhetsnyckel inte har en knapp, dra ut den och sätt in den igen. +new_project_column = Ny kolumn +copy_type_unsupported = Den här filtypen kan inte kopieras +error = Fel +retry = Försök igen +rerun_all = Kör om alla jobb +copy_success = Kopierad! +locked = LÃ¥st +copy = Kopiera +copy_url = Kopiera URL +copy_error = Kopiering misslyckades +copy_content = Kopiera innehÃ¥ll +webauthn_insert_key = Skriv in din säkerhetsnyckel +webauthn_press_button = Var god tryck pÃ¥ knappen pÃ¥ din säkerhetsnyckel… +webauthn_error = Kunde inte läsa din säkerhetsnyckel. +webauthn_unsupported_browser = Din webbläsare har inte ännu stöd för WebAuthn. +webauthn_error_unknown = Ett okänt fel har inträffat. Var god försök igen. +webauthn_error_empty = Du mÃ¥ste ange ett namn för den här nyckeln. +new_org.title = Ny organisation +new_org.link = Ny organisation +test = Test +concept_system_global = Global +concept_user_individual = Individuell +rss_feed = RSS-flöde +never = Aldrig +unknown = Okänd +confirm_delete_artifact = Är du säker pÃ¥ att du vill ta bort artefakten "%s"? +artifacts = Artefakter +show_timestamps = Visa tidsstämpel +show_full_screen = Visa i fullskärm +download_logs = Ladda ner loggar +go_back = GÃ¥ tillbaka +show_log_seconds = Visa sekunder +rerun = Kör om +filter = Filter +filter.is_archived = Arkiverade +filter.clear = Rensa filter +filter.is_mirror = Speglar +copy_path = Kopiera sökväg +unpin = Lossa +value = Värde +filter.not_archived = Inte arkiverade +error413 = Du har använt upp din kvot. +invalid_data = Ogiltig data: %v +filter.not_template = Inte mallar +copy_hash = Kopiera hash +view = Se +copy_branch = Kopiera grennamn +pin = Fäst +filter.public = Publika +new_repo.title = Ny utvecklingskatalog +new_migrate.title = Ny migrering +new_repo.link = Ny utvecklingskatalog +new_migrate.link = Ny migrering +filter.not_mirror = Inte speglar +filter.is_template = Mallar +filter.private = Privata +active_stopwatch = SpÃ¥rning av aktiv tid +tracked_time_summary = Sammanfattning av spÃ¥rad tid baserat pÃ¥ filter av ärendelistan +toggle_menu = Visningsmeny +confirm_delete_selected = Bekräfta för att ta bort alla valda objekt? +webauthn_error_timeout = Timeout uppnÃ¥ddes innan din nyckel kan läsas. Vänligen ladda om denna sida och försök igen. +filter.is_fork = Förgreningar +webauthn_error_duplicated = Säkerhetsnyckeln är inte tillÃ¥ten för denna begäran. Se till att nyckeln inte redan är registrerad. +filter.not_fork = Inte förgrenade +remove_label_str = Ta bort objektet "%" +webauthn_use_twofa = Använd en tvÃ¥faktorskod frÃ¥n din telefon +webauthn_error_insecure = WebAuthn stöder endast säkra anslutningar. För testning över HTTP kan du använda "localhost" eller "127.0.0.1" +webauthn_error_unable_to_process = Servern kunde inte hantera din begäran. +copy_generic = Kopiera till urklipp [aria] +footer.software = Om den här mjukvaran +footer.links = Länkar +footer = Sidfot +navbar = Navigeringsfält [heatmap] +contributions_one = bidrag +contributions_zero = Inga bidrag +contributions_format = {contributions} pÃ¥ {day} {month}, {year} +contributions_few = bidrag +less = Mindre +more = Mer +number_of_contributions_in_the_last_12_months = %s bidrag under de senaste 12 mÃ¥naderna [editor] +buttons.quote.tooltip = Citera text +buttons.code.tooltip = Lägg till kod +buttons.link.tooltip = Lägg till en länk +buttons.heading.tooltip = Lägg till rubrik +buttons.bold.tooltip = Lägg till fetstilt text +buttons.italic.tooltip = Lägg till kursiv text +buttons.list.unordered.tooltip = Lägg till en punktlista +buttons.list.ordered.tooltip = Lägg till en numrerad lista +buttons.list.task.tooltip = Lägg till en lista med sysslor +buttons.mention.tooltip = Nämn en användare eller ett team +buttons.ref.tooltip = Hänvisa till ett ärende eller en pull request +buttons.new_table.tooltip = Lägg till tabell +table_modal.header = Lägg till tabell +table_modal.placeholder.header = Sidhuvud +table_modal.placeholder.content = InnehÃ¥ll +table_modal.label.rows = Rader +table_modal.label.columns = Kolumner [filter] +string.asc = 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. [startpage] app_desc=En smidig, självhostad Git-tjänst install=Lätt att installera platform=Plattformsoberoende -platform_desc=Forgejo kan köra överallt där Go kan kompileras: Windows, macOS, Linux, ARM, etc. Välj den du gillar! +platform_desc=Forgejo har bekräftats körbart pÃ¥ libre-operativsystem sÃ¥ som Linux och FreeBSD, samt pÃ¥ olika CPU-arkitekturer. Välj den du älskar! lightweight=Lättviktig lightweight_desc=Forgejo har lÃ¥ga minimum-krav och kan köras pÃ¥ en billig Rasperry Pi. Spara pÃ¥ din maskins kraft! license=Öppen källkod @@ -139,85 +244,103 @@ err_admin_name_pattern_not_allowed=Administratörens användarnamn är ogiltigt, err_admin_name_is_invalid=Administratörsanvändarnamnet är ogiltigt general_title=Allmänna inställningar -app_name=Sajtens namn -app_name_helper=Du kan ange ditt företagsnamn här. +app_name=Instansens titel +app_name_helper=Skriv in din instans namn här. Det kommer att visas pÃ¥ varje sida. repo_path=Rotsökväg för utvecklingskatalog repo_path_helper=Fjärrutvecklingskataloger kommer att sparas i denna katalog. -lfs_path=LFS Rotsökväg +lfs_path=LFS rotsökväg lfs_path_helper=Filer hanterade av Git LFS kommer att sparas i denna mapp. Lämna tom för att avaktivera. -run_user=Kör som användarnamn +run_user=Användare att köra som ssh_port=SSH-serverport -ssh_port_helper=Portnumret som din SSH-server lyssnar pÃ¥. Lämna tom för att inaktivera. -http_port=Forgejo HTTP-lyssningsport -http_port_helper=Portnumret som Forgejos webbserver kommer lyssna pÃ¥. -app_url=Forgejo URL +ssh_port_helper=Portnumret som din SSH-server använder. Lämna tom för att inaktivera SSH-server. +http_port=HTTP-lyssningsport +http_port_helper=Portnumret som kommer att användas av Forgejos webbserver. +app_url=Bas-URL app_url_helper=Basadressen för HTTP(S)-kloningslänkar och mejlnotifikationer. log_root_path=Loggsökväg log_root_path_helper=Loggfiler kommer skrivas till denna katalog. optional_title=Övriga inställningar -email_title=Mejlinställningar +email_title=E-postinställningar smtp_addr=SMTP-server smtp_port=SMTP-port -smtp_from=Skicka Mejl Som +smtp_from=Skicka E-post som smtp_from_helper=Mejladress som Forgejo kommer att använda. Anges i simpelt ('email@example.com') eller fullständigt ('Name ') format. -mailer_user=SMTP-Användarnamn -mailer_password=SMTP-Lösenord -register_confirm=Kräv Bekräftelse Via Mejl För Att Registrera -mail_notify=Aktivera Mejlnotifikationer -server_service_title=Inställningar för Server- och Tredjepartstjänster -offline_mode=Aktivera Lokalt Läge +mailer_user=SMTP-användarnamn +mailer_password=SMTP-lösenord +register_confirm=Kräv bekräftelse via E-post för att registrera +mail_notify=Aktivera E-postnotifikationer +server_service_title=Inställningar för server- och tredjepartstjänster +offline_mode=Aktivera lokalt läge offline_mode.description=Inaktivera CDN frÃ¥n tredjepart och distribuera samtliga resurser lokalt istället. disable_gravatar=Inaktivera Gravatar -disable_gravatar.description=Inaktivera Gravatar- och avatarskällor frÃ¥n tredjepart. Om användaren inte laddar upp en avatar sÃ¥ kommer en standardavatar att användas. -federated_avatar_lookup=Aktivera Federerade Avatarer -federated_avatar_lookup.description=Använd libravatar vid förenad uppslagning av avatarer. -disable_registration=Inaktivera Självregistrering -disable_registration.description=Inaktivera självregistrering av användare. Endast administratörer kommer kunna skapa nya konton. -allow_only_external_registration.description=TillÃ¥t registrering endast via externa tjänster +disable_gravatar.description=Inaktivera Gravatar- och avatarskällor frÃ¥n tredjepart. Standardbilder kommer att användas för användaravatarer om dom inte laddar upp en egen avatar till instansen. +federated_avatar_lookup=Aktivera federerade avatarer +federated_avatar_lookup.description=Använd Libavatar för uppslagning av avatarer. +disable_registration=Inaktivera självregistrering +disable_registration.description=Endast instansens administratörer kommer kunna skapa nya konton. Det rekommenderas starkt att inaktivera självregistrering av användare om du inte tänker driva en publik instans för alla och är redo att hantera en stor mängd spam-konton. +allow_only_external_registration.description=Användare kommer endast kunna skapa nya konton genom att använda konfigurerade externa tjänster. openid_signin=Aktivera OpenID-inloggning -openid_signin.description=Aktivera användarinloggning via OpenID. +openid_signin.description=TillÃ¥t användare att logga in via OpenID. openid_signup=Aktivera självregistrering genom OpenID -openid_signup.description=Aktivera OpenID-baserad självregistrering av användare. +openid_signup.description=TillÃ¥t användare att skapa konton via OpenID om självregistrering är aktiverad. enable_captcha=Aktivera CAPTCHA registrering -enable_captcha.description=Kräv captcha för användarregistrering. -require_sign_in_view=Kräv Inloggning För Att Visa Sidor -admin_setting.description=Skapandet av administratörskonto är frivilligt. Den första användaren som registreras blir automatiskt administratör. -admin_title=Inställningar för Administratörskonto -admin_name=Användarnamn för Administratör +enable_captcha.description=Kräv att användare klarar CAPTCHA för att registrera konton. +require_sign_in_view=Kräv inloggning för att visa instansens innehÃ¥ll +admin_setting.description=Skapandet av ett administratörskonto är frivilligt. Den första användaren som registreras blir automatiskt administratör. +admin_title=Inställningar för administratörskonto +admin_name=Användarnamn för administratör admin_password=Lösenord confirm_password=Bekräfta lösenord -admin_email=Mejladress +admin_email=E-postadress install_btn_confirm=Installera Forgejo -test_git_failed=Misslyckades att testa 'git' kommando: %v -sqlite3_not_available=Denna version av Forgejo stödjer ej SQLite3. Ladda ner den officiella binären frÃ¥n %s (inte 'gobuild' versionen). +test_git_failed=Misslyckades att testa "git" kommando: %v +sqlite3_not_available=Denna version av Forgejo stödjer inte SQLite3. Ladda ner den officiella binären frÃ¥n %s (inte "gobuild" versionen). invalid_db_setting=Databasinställningarna är ogiltiga: %v invalid_repo_path=Utvecklingskatalogens rotsökväg är ogiltig: %v run_user_not_match=Systemtjänstanvändaren är inte den nuvarande användaren: %s -> %s save_config_failed=Misslyckades att spara konfigurationen: %v invalid_admin_setting=Inställning för administartörskontot är ogiltig: %v invalid_log_root_path=Sökvägen för loggar är ogiltig: %v -default_keep_email_private=Dölj mailadresser som standard -default_keep_email_private.description=Dölj mailadresser för nya användarkonton som standard. +default_keep_email_private=Dölj e-postadresser som standard +default_keep_email_private.description=Dölj e-postadress för nya användarkonton som standard sÃ¥ att den informationen inte omedelbart läcker efter registrering. default_allow_create_organization=TillÃ¥t skapandet utav organisationer som standard -default_allow_create_organization.description=TillÃ¥t nya användarkonton att skapa organisationer som standard. -default_enable_timetracking=Aktivera tidredovisning som Standard +default_allow_create_organization.description=TillÃ¥t nya användarkonton att skapa organisationer som standard. När detta alternativt ej är aktivt sÃ¥ behöver en administratör tilldela rättigheter att skapa organisationer till nya användare. +default_enable_timetracking=Aktivera tidredovisning som standard default_enable_timetracking.description=Aktivera tidsredovisning för nya utvecklingskataloger som standard. -no_reply_address=Dold mejldomän -no_reply_address_helper=Domännamn för användare med en dold mailadress. Exempelvis kommer användarnamnet 'joe' att loggas i Git som 'joe@noreply.example.org' om dold maildomän är satt till 'noreply.example.org'. +no_reply_address=Dold e-postdomän +no_reply_address_helper=Domännamn för användare med en dold e-postadress. Exempelvis kommer användarnamnet "joe" att loggas i Git som "joe@noreply.example.org" om den dolda e-postdomänen är satt till "noreply.example.org". +require_db_desc = Forgejo kräver MySQL, PostgreSQL, SQLite3 eller TiDB (MySQL-protokoll). +allow_only_external_registration = TillÃ¥t registrering endast via externa tjänster +app_slogan = Instansslogan +app_slogan_helper = Skriv in din slogan här. Lämna tom för att stänga av. +domain = Serverdomän +domain_helper = Domän eller värdadress för servern. +reinstall_error = Du försöker att installera i en existerande Forgejo-databas +password_algorithm_helper = Ställ in hashalgoritmen för lösenord. Algoritmer har olika krav och styrka. Argon2-algoritmen är ganska säker men använder mycket minne och kan vara olämplig för smÃ¥ system. +config_location_hint = Dessa konfigurationsinställningar kommer att sparas i: +invalid_db_table = Databastabellen "%s" är ogiltig: %v +secret_key_failed = Misslyckades att generera hemlig nyckel: %v +allow_dots_in_usernames = TillÃ¥t användare att använda punkter i sina användarnamn. PÃ¥verkar inte befintliga användare. +reinstall_confirm_message = Ominstallation med en befintlig Forgejo-databas kan orsaka flera problem. I de flesta fall bör du använda din befintliga "app.ini" för att köra Forgejo. Om du vet vad du hÃ¥ller pÃ¥ med, bekräfta följande: +require_sign_in_view.description = Begränsa Ã¥tkomst till innehÃ¥ll till inloggade användare. Gäster kommer endast att kunna besöka autentiseringssidorna. +invalid_app_data_path = Sökvägen för appdata är ogiltig: %v +internal_token_failed = Misslyckades att generera intern token: %v +password_algorithm = Hashalgoritm för lösenord +invalid_password_algorithm = Ogiltig hashalgoritm för lösenord [home] -uname_holder=Användarnamn eller Mejladress +uname_holder=Användarnamn eller e-postadress password_holder=Lösenord -switch_dashboard_context=Växla Visad Instrumentpanel +switch_dashboard_context=Växla visad instrumentpanel my_repos=Utvecklingskataloger show_more_repos=Visa flera utvecklingskataloger… collaborative_repos=Kollaborativa Utvecklingskataloger -my_orgs=Mina organisationer +my_orgs=Organisationer my_mirrors=Mina speglar view_home=Visa %s search_repos=Hitta en utvecklingskatalog… -filter=Övriga Filter +filter=Övriga filter show_archived=Arkiverade show_both_archived_unarchived=Visar bÃ¥de arkiverade och icke arkiverade @@ -230,6 +353,7 @@ show_only_private=Visar endast privata show_only_public=Visar endast publika issues.in_your_repos=I dina utvecklingskataloger +filter_by_team_repositories = Filtrera efter lagutvecklingskataloger [explore] repos=Utvecklingskataloger @@ -242,9 +366,13 @@ user_no_results=Inga matchande användare hittades. org_no_results=Inga matchande organisationer hittades. code_no_results=Ingen källkod hittades som matchar din sökterm. code_last_indexed_at=Indexerades senast %s +stars_one = %d stjärna +go_to = GÃ¥ till +relevant_repositories = Endast relevanta utvecklingskataloger visas, visa ofiltrerade resultat. +stars_few = %d stjärnor [auth] -create_new_account=Registrera Konto +create_new_account=Registrera konto register_helper_msg=Har du redan ett konto? Logga in nu! social_register_helper_msg=Har du redan ett konto? Länka det nu! disable_register_prompt=Registrering inaktiverad. Vänligen kontakta din sidadministratör. @@ -253,18 +381,18 @@ remember_me=Kom ihÃ¥g denna enhet forgot_password_title=Glömt lösenord forgot_password=Glömt lösenord? sign_up_now=Behöver du ett konto? Registrera nu. -confirmation_mail_sent_prompt=Ett nytt bekräftelsemail has skickats till %s. Vänligen kolla din inkorg inom dom kommande %s för att slutföra registreringsprocessen. +confirmation_mail_sent_prompt=Ett nytt bekräftelsemejl has skickats till %s. För att slutföra registreringsprocessen, vänligen kolla din inkorg inom dom kommande %s. Om e-postadressen är felaktig sÃ¥ kan du logga in och begära att fÃ¥ ett nytt bekräftelsemejlet skickat till en annan e-postadressen. must_change_password=Ändra ditt lösenord allow_password_change=Kräv att användaren byter lösenord (rekommenderas) -reset_password_mail_sent_prompt=Ett nytt bekräftelsemail has skickats till %s. Vänligen kontrollera din inkorg inom de kommande %s för att slutföra Ã¥terställning av ditt konto. +reset_password_mail_sent_prompt=Ett nytt bekräftelsemail has skickats till %s. För att slutföra Ã¥terställning av ditt konto, kontrollera din inkorg och gÃ¥ till den bifogade länken inom de kommande %s. active_your_account=Aktivera ditt konto account_activated=Kontot har aktiverats -prohibit_login=Inloggning otillÃ¥ten +prohibit_login=Kontot är avstängd resent_limit_prompt=Du har redan begärt ett aktiveringsmejl nyligen. Vänligen vänta 3 minuter och försök igen. has_unconfirmed_mail=Hej %s, du har en obekräftad epostaddress (%s). Om du inte har fÃ¥tt ett bekräftelsemail eller behöver ett nytt, klicka pÃ¥ knappen nedan. resend_mail=Klicka här för att skicka ditt aktiveringsmejl igen email_not_associate=Denna e-postadress är inte knutet till nÃ¥got konto. -send_reset_mail=Skicka mail för kontoÃ¥terställning +send_reset_mail=Skicka mejl för kontoÃ¥terställning reset_password=KontoÃ¥terställning invalid_code=Din bekräftelsekod är ogiltig eller har löpt ut. reset_password_helper=Ã…terställ konto @@ -298,9 +426,24 @@ authorize_title=Ge "%s" tillgÃ¥ng till ditt konto? authorization_failed=Auktorisering misslyckades sspi_auth_failed=SSPI-autentisering misslyckades password_pwned_err=Kunde inte slutföra begäran till HaveIBeenPwned +reset_password_wrong_user = Du är inloggad som %s, men kontoÃ¥terställningslänken är avsedd för %s +invalid_code_forgot_password = Din bekräftelsekod är ogiltig eller har gÃ¥tt ut. Klicka pÃ¥ här för att pÃ¥börja en ny session. +invalid_password = Ditt lösenord matchar inte lösenordet som användes för att skapa kontot. +openid_signin_desc = Ange din OpenID URI. Till exempel: alice.openid.example.org eller https://openid.example.org/alice. +sign_in_openid = Fortsätt med OpenID +hint_login = Har du redan ett konto? Logga in nu! +change_unconfirmed_email_summary = Ändra e-postadressen som aktiveringsmejl skickas till. +change_unconfirmed_email_error = Det gÃ¥r inte att ändra e-postadressen: %v +use_onetime_code = Använde en engÃ¥ngskod +last_admin = Du kan inte ta bort den sista administratören. Det mÃ¥ste finnas minst en administratör. +back_to_sign_in = Tillbaka till Logga in +hint_register = Behöver du ett konto? Registrera ett nu. +prohibit_login_desc = Ditt konto har blivit avstängt frÃ¥n att interagera med instansen. Kontakta instansadministratören för att Ã¥terfÃ¥ tillgÃ¥ng. +password_pwned = Lösenordet du valde finns pÃ¥ en lista över stulna lösenord som tidigare exponerats i offentliga dataintrÃ¥ng. Försök igen med ett annat lösenord och överväg att ändra detta lösenord pÃ¥ annat hÃ¥ll ocksÃ¥. +sign_up_button = Registrera dig. +sign_up_successful = Kontot skapades. Välkommen! [mail] - activate_account=Vänligen aktivera ditt konto activate_email=Verifiera din epostaddress @@ -310,6 +453,14 @@ register_notify=Välkommen till %s reset_password=Ã…terställ ditt konto register_success=Registreringen lyckades +password_change.subject = Ditt lösenord har uppdaterats +password_change.text_1 = Lösenordet för ditt konto ändrades just. +primary_mail_change.subject = Din primära e-postadress har ändrats +activate_account.text_1 = Hej %[1]s, tack för att du registrerat dig hos %[2]s! +reply = eller svara pÃ¥ detta e-postmeddelande direkt +hi_user_x = Hej %s, +admin.new_user.user_info = Användarinformation +admin.new_user.text = Vänligen klicka här för att hantera denna användare frÃ¥n administratörspanelen. @@ -347,8 +498,8 @@ SSPISeparatorReplacement=Avgränsare SSPIDefaultLanguage=StandardsprÃ¥k require_error=fÃ¥r inte vara tomt -alpha_dash_error=` bör endast innehÃ¥lla alfanumeriska tecken, bindestreck ('-') och understreck ('_').` -alpha_dash_dot_error=` bör endast innehÃ¥lla alfanumeriska tecken, bindestreck ('-'), understreck ('_') och punkter ('.').` +alpha_dash_error=` bör endast innehÃ¥lla alfanumeriska tecken, bindestreck ("-") och understreck ("_").` +alpha_dash_dot_error=` bör endast innehÃ¥lla alfanumeriska tecken, bindestreck ("-"), understreck ("_") och punkter (".").` git_ref_name_error=mÃ¥ste vara ett för Git välformaterat referensnamn. size_error=` mÃ¥ste vara av storleken %s` min_size_error=` mÃ¥ste innehÃ¥lla minst %s tecken.` @@ -384,7 +535,7 @@ enterred_invalid_owner_name=Det nya namnet pÃ¥ ägaren är ogiltligt. enterred_invalid_password=Det angivna lösenordet är felaktigt. user_not_exist=Användaren finns inte. team_not_exist=Teamet finns inte. -last_org_owner=Du kan inte ta bort den sista användaren frÃ¥n 'owners' teamet. Det mÃ¥ste finnas minst en ägare för en organisation. +last_org_owner=Du kan inte ta bort den sista användaren frÃ¥n "owners" teamet. Det mÃ¥ste finnas minst en ägare för en organisation. cannot_add_org_to_team=En organisation kan inte läggas till som teammedlem. invalid_ssh_key=Kunde inte verifiera din SSH-nyckel: %s @@ -398,9 +549,9 @@ target_branch_not_exist=MÃ¥lgrenen finns inte. [user] change_avatar=Byt din avatar… repositories=Utvecklingskataloger -activity=Offentlig Aktivitet +activity=Offentlig aktivitet followers_few=%d följare -starred=Stjärnmärkta Utvecklingskataloger +starred=Stjärnmärkta utvecklingskataloger projects=Projekt overview=Översikt following_few=%d följer @@ -416,13 +567,13 @@ account=Konto password=Lösenord security=Säkerhet avatar=Visningsbild -ssh_gpg_keys=SSH / GPG-nycklar +ssh_gpg_keys=SSH/GPG-nycklar social=Sociala konton applications=Applikationer -orgs=Hantera Organisationer +orgs=Organisationer repos=Utvecklingskataloger delete=Radera konto -twofa=TvÃ¥faktorsautentisering +twofa=TvÃ¥faktorsautentisering (TOTP) account_link=Länkade Konton organization=Organisationer @@ -443,16 +594,16 @@ comment_type_group_title=Titel privacy=Sekretess keep_activity_private_popup=Gör aktiviteten endast synlig för dig och administratörerna -lookup_avatar_by_mail=SlÃ¥ upp avatarer med hjälp utav mejladress +lookup_avatar_by_mail=SlÃ¥ upp avatar efter e-postadress federated_avatar_lookup=Förenad uppslagning av avatar -enable_custom_avatar=Aktivera Egen Avatar +enable_custom_avatar=Använd anpassad avatar choose_new_avatar=Välj ny avatar -update_avatar=Uppdatera Avatar -delete_current_avatar=Tag bort aktuell avatar +update_avatar=Uppdatera avatar +delete_current_avatar=Ta bort aktuell avatar uploaded_avatar_not_a_image=Den uppladdade filen är inte en bild. update_avatar_success=Din avatar har blivit uppdaterad. -update_password=Ändra Lösenordet +update_password=Ändra lösenord old_password=Nuvarande lösenord new_password=Nytt lösenord password_incorrect=Det nuvarande lösenordet är felaktigt. @@ -460,18 +611,18 @@ change_password_success=Ditt lösenord har uppdaterats. Logga in med ditt nya l password_change_disabled=Externa användare kan inte ändra sitt lösenord genom Forgejos webbgränssnitt. emails=E-postadresser -manage_emails=Hantera mejladresser -manage_themes=Välj standardtema -manage_openid=Hantera OpenID-adresser -theme_desc=Detta kommer att vara ditt standardtema pÃ¥ webbplatsen. +manage_emails=Hantera e-postadresser +manage_themes=Standardtema +manage_openid=OpenID-adresser +theme_desc=Detta tema kommer att användas för webbgränssnittet när du är inloggad. primary=Primär activated=Aktiverad requires_activation=Aktivering krävs -primary_email=Sätt Som Primär +primary_email=Gör primär activate_email=Skicka aktivering activations_pending=Väntar pÃ¥ aktivering delete_email=Ta Bort -email_deletion=Ta Bort mejladress +email_deletion=Ta bort e-postadress email_deletion_desc=Mejladressen och relaterad information kommer tas bort frÃ¥n ditt konto. Git-commits med denna mejladress förblir oförändrade. Vill du fortsätta? email_deletion_success=Mejladressen har tagits bort. theme_update_success=Ditt tema ändrades. @@ -479,26 +630,26 @@ theme_update_error=Det valda temat finns inte. openid_deletion=Ta bort OpenID-adress openid_deletion_desc=Borttagning av denna OpenID-adress frÃ¥n ditt konto kommer förhindra framtida inloggningar med den. Vill du fortsätta? openid_deletion_success=OpenID-adressen har tagits bort. -add_new_email=Lägg till ny mejladress -add_new_openid=Lägg till ny OpenID URI -add_email=Lägg till mejladress +add_new_email=Lägg till ny e-postadress +add_new_openid=Lägg till ny OpenID-URI +add_email=Lägg till e-postadress add_openid=Lägg till OpenID URI add_email_success=Den nya mejladressen har lagts till. email_preference_set_success=E-postinställningen har uppdaterats. add_openid_success=Den nya OpenID-adressen har lagts till. -keep_email_private=Göm mejladress +keep_email_private=Göm e-postadress openid_desc=OpenID lÃ¥ter dig delegera autentiseringen till en extern leverantör. manage_ssh_keys=Hantera SSH-nycklar manage_gpg_keys=Hantera GPG-nycklar add_key=Lägg till nyckel -ssh_desc=Dessa publika SSH nycklar är associerade med ditt konto. De motsvarande privata nycklarna tillÃ¥ter full Ã¥tkomst till dina utvecklingskataloger. +ssh_desc=Dessa publika SSH nycklar är associerade med ditt konto. De motsvarande privata nycklarna tillÃ¥ter full Ã¥tkomst till dina utvecklingskataloger. SSH-nycklar som har blivit verifierade kan användas för att verifiera SSH-signerade Git-commiter. gpg_desc=Dessa publika GPG nycklar är associerade med ditt konto. HÃ¥ll dina privata nycklar säkra dÃ¥ de tillÃ¥ter att commits kan verifieras. ssh_helper=Behöver du hjälp? Kolla in Github's guide för att skapa din egen SSH-nycklar eller lösa vanliga problem som kan uppstÃ¥ med SSH. gpg_helper=Behöver du hjälp? Ta en titt pÃ¥ Github's guide om GPG. add_new_key=Lägg till SSH-nyckel add_new_gpg_key=Lägg till GPG-nyckel -key_content_gpg_placeholder=Börjar med '-----BEGIN PGP PUBLIC KEY BLOCK-----' +key_content_gpg_placeholder=Börjar med "-----BEGIN PGP PUBLIC KEY BLOCK-----" ssh_key_been_used=Denna SSH-nyckel har redan lagts till pÃ¥ servern. gpg_key_id_used=En publik GPG-nyckel med samma ID existerar redan. gpg_key_verify=Verifiera @@ -530,15 +681,15 @@ ssh_disabled=SSH är inaktiverat manage_social=Hantera länkade sociala konton unbind=Koppla frÃ¥n -manage_access_token=Hantera Ã¥tkomst-tokens -generate_new_token=Generera Nya Tokens +manage_access_token=Ã…tkomsttokens +generate_new_token=Generera ny token tokens_desc=Dessa tokens tillÃ¥ter Ã¥tkomst till ditt konto via Forgejo API. token_name=Tokennamn -generate_token=Generera Token +generate_token=Generera token generate_token_success=Din nya token har genererats. Kopiera nu dÃ¥ den inte kommer visas igen. generate_token_name_duplicate=%s finns redan som programnamn. Välj ett annat. delete_token=Radera -access_token_deletion=Ta bort Ã¥tkomst token +access_token_deletion=Ta bort Ã¥tkomsttoken access_token_deletion_cancel_action=Avbryt access_token_deletion_confirm_action=Radera delete_token_success=Token har tagits bort. Applikationer som använder den kommer inte längre ha Ã¥tkomst till ditt konto. @@ -563,7 +714,7 @@ oauth2_application_create_description=OAuth2-applikationer ger tredjepartsapplik authorized_oauth2_applications=Auktoriserade OAuth2-appar revoke_key=Upphäv -revoke_oauth2_grant=Upphäv Ã¥tkomst +revoke_oauth2_grant=Dra in Ã¥tkomst revoke_oauth2_grant_description=Ã…terkallning av Ã¥tkomst för detta tredjepartsprogram kommer att hindra programmet frÃ¥n att komma Ã¥t dina data. Är du säker? twofa_desc=TvÃ¥faktorsautentisering förbättrar säkerheten pÃ¥ ditt konto. @@ -583,30 +734,31 @@ passcode_invalid=Koden är ogiltig. Försök igen. twofa_enrolled=TvÃ¥faktorsautentisering har aktiverats för ditt konto. Förvara din skrapkod (%s) pÃ¥ en säker plats eftersom den bara visas en gÃ¥ng! -manage_account_links=Hantera Länkade Konton +manage_account_links=Länkade konton manage_account_links_desc=Dessa externa konton är länkade till ditt Forgejo-konto. account_links_not_available=Det finns för närvarande inga externa konton länkade till ditt Forgejo-konto. link_account=Länka konto -remove_account_link=Ta Bort Länkat Konto +remove_account_link=Ta bort länkat konto remove_account_link_desc=Borttagning av länkade konton kommer häva dess Ã¥tkomst till ditt Forgejo-konto. Vill du fortsätta? remove_account_link_success=Det länkade konton har tagits bort. orgs_none=Du är inte en medlem i nÃ¥gon organisation. -delete_account=Radera ditt konto +delete_account=Ta bort ditt konto delete_prompt=Denna Ã¥tgärd kommer ta bort ditt konto permanent. Det KAN INTE Ã¥ngras. -confirm_delete_account=Bekräfta Borttagelsen -delete_account_title=Ta Bort Användarkonto +confirm_delete_account=Bekräfta borttagelse +delete_account_title=Ta bort användarkonto delete_account_desc=Är du säker pÃ¥ att du vill ta bort ditt konto permanent? -email_notifications.enable=Aktivera notiser via mejl +email_notifications.enable=Aktivera notiser via e-post email_notifications.onmention=Endast e-post vid omnämnanden -email_notifications.disable=Inaktivera notiser via mejl -email_notifications.submit=Ställ in e-post inställningar +email_notifications.disable=Inaktivera notiser via e-post +email_notifications.submit=Ställ in e-postpreferenser visibility.public=Offentlig visibility.private=Privat +change_password = Byt lösenord [repo] owner=Ägare @@ -614,31 +766,31 @@ repo_name=Utvecklingskatalogens namn repo_name_helper=Bra namn pÃ¥ utvecklingskataloger bestÃ¥r utav korta, unika nyckelord som är enkla att komma ihÃ¥g. repo_size=Utvecklingskatalogens storlek template=Mall -template_select=Välj mall. +template_select=Välj en mall template_helper=Gör utvecklingskatalog till mall template_description=Utvecklingskatalogmallar lÃ¥ter användare skapa nya utvecklingskataloger med samma filstruktur, filer, och valda inställningar. visibility=Synligt för visibility_description=Bara ägaren eller medlemmar i organisationen med rätt rättigheter kommer kunna se det. visibility_helper_forced=Din tjänstadministratör pÃ¥tvingar privata utvecklingskataloger. -visibility_fork_helper=(Ändring av detta kommer pÃ¥verka alla forkar.) +visibility_fork_helper=(Att ändra detta kommer att pÃ¥verka alla forkar.) clone_helper=Hjälp med kloning? Se hjälp. -fork_repo=Forka Repo -fork_from=Forka FrÃ¥n +fork_repo=Forka utveckligskatalog +fork_from=Forka frÃ¥n fork_visibility_helper=Synligheten av en forkad utvecklingskatalog kan inte ändras. use_template=Välj den här mallen -generate_repo=Skapa utvecklingskatalog +generate_repo=Generera utvecklingskatalog generate_from=Generera frÃ¥n repo_desc=Beskrivning repo_lang=SprÃ¥k -repo_gitignore_helper=Välj .gitignore-mallar. +repo_gitignore_helper=Välj .gitignore-mallar repo_gitignore_helper_desc=Välj vilka filer som inte ska spÃ¥ras frÃ¥n en lista med mallar för vanliga sprÃ¥k. Typiska artefakter som genereras av varje sprÃ¥k byggverktyg ingÃ¥r i .gitignore som standard. -issue_labels=Ärendeetiketter -issue_labels_helper=Välj en grupp av ärendeetiketter. +issue_labels=Etiketter +issue_labels_helper=Välj en uppsättning av etiketter license=Licens -license_helper=Välj licensfil. -license_helper_desc=En licens styr vad andra kan och inte kan göra med din kod. Inte säker pÃ¥ vilken som är rätt för ditt projekt? Se Välj en licens. +license_helper=Välj en licensfil +license_helper_desc=En licens styr vad andra kan och inte kan göra med din kod. Inte säker pÃ¥ vilken som är rätt för ditt projekt? Se Välj en licens. readme=README -readme_helper=Välj en mall för README-filen. +readme_helper=Välj en mall för README-filen readme_helper_desc=Här kan du skriva en fullständig beskrivning för ditt projekt. auto_init=Initiera utvecklingskatalog (Lägger till .gitignore, License and README) create_repo=Skapa utvecklingskatalog @@ -647,8 +799,8 @@ default_branch_helper=Den förvalda grenen är bas-gren för pull requests och k mirror_prune=Rensa mirror_prune_desc=Ta bort förlegade fjärrföljande referenser mirror_interval_invalid=Speglingsintervallen är inte giltig. -mirror_address=Klona FrÃ¥n URL -mirror_last_synced=Senaste Synkronisering +mirror_address=Klona frÃ¥n URL +mirror_last_synced=Synkroniserad senast watchers=Observerare stargazers=Stjärnmärkare forks=Förgreningar @@ -669,7 +821,7 @@ desc.internal=Intern desc.archived=Arkiverade template.items=Mallobjekt -template.git_content=Git innehÃ¥ll (Default branch) +template.git_content=Git-innehÃ¥ll (standardgren) template.git_hooks=Githookar template.webhooks=Webbhookar template.topics=Ämnen @@ -682,7 +834,7 @@ archive.issue.nocomment=Den här utvecklingskatalogen är arkiverad. Du kan inte archive.pull.nocomment=Den här utvecklingskatalogen är arkiverad. Du kan inte kommentera pÃ¥ pull-förfrÃ¥gningar. -migrate_options=Migrationsalternativ +migrate_options=Migreringsalternativ migrate_service=Migreringstjänst migrate_items=Migrationsobjekt migrate_items_wiki=Wiki @@ -692,9 +844,9 @@ migrate_items_issues=Ärenden migrate_items_pullrequests=Pull Requester migrate_items_merge_requests=Begäran om sammanslagning migrate_items_releases=Releaser -migrate_repo=Migrera Repot -migrate.clone_address=Migrera Eller Klona FrÃ¥n URL -migrate.clone_address_desc=HTTP(S)- eller Git 'clone' länken för en existerande utvecklingskatalog +migrate_repo=Migrera utvecklingskatalog +migrate.clone_address=Migrera eller klona frÃ¥n URL +migrate.clone_address_desc=HTTP(S)- eller Git "clone" länk för en existerande utvecklingskatalog migrate.clone_local_path=eller en lokal serversökväg migrate.permission_denied=Du fÃ¥r inte importera lokala repon. migrate.failed=Migrering misslyckades: %v @@ -704,7 +856,7 @@ migrated_from_fake=Migrerad frÃ¥n %[1]s migrate.migrate=Migrera frÃ¥n %s migrate.migrating=Migrerar frÃ¥n %s ... migrate.migrating_failed=Migrering frÃ¥n %s misslyckades. -migrate.migrating_issues=Migrerar Ärenden +migrate.migrating_issues=Migrerar ärenden mirror_from=spegling av forked_from=forkad frÃ¥n @@ -718,7 +870,7 @@ watch=Bevaka unstar=Ta bort stjärnmärkning star=Stjärnmärk fork=Förgrening -download_archive=Ladda Ned Utvecklingskatalogen +download_archive=Ladda ner utvecklingskatalogen no_desc=Ingen beskrivning quick_guide=Snabbguide @@ -752,38 +904,40 @@ file_view_raw=Visa i rÃ¥format file_permalink=Permalänk file_too_large=Filen är för stor för att visas. -video_not_supported_in_browser=Din webbläsare stödjer ej HTML5-taggen 'video'. -audio_not_supported_in_browser=Din webbläsare stöder inte taggen 'audio' i HTML5. +video_not_supported_in_browser=Din webbläsare stödjer ej HTML5-taggen "video". +audio_not_supported_in_browser=Din webbläsare stödjer ej HTML5-taggen "audio". stored_lfs=Sparad med Git LFS +stored_annex=Sparad med Git Annex symbolic_link=Symbolisk länk -commit_graph=Commit-Graf +commit_graph=Commitgraf commit_graph.monochrome=Mono blame=Blame normal_view=Normal vy line=rad lines=rader -editor.new_file=Ny Fil -editor.upload_file=Ladda Upp Fil -editor.edit_file=Redigera Fil +editor.new_file=Ny fil +editor.upload_file=Ladda upp fil +editor.edit_file=Redigera fil editor.preview_changes=Förhandsgranska ändringar editor.cannot_edit_lfs_files=LFS-filer kan inte redigeras i webbgränssnittet. +editor.cannot_edit_annex_files=Annex-filer kan inte redigeras i webbgränssnittet. editor.cannot_edit_non_text_files=Binära filer kan inte redigeras genom webbgränssnittet. -editor.edit_this_file=Redigera Fil +editor.edit_this_file=Redigera fil editor.this_file_locked=Filen är lÃ¥st editor.must_be_on_a_branch=Du mÃ¥ste vara pÃ¥ en branch för att göra eller föreslÃ¥ ändringar i denna fil. editor.fork_before_edit=Du mÃ¥ste forka denna utvecklingskatalog för att göra eller föreslÃ¥ förändringar pÃ¥ denna fil. editor.delete_this_file=Ta bort fil editor.must_have_write_access=Du mÃ¥ste ha skrivÃ¥tkomst för att göra eller föreslÃ¥ ändringar av denna fil. editor.name_your_file=Namnge din fil… -editor.filename_help=Lägg till en katalog genom att skriva dess namn följt utav en slash ('/'). Ta bort katalog genom att sudda i början utav fältet. +editor.filename_help=Lägg till en katalog genom att skriva dess namn följt utav ett snedstreck ("/"). Ta bort katalog genom att sudda i början utav fältet. editor.or=eller editor.cancel_lower=Avbryt editor.commit_signed_changes=Committa signerade ändringar editor.commit_changes=Checka in ändringar -editor.add_tmpl=Lägg till '' +editor.add_tmpl=Lägg till '<%s>' editor.commit_message_desc=Lägg till en valfri utökad beskrivning… -editor.commit_directly_to_this_branch=Checka in direkt till grenen %s. +editor.commit_directly_to_this_branch=Checka in direkt till grenen %[1]s. editor.create_new_branch=Skapa en ny gren för denna incheckning och pÃ¥börja en hämtningsbegäran. editor.create_new_branch_np=Skapa en ny branch för den här committen. editor.propose_file_change=FöreslÃ¥ filändring @@ -804,7 +958,7 @@ commits.desc=Bläddra i källkodens förändringshistorik. commits.commits=Incheckningar commits.search=Sök commits… commits.find=Sök -commits.search_all=Alla brancher +commits.search_all=Alla grenar commits.author=Upphovsman commits.message=Meddelande commits.date=Datum @@ -813,7 +967,7 @@ commits.newer=Nyare commits.signed_by=Signerad av commits.signed_by_untrusted_user=Signerad av opÃ¥litlig användare commits.signed_by_untrusted_user_unmatched=Signerad av opÃ¥litlig användare som inte matchar den som committat -commits.gpg_key_id=GPG-nyckel ID +commits.gpg_key_id=GPG-nyckel-ID commitstatus.pending=Väntande @@ -828,7 +982,7 @@ projects.new=Nytt projekt projects.deletion=Ta bort projekt projects.deletion_success=Projektet har tagits bort. projects.edit=Redigera projekt -projects.modify=Uppdatera projekt +projects.modify=Redigera projekt projects.type.none=Ingen projects.template.desc=Projektmall projects.type.uncategorized=Okatergoriserad @@ -843,10 +997,10 @@ issues.filter_milestones=Filtrera milstolpe issues.filter_projects=Filtrera projekt issues.filter_labels=Filtrera etikett issues.filter_reviewers=Filtrera granskare -issues.new=Nytt Ärende +issues.new=Nytt ärende issues.new.title_empty=Titeln kan inte vara tom issues.new.labels=Etiketter -issues.new.no_label=Ingen Etikett +issues.new.no_label=Inga etiketter issues.new.clear_labels=Rensa etiketter issues.new.projects=Projekt issues.new.clear_projects=Rensa projekt @@ -855,26 +1009,26 @@ issues.new.open_projects=Öppna projekt issues.new.closed_projects=Stängda projekt issues.new.no_items=Inga objekt issues.new.milestone=Milsten -issues.new.no_milestone=Ingen Milsten +issues.new.no_milestone=Ingen milstolpe issues.new.clear_milestone=Rensa milstenar -issues.new.open_milestone=Öppna Milstenar -issues.new.closed_milestone=Stängda Milstenar +issues.new.open_milestone=Öppna milstolpar +issues.new.closed_milestone=Stängda milstolpar issues.new.assignees=Tilldelade issues.new.clear_assignees=Rensa tilldelade -issues.new.no_assignees=Ingen tilldelad +issues.new.no_assignees=Inga tilldelade issues.new.no_reviewers=Inga granskare issues.choose.get_started=Kom igÃ¥ng issues.choose.open_external_link=Öppna issues.choose.blank=Standard issues.choose.blank_about=Skapa ett ärende frÃ¥n standardmall. -issues.no_ref=Ingen Branch/Tag specificerad -issues.create=Skapa Ärende +issues.no_ref=Ingen gren/etikett specificerad +issues.create=Skapa ärende issues.new_label=Ny etikett issues.new_label_placeholder=Etikettsnamn issues.new_label_desc_placeholder=Beskrivning -issues.create_label=Skapa Etikett +issues.create_label=Skapa etikett issues.label_templates.title=Ladda en fördefinierad uppsättning etiketter -issues.label_templates.info=Inga etiketter finns ännu. Skapa en etikett med 'Ny etikett' eller använd fördefinierade etiketter: +issues.label_templates.info=Inga etiketter finns ännu. Skapa en etikett med "Ny etikett" eller använd fördefinierade etiketter: issues.label_templates.helper=Markera en uppsättning etiketter issues.label_templates.use=Använd etikettsamling issues.add_milestone_at=`lade till denna till milstolpe %s %s` @@ -934,20 +1088,20 @@ issues.commented_at=`kommenterad %s` issues.delete_comment_confirm=Är du säker pÃ¥ att du vill ta bort den här kommentaren? issues.context.copy_link=Kopiera länk issues.context.quote_reply=Citerat svar -issues.context.reference_issue=Referens i nytt ärende +issues.context.reference_issue=Hänvisa till i nytt ärende issues.context.edit=Redigera issues.context.delete=Ta bort -issues.close_comment_issue=Kommentera och stäng +issues.close_comment_issue=Stäng med kommentar issues.reopen_issue=Ã…teröppna -issues.reopen_comment_issue=Kommentera och Ã¥teröppna +issues.reopen_comment_issue=Öppna igen med kommentar issues.create_comment=Kommentera issues.closed_at=`stängde ärendet %[2]s` issues.reopened_at=`Ã¥teröppnade detta ärende %[2]s` issues.commit_ref_at=`refererade till detta ärende frÃ¥n en incheckning %[2]s` issues.ref_issue_from=`refererade till detta ärende %[4]s %[2]s` issues.ref_pull_from=`refererade till denna pull-förfrÃ¥gan %[4]s %[2]s` -issues.ref_closing_from=`refererade till en pull-förfrÃ¥gan %[4]s som kommer att stänga detta ärende %[2]s` -issues.ref_reopening_from=`refererade till en pull-förfrÃ¥gan %[4]s som kommer att öppna ärendet pÃ¥ nytt %[2]s` +issues.ref_closing_from=`hänvisade till detta ärende frÃ¥n en pull-förfrÃ¥gan %[4]s som kommer att stänga det %[2]s` +issues.ref_reopening_from=`hänvisade till detta ärende frÃ¥n en pull-förfrÃ¥gan %[4]s som kommer att öppna ärendet pÃ¥ nytt %[2]s` issues.ref_closed_from=`stängde detta ärende %[4]s %[2]s` issues.ref_reopened_from=`öpnnade detta ärende igen %[4]s %[2]s` issues.ref_from=`frÃ¥n %[1]s` @@ -986,11 +1140,11 @@ issues.lock.unknown_reason=Kan inte lÃ¥sa ärende utan angiven anledning. issues.lock_duplicate=Ett ärende kan inte lÃ¥sas tvÃ¥ gÃ¥nger. issues.unlock_error=Kan inte lÃ¥sa upp ett olÃ¥st ärende. issues.lock_with_reason=lÃ¥st som %s och begränsad konversation till medarbetare %s -issues.lock_no_reason=lÃ¥st och begränsat konversation till kollaboratörer %s +issues.lock_no_reason=lÃ¥st och begränsat konversation till medarbetare %s issues.unlock_comment=lÃ¥s upp denna konversation %s issues.lock_confirm=LÃ¥s issues.unlock_confirm=LÃ¥s upp -issues.lock.notice_1=- Andra användare kan inte kommentera detta ärende. +issues.lock.notice_1=- Andra användare kan inte kommentera pÃ¥ detta ärende. issues.lock.notice_2=- Du och andra kollaboratörer med tillgÃ¥ng till denna utvecklingskatalog kan fortfarande skriva kommentarer som andra kan se. issues.lock.notice_3=- Du kan alltid lÃ¥sa upp detta ärende senare. issues.unlock.notice_1=- Alla kommer kunna kommentera detta ärende en gÃ¥ng till. @@ -1016,7 +1170,7 @@ issues.del_time_history=`raderade tillbringad tid %s` issues.add_time_hours=Timmar issues.add_time_minutes=Minuter issues.add_time_sum_to_small=Inge tid har angivits. -issues.time_spent_total=Total Tid Spenderad +issues.time_spent_total=Total tid spenderad issues.time_spent_from_all_authors=`Total Tid Spenderad: %s` issues.due_date=Förfallodatum issues.invalid_due_date_format=Datumsformatet för förfallodatum mÃ¥ste följa 'yyyy-MM-dd'. @@ -1033,7 +1187,7 @@ issues.due_date_not_set=Inget förfallodatum satt. issues.due_date_added=lade till förfallodatumet %s %s issues.due_date_remove=tog bort förfallodatumet %s %s issues.due_date_overdue=Försenad -issues.due_date_invalid=Förfallodatumet är ogiltigt eller utanför gränserna. Använd formatet 'åååå-mm-dd'. +issues.due_date_invalid=Förfallodatumet är ogiltigt eller utanför gränserna. Använd formatet "åååå-mm-dd". issues.dependency.title=Beroenden issues.dependency.add=Lägg till beroende… issues.dependency.cancel=Avbryt @@ -1063,10 +1217,10 @@ issues.review.approve=godkände dessa ändringar %s issues.review.comment=granskad av %s issues.review.left_comment=lämnade en kommentar issues.review.content.empty=Du mÃ¥ste skriva en kommentar som anger de önskade ändringarna. -issues.review.reject=begärda ändringar %s -issues.review.wait=begärdes för granskning %s -issues.review.add_review_request=begärde granskning frÃ¥n %s %s -issues.review.remove_review_request=tog bort granskningsbegäran för %s %s +issues.review.reject=efterfrÃ¥gade ändringar %s +issues.review.wait=efterfrÃ¥gades för granskning %s +issues.review.add_review_request=efterfrÃ¥gade granskning frÃ¥n %[1]s %[2]s +issues.review.remove_review_request=tog bort granskningsförfrÃ¥gan för %[1]s %[2]s issues.review.remove_review_request_self=vägrade att granska %s issues.review.pending=Väntande issues.review.review=Granska @@ -1082,21 +1236,21 @@ issues.content_history.options=Alternativ pulls.desc=Aktivera pull-förfrÃ¥gningar och kodgranskning. -pulls.new=Ny Pull-FörfrÃ¥gan -pulls.compare_changes=Ny Pull-Request +pulls.new=Ny pull-förfrÃ¥gan +pulls.compare_changes=Ny pull-förfrÃ¥gan pulls.compare_changes_desc=Välj branchen att merga in i, och ifrÃ¥n. pulls.compare_base=merga in i pulls.compare_compare=pulla frÃ¥n pulls.filter_branch=Filtrera gren pulls.no_results=Inga resultat hittades. pulls.nothing_to_compare=Dessa brancher är ekvivalenta. Det finns ingen anledning att skapa en pull-request. -pulls.create=Skapa PullförfrÃ¥gan -pulls.title_desc_few=vill sammanfoga %[1]d incheckningar frÃ¥n s[2]s in i %[3]s +pulls.create=Skapa pull-förfrÃ¥gan +pulls.title_desc_few=vill sammanfoga %[1]d incheckningar frÃ¥n s[2]s in i %[3]s pulls.merged_title_desc_few=sammanfogade %[1]d incheckningar frÃ¥n %[2]s in i %[3]s %[4]s pulls.change_target_branch_at=`ändrade mÃ¥l-branch frÃ¥n %s till %s%s` pulls.tab_conversation=Konversation pulls.tab_commits=Incheckningar -pulls.tab_files=Ändrade Filer +pulls.tab_files=Ändrade filer pulls.reopen_to_merge=Vänligen Ã¥teröppna denna Pull-förfrÃ¥gan igen för att utföra sammanfogningen. pulls.cant_reopen_deleted_branch=Denna pull-förfrÃ¥gan kan inte öppnas igen eftersom branchen tagits bort. pulls.merged=Sammanfogat @@ -1133,12 +1287,12 @@ milestones.no_due_date=Inget förfallodatum milestones.open=Öppna milestones.close=Stäng milestones.completeness=%d%% Slutförd -milestones.create=Skapa Milstolpe +milestones.create=Skapa milstolpe milestones.title=Titel milestones.desc=Beskrivning milestones.due_date=Förfallodatum (valfritt) milestones.clear=Rensa -milestones.invalid_due_date_format=Förfallodatumsformatet mÃ¥ste vara 'yyyy-MM-dd'. +milestones.invalid_due_date_format=Förfallodatumsformatet mÃ¥ste vara "åååå-mm-dd". milestones.edit=Redigera milstolpe milestones.edit_subheader=Milstolpar organiserar ärenden och följer utvecklingens fortskridande. milestones.cancel=Avbryt @@ -1166,7 +1320,7 @@ wiki.default_commit_message=Skriv en anteckning om den här uppdateringen (valfr wiki.save_page=Spara sidan wiki.last_commit_info=%s redigerade denna sida %s wiki.edit_page_button=Redigera -wiki.new_page_button=Ny Sida +wiki.new_page_button=Ny sida wiki.back_to_wiki=Tillbaka till wikisidan wiki.delete_page_button=Tag bort sida wiki.page_already_exists=Wiki-sida med samma namn finns redan. @@ -1183,39 +1337,39 @@ activity.period.quarterly=3 mÃ¥nader activity.period.semiyearly=6 mÃ¥nader activity.period.yearly=1 Ã¥r activity.overview=Översikt -activity.active_prs_count_1=%d Aktiv Pull begäran -activity.active_prs_count_n=%d Aktiva Pull begärelser +activity.active_prs_count_1=%d aktiv pull-förfrÃ¥gan +activity.active_prs_count_n=%d aktiva pull-förfrÃ¥gningar activity.merged_prs_count_1=Sammanfogad Pull-förfrÃ¥gan activity.merged_prs_count_n=Sammanfogade Pull-förfrÃ¥gningar -activity.opened_prs_count_1=Föreslagen Pull begäran -activity.opened_prs_count_n=Föreslagna Pull-förfrÃ¥gningar +activity.opened_prs_count_1=Föreslagen pull-förfrÃ¥gan +activity.opened_prs_count_n=Föreslagna pull-förfrÃ¥gningar activity.title.user_1=%d användare activity.title.user_n=%d användare -activity.title.prs_1=%d Pull-begäran -activity.title.prs_n=%d Pull begärelser +activity.title.prs_1=%d pull-förfrÃ¥gningar +activity.title.prs_n=%d pull-förfrÃ¥gningar activity.title.prs_merged_by=%s sammanfogad av %s activity.title.prs_opened_by=%s föreslÃ¥s av %s activity.merged_prs_label=Sammanfogad activity.opened_prs_label=Föreslagen -activity.active_issues_count_1=%d Aktivt ärende -activity.active_issues_count_n=%d Aktiva ärenden +activity.active_issues_count_1=%d aktivt ärende +activity.active_issues_count_n=%d aktiva ärenden activity.closed_issues_count_1=Stängt ärende activity.closed_issues_count_n=Stängda ärenden activity.title.issues_1=%d ärende -activity.title.issues_n=%d Ärenden +activity.title.issues_n=%d ärenden activity.title.issues_created_by=%s skapad av %s activity.closed_issue_label=Stängd activity.new_issues_count_1=Nytt ärende activity.new_issues_count_n=Nya ärenden activity.new_issue_label=Öppnad -activity.title.unresolved_conv_1=%d Olöst konversation -activity.title.unresolved_conv_n=%d Olösta konversationer +activity.title.unresolved_conv_1=%d olöst konversation +activity.title.unresolved_conv_n=%d olösta konversationer activity.unresolved_conv_desc=De nyligen förändrade ärendena och pull-requesterna har inte blivit lösta ännu. activity.unresolved_conv_label=Öppna -activity.title.releases_1=%d release -activity.title.releases_n=%d releaser +activity.title.releases_1=%d utgÃ¥va +activity.title.releases_n=%d utgÃ¥vor activity.title.releases_published_by=%s publicerad av %s -activity.published_release_label=Publicerad +activity.published_release_label=UtgÃ¥va activity.no_git_activity=Det har inte gjorts nÃ¥gra commit under den här perioden. activity.git_stats_exclude_merges=Exkludera merger, activity.git_stats_author_1=%d författare @@ -1255,34 +1409,34 @@ settings.mirror_settings=Inställningar för spegling settings.sync_mirror=Synkronisera nu settings.site=Webbplats -settings.update_settings=Uppdatera inställningar -settings.advanced_settings=Advancerade Inställningar +settings.update_settings=Spara inställningar +settings.advanced_settings=Avancerade Inställningar settings.wiki_desc=Aktivera wiki för utvecklingskatalog -settings.use_internal_wiki=Använd inbyggd Wiki -settings.use_external_wiki=Använd extern Wiki -settings.external_wiki_url=Extern Wiki-URL +settings.use_internal_wiki=Använd inbyggd wiki +settings.use_external_wiki=Använd extern wiki +settings.external_wiki_url=URL till extern wiki settings.external_wiki_url_error=Den externa wiki-länken är inte giltig. settings.external_wiki_url_desc=Besökare omdirigeras till den externa wiki-länken när de trycker pÃ¥ wiki-tabben. settings.issues_desc=Aktivera ärendehantering för utvecklingskatalogen settings.use_internal_issue_tracker=Använd inbyggt ärendehanteringssystem settings.use_external_issue_tracker=Använd externt ärendehanteringssystem -settings.external_tracker_url=URL För Extern Ärendehanterare +settings.external_tracker_url=URL för externt ärendehanteringssystem settings.external_tracker_url_error=Länken för ärendehanteringsystemet är inte en giltig länk. settings.external_tracker_url_desc=Besökare dirigeras om till länken för det externa ärendehanteringssystemet när de trycker pÃ¥ ärende-tabben. -settings.tracker_url_format=URL-Format För Extern Ärendehanterare +settings.tracker_url_format=URL-format för externt ärendehanteringssystem settings.tracker_url_format_error=URL-formatet för den extern ärendehanterare är inte en giltig URL. -settings.tracker_issue_style=Externt ärendenummersformat +settings.tracker_issue_style=Externt ärendenummerformat settings.tracker_issue_style.numeric=Numerisk settings.tracker_issue_style.alphanumeric=Alfanumerisk settings.tracker_url_format_desc=Använd variablerna {user}, {repo} och {index} för användarnamn, utvecklingskatalogsnamn och ärenderegister. settings.enable_timetracker=Aktivera tidsredovisning -settings.allow_only_contributors_to_track_time=LÃ¥t endast medarbetare spÃ¥ra tidsredovisning -settings.pulls_desc=Aktivera Pull Requests för utvecklingskatalog +settings.allow_only_contributors_to_track_time=LÃ¥t endast medarbetare spÃ¥ra tid +settings.pulls_desc=Aktivera pull-förfrÃ¥gningar för utvecklingskatalog settings.pulls.ignore_whitespace=Ignorera blanksteg vid konflikter settings.admin_settings=Administratörsinställningar settings.admin_enable_health_check=Aktivera hälsokontroll för utvecklingskataloger (git fsck) settings.admin_enable_close_issues_via_commit_in_any_branch=Stäng ett ärende via en commit gjord i en icke standard-gren -settings.danger_zone=HögrisksomrÃ¥de +settings.danger_zone=Farozon settings.new_owner_has_same_repo=Den nya ägaren har redan ett repo med det namnet. Vänligen välj ett annat namn. settings.convert=Konvertera till vanlig utvecklingskatalog settings.convert_desc=Du kan konvertera denna spegling till en vanlig utvecklingskatalog. Detta kan ej Ã¥ngras. @@ -1296,15 +1450,15 @@ settings.transfer_desc=Överför denna utvecklingskatalog till en användare ell settings.transfer_form_title=Ange utvecklingskatalogens namn för att bekräfta: settings.transfer_notices_1=- Du kommer förlora Ã¥tkomst till denna utvecklingskatalog om du för över den till en individuell användare. settings.transfer_notices_2=- Du kommer behÃ¥lla Ã¥tkomst till utvecklingskatalogen om du för över den till en organisation som du antingen äger eller är delägare i. -settings.transfer_owner=Ny Ägare +settings.transfer_owner=Ny ägare settings.transfer_succeed=Utvecklingskatalogen har flyttats över. settings.trust_model.collaborator=Medarbetare -settings.wiki_delete=Ta bort wiki-data +settings.wiki_delete=Ta bort wikidata settings.wiki_delete_desc=Borttagning av utvecklingskatalogens wiki-data är permanent och kan ej Ã¥ngras. settings.wiki_delete_notices_1=- Detta kommer permanent ta bort och inaktivera utvecklingskatalogens wiki för %s. -settings.confirm_wiki_delete=Ta bort wiki-data +settings.confirm_wiki_delete=Ta bort wikidata settings.wiki_deletion_success=Utvecklingskatalogens wiki-data har blivit borttaget. -settings.delete=Ta Bort Detta Repo +settings.delete=Ta bort denna utvecklingskatalog settings.delete_desc=Borttagning av en utvecklingskatalog är permanent och kan ej Ã¥ngras. settings.delete_notices_1=- Denna Ã¥tgärd kan INTE Ã¥ngras. settings.delete_notices_2=- Denna Ã¥tgärd kommer permanent ta bort utvecklingskatalogen %s inklusive kod, ärenden, kommentarer, wiki-data samt medarbetarinställningar. @@ -1327,12 +1481,12 @@ settings.teams=Grupper settings.add_team_duplicate=Teamet har redan utvecklingskatalogen settings.add_team_success=Teamet har nu tillgÃ¥ng till utvecklingskatalogen. settings.remove_team_success=Teamets Ã¥tkomst till utvecklingskatalogen har tagits bort. -settings.add_webhook=Lägg Till Webbhook +settings.add_webhook=Lägg till webbhook settings.hooks_desc=Webhooks gör automatiskt ett HTTP POST anrop mot en server när vissa Forgejo events triggas. Läs mer om detta i webhooks guiden. -settings.webhook_deletion=Ta bort Webhook +settings.webhook_deletion=Ta bort webbhook settings.webhook_deletion_desc=Borttagning utav en webhook tar även bort dess inställningar och leveranshistorik. Vill du fortsätta? settings.webhook_deletion_success=Webhooken har blivit borttagen. -settings.webhook.test_delivery=Testa Leverans +settings.webhook.test_delivery=Testa leverans settings.webhook.test_delivery_desc=Testa webhooken genom ett testevent. settings.webhook.request=Begäran settings.webhook.response=Svar @@ -1343,19 +1497,19 @@ settings.githook_edit_desc=Om kroken är inaktiv visas exempelinnehÃ¥ll. Inaktiv settings.githook_name=Kroknamn settings.githook_content=KrokinnehÃ¥ll settings.update_githook=Uppdatera krok -settings.add_webhook_desc=Forgejo kommer skicka ett POST anrop med en specificerad Content-Type till mÃ¥ladressen. Läs mer om detta i webhook guiden. +settings.add_webhook_desc=Forgejo kommer skicka ett POST anrop med en specificerad Content-Type till mÃ¥ladressen. Läs mer om detta i webhook-guiden. settings.payload_url=MÃ¥l-URL settings.http_method=HTTP-metod -settings.content_type=POST Content Type +settings.content_type=POST content type settings.secret=Hemlighet settings.slack_username=Användarnamn settings.slack_icon_url=URL för ikon settings.discord_username=Användarnamn settings.discord_icon_url=URL för ikon settings.event_desc=Trigga vid: -settings.event_push_only=Push Events -settings.event_send_everything=Alla events -settings.event_choose=Anpassade events… +settings.event_push_only=Push-händelser +settings.event_send_everything=Alla händelser +settings.event_choose=Anpassade händelser… settings.event_header_repository=Händelser i utvecklingskatalogen settings.event_create=Skapa settings.event_create_desc=Branch eller tagg skapad. @@ -1395,62 +1549,62 @@ settings.title=Titel settings.deploy_key_content=InnehÃ¥ll settings.key_been_used=En distributionsnyckel med identiskt innehÃ¥ller används redan. settings.key_name_used=En distributionsnyckel med samma namn finns redan. -settings.deploy_key_deletion=Ta bort distributionsnyckel +settings.deploy_key_deletion=Ta bort driftsättningsnyckel settings.deploy_key_deletion_desc=Borttagning utav en distributionsnyckel kommer att Ã¥terkalla dess Ã¥tkomst till utvecklingskatalogen. Vill du fortsätta? settings.deploy_key_deletion_success=Distributionsnyckeln har blivit borttagen. settings.branches=Brancher -settings.protected_branch=Branchskydd +settings.protected_branch=Grenskydd settings.protected_branch_can_push=TillÃ¥t push? settings.protected_branch_can_push_yes=Du kan pusha settings.protected_branch_can_push_no=Du kan inte pusha -settings.branch_protection=Branchskydd för '%s' +settings.branch_protection=Skyddsregler för gren "%s" settings.protect_this_branch=Aktivera branchskydd -settings.protect_disable_push=Inaktivera Push +settings.protect_disable_push=Inaktivera push settings.protect_disable_push_desc=Inga push-förfrÃ¥gningar kommer att tillÃ¥tas till denna branch. -settings.protect_enable_push=Aktivera Push +settings.protect_enable_push=Aktivera push settings.protect_enable_push_desc=Alla med skrivrättigheter kommer att kunna pusha till denna branch (men inte force-pusha). settings.protect_whitelist_deploy_keys=Vitlista deploy-nyckar med skrivÃ¥tkomst till push. -settings.protect_whitelist_users=Vitlistade användare för pushning: +settings.protect_whitelist_users=Vitlistade användare för pushning settings.protect_whitelist_search_users=Sök användare… -settings.protect_whitelist_teams=Vitlistade team för pushning: +settings.protect_whitelist_teams=Vitlistade team för pushning settings.protect_whitelist_search_teams=Sök team… settings.protect_merge_whitelist_committers=Aktivera vitlista för sammanfogning settings.protect_merge_whitelist_committers_desc=TillÃ¥t endast vitlistade användare eller team att sammanfoga pull requests i denna branch. -settings.protect_merge_whitelist_users=Vitlistade användare för sammanfogning: -settings.protect_merge_whitelist_teams=Vitlistade teams för sammanfogning: +settings.protect_merge_whitelist_users=Vitlistade användare för sammanfogning +settings.protect_merge_whitelist_teams=Vitlistade teams för sammanfogning settings.protect_check_status_contexts=Aktivera statuskontroller settings.protect_check_status_contexts_desc=Kräv godkända statuskontroller innan merge. Välj vilka statuskontroller som godkännas innan grenar kan slÃ¥s samman till en gren som matchar denna regel. När aktiverad, mÃ¥ste committer först pushas till en annan gren, sedan mergas eller pushas direkt till en gren som matchar denna regel efter statuskontroll har har godkännts. Om inga context väljs mÃ¥ste den sista committen vara framgÃ¥ngsrik oavsett context. settings.protect_check_status_contexts_list=Statuskontroller funna under senaste veckan för denna utvecklingskatalog -settings.protect_required_approvals=Godkännanden som krävs: -settings.protect_approvals_whitelist_users=Vitlistade granskare: -settings.protect_approvals_whitelist_teams=Vitlistade team för granskning: -settings.require_signed_commits=Kräv signerade commits +settings.protect_required_approvals=Godkännanden som krävs +settings.protect_approvals_whitelist_users=Vitlistade granskare +settings.protect_approvals_whitelist_teams=Vitlistade team för granskning +settings.require_signed_commits=Kräv signerade commiter settings.require_signed_commits_desc=Avvisa pushar till den här grenen om dom är osignerade eller inte verifierbara. settings.add_protected_branch=Aktivera skydd settings.delete_protected_branch=Inaktivera skydd -settings.protected_branch_deletion=Inaktivera skydd för branch +settings.protected_branch_deletion=Inaktivera grenskydd settings.protected_branch_deletion_desc=Genom att inaktivera branchskyddet tillÃ¥ts användare med skrivrättigheter att pusha till branchen. Vill du fortsätta? settings.default_branch_desc=Välj en standard branch för Pull Requests och Code Commits: settings.choose_branch=Välj en branch… settings.no_protected_branch=Det finns inga skyddade brancher. settings.edit_protected_branch=Ändra settings.protected_branch_required_approvals_min=Antal erforderliga godkännanden kan inte vara negativa. -settings.bot_token=Bot Token +settings.bot_token=Bottoken settings.chat_id=Chatt-ID settings.matrix.room_id=Rum-ID settings.matrix.message_type=Typ av meddelande -settings.archive.button=Arkivera förrÃ¥d -settings.archive.header=Arkivera detta förrÃ¥d +settings.archive.button=Arkivera utvecklingskatalog +settings.archive.header=Arkivera denna utvecklingskatalog settings.archive.success=FörrÃ¥det arkiverades. settings.archive.error=Ett fel uppstod när utvecklingskatalogen arkiverades. Se loggen för fler detaljer. settings.archive.error_ismirror=Du kan inte arkivera ett speglat förrÃ¥d. -settings.archive.branchsettings_unavailable=Inställningar för grenar är inte tillgängliga om förrÃ¥det arkiverats. +settings.archive.branchsettings_unavailable=Inställningar för grenar är inte tillgängliga för arkiverade utvecklingskataloger. settings.update_avatar_success=Utvecklingskatalogens avatar har uppdaterats. settings.lfs=LFS settings.lfs_filelist=LFS filer lagrade i denna utvecklingskatalog settings.lfs_no_lfs_files=Inga LFS filer är lagrade i denna utvecklingskatalog settings.lfs_findcommits=Hitta commits -settings.lfs_lfs_file_no_commits=Ingen commit hittad för denna LFS fil +settings.lfs_lfs_file_no_commits=Ingen commit hittad för denna LFS-fil settings.lfs_locks=LÃ¥s settings.lfs_invalid_locking_path=Ogiltig sökväg: %s settings.lfs_invalid_lock_directory=Kan inte lÃ¥sa katalog: %s @@ -1459,18 +1613,18 @@ settings.lfs_lock=LÃ¥s settings.lfs_lock_path=Filväg att lÃ¥sa... settings.lfs_locks_no_locks=Inga lÃ¥s settings.lfs_force_unlock=Tvinga upplÃ¥sning -settings.lfs_pointers.sha=Blob SHA +settings.lfs_pointers.sha=Blobhash settings.lfs_pointers.oid=OID settings.lfs_pointers.inRepo=I utvecklingskatalogen settings.rename_branch_failed_not_exist=Kan inte byta namn pÃ¥ branchen %s eftersom den inte finns. -diff.browse_source=Bläddra i källkod +diff.browse_source=Bläddra källkod diff.parent=förälder diff.commit=incheckning diff.git-notes=Anteckningar -diff.data_not_available=Diff Content ej tillgänglig -diff.show_split_view=Delad Vy -diff.show_unified_view=Unifierad Vy +diff.data_not_available=Diff-innehÃ¥ll ej tillgänglig +diff.show_split_view=Delad vy +diff.show_unified_view=Unifierad vy diff.whitespace_button=Blanksteg diff.whitespace_show_everything=Visa alla ändringar diff.whitespace_ignore_all_whitespace=Ignorera blanksteg när rader jämförs @@ -1486,12 +1640,12 @@ diff.file_image_height=Höjd diff.file_byte_size=Storlek diff.file_suppressed=Filskillnaden har hÃ¥llits tillbaka eftersom den är för stor diff.comment.placeholder=Lämna en kommentar -diff.comment.markdown_info=Styling med markdown stöds. +diff.comment.markdown_info=Stilisering med Markdown stöds. diff.comment.add_single_comment=Lägg till en kommentar diff.comment.add_review_comment=Lägg till kommentar diff.comment.start_review=Starta granskning diff.comment.reply=Svara -diff.review=Granska +diff.review=Slutför granskning diff.review.placeholder=Granskningskommentar diff.review.comment=Kommentar diff.review.approve=Godkänn @@ -1500,12 +1654,12 @@ diff.committed_by=committad av releases.desc=Följ projektversioner och nerladdningar. release.releases=Släpp -release.new_release=Nytt Släpp +release.new_release=Ny utgÃ¥va release.draft=Utkast -release.prerelease=Försläpp +release.prerelease=FörutgÃ¥va release.stable=Stabil release.compare=Jämför -release.edit=redigera +release.edit=Redigera release.ahead.commits=%d committer release.ahead.target=till %s sedan denna utgÃ¥va release.source_code=Källkod @@ -1514,23 +1668,23 @@ release.edit_subheader=Releaser organiserar projektversioner. release.tag_name=Taggnamn release.target=MÃ¥l release.tag_helper=Välj en existerande tagg eller skapa en ny tagg. -release.prerelease_desc=Markera som en Pre-Release +release.prerelease_desc=Markera som en förutgÃ¥va release.prerelease_helper=Markera denna Release olämpliga för användning i produktion. release.cancel=Avbryt -release.publish=Publicera Släpp -release.save_draft=Spara Utkast -release.edit_release=Uppdatera Release -release.delete_release=Ta bort Release -release.deletion=Ta bort Release +release.publish=Publicera utgÃ¥va +release.save_draft=Spara utkast +release.edit_release=Uppdatera utgÃ¥va +release.delete_release=Ta bort utgÃ¥va +release.deletion=Ta bort utgÃ¥va release.deletion_success=Releasen har blivit raderad. release.tag_name_already_exist=En release med denna tagg existerar redan. release.tag_name_invalid=Taggnamnet är inte giltigt. release.downloads=Nedladdningar release.download_count=Nedladdningar: %s -branch.name=Branch namn +branch.name=Grennamn branch.delete_head=Radera -branch.delete_html=Radera branch +branch.delete_html=Ta borg gren branch.create_branch=Skapa branchen %s branch.deleted_by=Raderad av %s @@ -1539,6 +1693,7 @@ branch.deleted_by=Raderad av %s topic.manage_topics=Hantera ämnen topic.done=Klar topic.count_prompt=Du kan inte välja fler än 25 ämnen +settings.enter_repo_name = Ange ägar- och utvecklingskatalog-namnet exakt som det visas: @@ -1546,7 +1701,7 @@ topic.count_prompt=Du kan inte välja fler än 25 ämnen [org] org_name_holder=Organisationsnamn -org_full_name_holder=Organisationens Fullständiga Namn +org_full_name_holder=Fullständigt organisationsnamn org_name_helper=Organisationsnamn bör vara korta och enkla att komma ihÃ¥g. create_org=Skapa organisation repo_updated=Uppdaterad %s @@ -1554,10 +1709,10 @@ members=Medlemmar teams=Grupper lower_members=medlemmar lower_repositories=utvecklingskataloger -create_new_team=Nytt Team -create_team=Skapa Team +create_new_team=Nytt lag +create_team=Skapa lag org_desc=Beskrivning -team_name=Gruppnamn +team_name=Lagnamn team_desc=Beskrivning team_name_helper=Teamnamn bör vara korta och lätta att komma ihÃ¥g. team_desc_helper=Beskriv syftet eller rollen för teamet. @@ -1584,7 +1739,7 @@ settings.update_settings=Uppdatera inställningar settings.update_setting_success=Organisationsinställningarna har uppdaterats. settings.update_avatar_success=Organisationens avatar har uppdateras. settings.delete=Tag bort organisation -settings.delete_account=Tag bort denna organisation +settings.delete_account=Ta bort denna organisationen settings.delete_prompt=Organisationen kommer tas bort permanent, och det gÃ¥r INTE att Ã¥ngra detta! settings.confirm_delete_account=Bekräfta borttagning settings.delete_org_title=Ta bort organisation @@ -1595,9 +1750,9 @@ settings.labels_desc=Lägg till etiketter som kan användas till ärenden för < members.membership_visibility=Synlighet för medlemskap: members.public=Synlig -members.public_helper=gör dold +members.public_helper=Gör dold members.private=Dold -members.private_helper=gör synlig +members.private_helper=Gör synlig members.member_role=Medlemsroll: members.owner=Ägare members.member=Medlem @@ -1618,18 +1773,18 @@ teams.admin_access_helper=Medlemmar kan pulla och pusha till teamets utvecklings teams.no_desc=Detta team har ingen beskrivning teams.settings=Inställningar teams.owners_permission_desc=Ägare har full Ã¥tkomst till alla utvecklingskataloger och har administratörsÃ¥tkomst till organisationen. -teams.members=Teammedlemmar +teams.members=Lagmedlemmar teams.update_settings=Uppdatera inställningar -teams.delete_team=Ta bort team -teams.add_team_member=Lägg till teammedlem -teams.delete_team_title=Ta bort team +teams.delete_team=Ta bort lag +teams.add_team_member=Lägg till lagmedlem +teams.delete_team_title=Ta bort lag teams.delete_team_desc=Borttagning av ett team Ã¥terkallar Ã¥tkomsten till utvecklingskatalogen för dess medlemmar. Vill du fortsätta? teams.delete_team_success=Teamet har blivit borttaget. teams.read_permission_desc=Medlemskap i detta team ger läsrättigheter: medlemmar kan se och klona teamets utvecklingskataloger. teams.write_permission_desc=Medlemskap i detta team ger skrivrättigheter: medlemmar kan läsa och pusha till teamets utvecklingskataloger. -teams.admin_permission_desc=Medlemskap i detta team ger administratörsrättigheter: medlemmar kan läsa, pusha och lägga till medarbetare till teamets utvecklingskataloger. +teams.admin_permission_desc=Medlemskap i detta lag ger administratörsrättigheter: medlemmar kan läsa frÃ¥n, pusha till och lägga till medarbetare till lagets utvecklingskataloger. teams.create_repo_permission_desc=Vidare sÃ¥ ger detta team Skapa utvecklingskatalog rättigheten: medlemmar can skapa nya utvecklingskataloger i organisationen. -teams.repositories=TeamförrÃ¥d +teams.repositories=Lagets utvecklingskataloger teams.search_repo_placeholder=Sök utvecklingskatalog… teams.remove_all_repos_title=Ta bort alla utvecklingskataloger för teamet teams.remove_all_repos_desc=Detta kommer att ta bort alla utvecklingskataloger frÃ¥n teamet. @@ -1648,10 +1803,10 @@ teams.all_repositories_admin_permission_desc=Detta team beviljar Admin/.well-known/openid-configuration) för att ange slutpunkterna auths.tip.twitter=GÃ¥ till %s, skapa en applikation och försäkra att alternativet "Allow this application to be used to Sign in with Twitter" är aktiverat auths.tip.discord=Registrera en ny applikation pÃ¥ %s -auths.edit=Redigera autensieringskälla +auths.edit=Redigera autentiseringskälla auths.activated=Denna autentiseringskälla är aktiverad auths.update_success=Autentiseringskällan har uppdaterats. -auths.update=Uppdatera autensieringskälla +auths.update=Uppdatera autentiseringskälla auths.delete=Ta bort autentiseringskälla -auths.delete_auth_title=Tag bort denna autentisering +auths.delete_auth_title=Tag bort autentiseringskälla auths.delete_auth_desc=Borttagning av en autensieringskälla förhindrar användare frÃ¥n att använda den för inloggning. Vill du fortsätta? auths.still_in_used=Autentiseringskällan är fortfarande i bruk. Konvertera eller ta bort alla användare som använder denna autentiseringskälla först. auths.deletion_success=Autentiseringskällan har tagits bort. -config.server_config=Server-konfiguration -config.app_name=Sajtens namn -config.app_ver=Forgejo Version -config.app_url=Forgejo Bas-URL -config.custom_conf=Konfigurationsfil -config.offline_mode=Offlineläge -config.disable_router_log=Avaktivera Router Loggning -config.run_user=Kör som användarnamn +config.server_config=Serverkonfiguration +config.app_name=Instansnamn +config.app_ver=Forgejo-version +config.app_url=Bas-URL för Forgejo +config.custom_conf=Sökväg för konfigurationsfil +config.offline_mode=Lokalt läge +config.disable_router_log=Inaktivera routerloggning +config.run_user=Användare att köra som config.run_mode=Exekveringsläge -config.git_version=Git version +config.git_version=Git-version config.repo_root_path=Rotsökväg för utvecklingskatalog -config.lfs_root_path=LFS Rotsökväg +config.lfs_root_path=LFS rotsökväg config.log_file_root_path=Sökväg för loggar -config.script_type=Script-typ -config.reverse_auth_user=Motsatt autentiserings användare +config.script_type=Skripttyp +config.reverse_auth_user=Autentiseringsanvändare för omvänd proxy config.ssh_config=SSH-konfiguration config.ssh_enabled=Aktiverad -config.ssh_start_builtin_server=Använd inbyggd Server +config.ssh_start_builtin_server=Använd inbyggd server config.ssh_port=Port config.ssh_listen_port=Lyssningsport config.ssh_root_path=Rotsökväg config.ssh_key_test_path=Testsökväg för nyckel -config.ssh_keygen_path=Sökväg för nyckelgenerator ('ssh-keygen') +config.ssh_keygen_path=Sökväg för nyckelgenerator ("ssh-keygen") config.ssh_minimum_key_size_check=Kontroll av minsta tillÃ¥tna nyckelstorlek config.ssh_minimum_key_sizes=Minsta tillÃ¥tna nyckelstorlek @@ -1876,48 +2031,48 @@ config.db_ssl_mode=SSL config.db_path=Sökväg config.service_config=Tjänstkonfiguration -config.register_email_confirm=Kräv mejlbekräftelse för att registrera +config.register_email_confirm=Kräv e-postbekräftelse för att registrera config.disable_register=Inaktivera självregistrering config.enable_openid_signup=Aktivera självregistrering genom OpenID config.enable_openid_signin=Aktivera OpenID-inloggning config.show_registration_button=Visa registreringsknapp -config.require_sign_in_view=Kräv inloggning för att visa sidor -config.mail_notify=Aktivera Mejlnotifikationer +config.require_sign_in_view=Kräv inloggning för att visa innehÃ¥ll +config.mail_notify=Aktivera e-postnotiser config.enable_captcha=Aktivera CAPTCHA -config.active_code_lives=Aktivera livstid för koder -config.default_keep_email_private=Dölj mejladresser som standard +config.active_code_lives=Livstid för aktiveringskoder +config.default_keep_email_private=Dölj e-postadresser som standard config.default_allow_create_organization=TillÃ¥t skapandet utav organisationer som standard config.enable_timetracking=Aktivera tidsredovisning -config.default_enable_timetracking=Aktivera tidredovisning som Standard -config.default_allow_only_contributors_to_track_time=LÃ¥t endast medarbetare spÃ¥ra tidsredovisning -config.no_reply_address=Dold mejldomän +config.default_enable_timetracking=Aktivera tidredovisning som standard +config.default_allow_only_contributors_to_track_time=LÃ¥t endast bidragsgivare spÃ¥ra tid +config.no_reply_address=Dold e-postdomän config.webhook_config=Webbkrokskonfiguration config.queue_length=Kölängd config.deliver_timeout=Tidsfrist för leverans -config.skip_tls_verify=Skippa TLS verifiering +config.skip_tls_verify=Skippa TLS-verifiering config.mailer_enabled=Aktiverad config.mailer_name=Namn config.mailer_smtp_port=SMTP-port config.mailer_user=Användare config.mailer_use_sendmail=Använd Sendmail -config.mailer_sendmail_path=Sendmail sökväg +config.mailer_sendmail_path=Sökväg för sendmail config.mailer_sendmail_args=Extra argument till sendmail -config.send_test_mail=Skicka testmeddelande +config.send_test_mail=Skicka testmejl config.oauth_config=OAuth-konfiguration config.oauth_enabled=Aktiverad -config.cache_config=Mellanlagringskonfiguration -config.cache_adapter=Mellanlagringsadapter -config.cache_interval=Mellanlagringsintervall -config.cache_conn=Mellanlagringsanslutning +config.cache_config=Cachekonfiguration +config.cache_adapter=Cacheadapter +config.cache_interval=Cacheintervall +config.cache_conn=Cacheanslutning config.session_config=Sessionskonfiguration config.session_provider=Sessionsleverantör config.provider_config=Leverantörskonfiguration -config.cookie_name=Cookie-namn +config.cookie_name=Cookienamn config.gc_interval_time=Tidsintervall för skräpsamling config.session_life_time=Livstid för session config.https_only=Endast HTTPS @@ -1926,21 +2081,21 @@ config.cookie_life_time=Livstid för kaka config.picture_config=Konfiguration för bild och avatar config.picture_service=Bildtjänst config.disable_gravatar=Inaktivera Gravatar -config.enable_federated_avatar=Aktivera Förenad Uppslaging av Profilbilder +config.enable_federated_avatar=Aktivera federerade avatarer config.git_config=Git-konfiguration -config.git_disable_diff_highlight=Inaktivera Diff Syntax Highlight -config.git_max_diff_lines=Max Diff-rader (per fil) -config.git_max_diff_line_characters=Max Diff-tecken (per rad) -config.git_max_diff_files=Max Diff-filer (att visa) +config.git_disable_diff_highlight=Inaktivera syntaxmarkering i diffar +config.git_max_diff_lines=Maximalt antal diff-rader per fil +config.git_max_diff_line_characters=Maximalt antal diff-karaktärer per rad +config.git_max_diff_files=Maximalt antal diff-filer att visa config.git_gc_args=Skräpsamlarargument config.git_migrate_timeout=Migreringstimeout -config.git_mirror_timeout=Spelgingsuppdateringstimeout -config.git_clone_timeout=Klonoperationstimeout -config.git_pull_timeout=Klonoperationstimeout -config.git_gc_timeout=GC-operationstimeout +config.git_mirror_timeout=Tidsfrist för spegeluppdatering +config.git_clone_timeout=Tidsfrist för kloning +config.git_pull_timeout=Tidsfrist för pull +config.git_gc_timeout=Tidsfrist för skräpsamling -config.log_config=Logg-konfiguration +config.log_config=Loggkonfiguration config.disabled_logger=Inaktiverad config.xorm_log_sql=Logga SQL @@ -1967,18 +2122,26 @@ monitor.queue.settings.submit=Uppdatera inställningar monitor.queue.settings.changed=Inställningar uppdaterade notices.system_notice_list=Systemnotiser -notices.view_detail_header=Visa notisdetaljer -notices.select_all=Markera Alla +notices.view_detail_header=Notisdetaljer +notices.select_all=Markera alla notices.deselect_all=Avmarkera alla -notices.inverse_selection=Invertera Markeringar -notices.delete_selected=Ta Bort Markerade -notices.delete_all=Ta Bort Alla Notiser +notices.inverse_selection=Invertera markeringar +notices.delete_selected=Ta bort markerade +notices.delete_all=Ta bort alla notiser notices.type=Typ notices.type_1=Utvecklingskatalog notices.type_2=Uppgift notices.desc=Beskrivning notices.op=Op. notices.delete_success=Systemnotifikationer har blivit raderade. +users.2fa = 2FA +users.reserved = Reserverad +self_check.database_fix_mysql = För MySQL/MariaDB-användare sÃ¥ kan du använda kommandot â€forgejo doctor convert†för att Ã¥tgärda problemet med kollateringen, eller sÃ¥ du Ã¥tgärda det genom att manuellt använda SQL "ALTER ... COLLATE ...". +users.bot = Bott +users.remote = FjärrÃ¥tkomst +users.restricted.description = TillÃ¥t endast interaktion med utvecklingskataloger och organisationer där den här användaren finns tillagd som medarbetare. Det förhindrar tillgÃ¥ng till allmänna utvecklingskataloger i den här instansen. +users.is_restricted = Begränsat konto +self_check.database_inconsistent_collation_columns = Databasen använder kollateringen %s, men dessa kolumner använder felanpassade kollateringar. Det kan komma att orsaka oväntade problem. [action] @@ -1991,6 +2154,10 @@ compare_branch=Jämför compare_commits=Jämför %d commits compare_commits_general=Jämför commits mirror_sync_delete=synkade och raderade referens %[2]s pÃ¥ %[3]s frÃ¥n spegel +approve_pull_request = `godkände %[3]s#%[2]s` +create_branch = skapade grenen %[3]s i %[4]s +starred_repo = stjärnmärkte %[2]s +watched_repo = började följa %[2]s [tool] now=nu @@ -2054,9 +2221,6 @@ owner.settings.cleanuprules.enabled=Aktiv [secrets] [actions] - - - runners.name=Namn runners.owner_type=Typ runners.description=Beskrivning @@ -2073,6 +2237,39 @@ runs.commit=Commit [projects] [git.filemode] -; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … symbolic_link=Symbolisk länk + + +[search] +milestone_kind = Sök milstolpar... +exact = Exakt +exact_tooltip = Inkludera bara resultat som exakt matchar söktermen +repo_kind = Sök repon… +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... +search = Sök… +type_tooltip = Söktyp +team_kind = Sök lag... +org_kind = Sök organisationer... +issue_kind = Sök ärenden... +regexp_tooltip = Tolka söktermen som ett reguljärt uttryck +code_search_unavailable = Kodsökning är för närvarande inte tillgänglig. Vänligen kontakta webbplatsadministratören. +fuzzy_tooltip = Inkludera resultat som är närliggande till söktermen +no_results = Inga matchande resultat hittades. +code_search_by_git_grep = Nuvarande kodsökningsresultat gjordes med "git grep". Det kan finnas bättre resultat om webbplatsadministratören möjliggör indexering av kod. +fuzzy = Ungefärlig +union = Nyckelord +union_tooltip = Inkludera resultat som matchar nÃ¥got av de med mellanslag separerade sökorden +pull_kind = Sök ändringsförslag… +regexp = RegExp +keyword_search_unavailable = Sökning pÃ¥ nyckelord är för närvarande inte tillgängligt. Vänligen kontakta webbplatsadministratören. + + +[translation_meta] +test = Det här är en teststräng. Den visas inte i Forgejo UI men används vid testtillfälle. Vänligen skriv in "ok" för att spara tid (eller en intressant fakta du själv väljer) för att nÃ¥ upp till 100% komplett :) \ No newline at end of file diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index 9aa99729d6..fc13786cdd 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -17,10 +17,10 @@ page=Sayfa template=Åžablon language=Dil notifications=Bildirimler -active_stopwatch=Etkin Zaman Takibi +active_stopwatch=Etkin Zaman Takipçisi tracked_time_summary=Konu listesi süzgeçlerine dayanan takip edilen zamanın özeti create_new=OluÅŸtur… -user_profile_and_more=Profil ve Ayarlar… +user_profile_and_more=Profil ve ayarlar… signed_in_as=GiriÅŸ yapan: enable_javascript=Bu web sitesinin çalışması için JavaScript gereklidir. toc=İçindekiler Tablosu @@ -28,12 +28,12 @@ licenses=Lisanslar return_to_forgejo=Forgejo'ya Dön username=Kullanıcı Adı -email=E-posta Adresi +email=E-posta adresi password=Parola access_token=EriÅŸim Kodu -re_type=Parolayı DoÄŸrula +re_type=Parolayı doÄŸrula captcha=CAPTCHA -twofa=İki AÅŸamalı DoÄŸrulama +twofa=İki aÅŸamalı doÄŸrulama twofa_scratch=İki aÅŸamalı kazınmış kod passcode=Åžifre @@ -56,13 +56,13 @@ organization=Organizasyon mirror=Yansı new_repo=Yeni Depo new_migrate=Yeni Göç -new_mirror=Yeni Yansı +new_mirror=Yeni yansıma new_fork=Yeni Depo Çatalı new_org=Yeni Organizasyon -new_project=Yeni Proje -new_project_column=Yeni Sütun +new_project=Yeni proje +new_project_column=Yeni sütun manage_org=Organizasyonları Yönet -admin_panel=Site Yönetimi +admin_panel=Site yönetimi account_settings=Hesap Ayarları settings=Ayarlar your_profile=Profil @@ -76,7 +76,7 @@ collaborative=İşbirlikçi forks=Çatallar activities=Etkinlikler -pull_requests=DeÄŸiÅŸiklik İstekleri +pull_requests=DeÄŸiÅŸiklik istekleri issues=Konular milestones=Kilometre TaÅŸları @@ -87,9 +87,9 @@ rerun=Yeniden çalıştır rerun_all=Tüm görevleri yeniden çalıştır save=Kaydet add=Ekle -add_all=Tümünü Ekle +add_all=Tümünü ekle remove=Kaldır -remove_all=Tümünü Kaldır +remove_all=Tümünü kaldır remove_label_str=`"%s" öğesini kaldır` edit=Düzenle view=Görüntüle @@ -112,13 +112,13 @@ preview=Önizleme loading=Yükleniyor… error=Hata -error404=UlaÅŸmaya çalıştığınız sayfa mevcut deÄŸil veya görüntüleme yetkiniz yok. +error404=UlaÅŸmaya çalıştığınız sayfa mevcut deÄŸil ,kaldırılmış veya görüntüleme yetkiniz yok. go_back=Geri Git never=Asla unknown=Bilinmiyor -rss_feed=RSS Beslemesi +rss_feed=RSS yayını pin=Sabitle unpin=Sabitlemeyi kaldır @@ -141,17 +141,17 @@ confirm_delete_selected=Tüm seçili öğeleri gerçekten silmek istiyor musunuz name=İsim value=DeÄŸer -copy_generic = Kopyala +copy_generic = Panoya kopyala filter = Filtrele filter.not_archived = ArÅŸivlenmemiÅŸ filter.clear = Filtreleri Temizle filter.is_archived = ArÅŸivlenmiÅŸ -filter.is_mirror = YansılaÅŸtırılmış -filter.is_fork = Çatallanmış -filter.not_fork = Çatallanmamış +filter.is_mirror = Yansılar +filter.is_fork = Çatallar +filter.not_fork = Çatallanmayanlar filter.not_mirror = Yansılanmamış filter.is_template = Åžablon -filter.not_template = Åžablon deÄŸil +filter.not_template = Åžablon olmayan filter.public = Herkese açık filter.private = Gizli more_items = Daha fazla öğe @@ -163,11 +163,16 @@ 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ÅŸ +copy_path = Dizini kopyala + +confirm_delete_artifact = "%s" adlı öğeyi silmek istediÄŸinizden emin misiniz? [aria] -navbar=Gezinti ÇubuÄŸu +navbar=Gezinti çubuÄŸu footer=Alt Bilgi -footer.software=Yazılım Hakkında +footer.software=Bu yazılım hakkında footer.links=BaÄŸlantılar [heatmap] @@ -175,6 +180,8 @@ 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 [editor] buttons.heading.tooltip=BaÅŸlık ekle @@ -191,6 +198,12 @@ buttons.ref.tooltip=Bir konuya veya deÄŸiÅŸiklik isteÄŸine deÄŸin buttons.switch_to_legacy.tooltip=Eski düzenleyiciyi kullan buttons.enable_monospace_font=EÅŸaralıklı yazıtipini etkinleÅŸtir buttons.disable_monospace_font=EÅŸaralıklı yazıtipini devre dışı bırak +buttons.new_table.tooltip = Tablo ekle +table_modal.header = Tablo ekle +table_modal.placeholder.header = BaÅŸlık +table_modal.placeholder.content = İçerik +table_modal.label.rows = Satırlar +table_modal.label.columns = Sütunlar [filter] string.asc=A - Z @@ -198,18 +211,18 @@ string.desc=Z - A [error] occurred=Bir hata oluÅŸtu -report_message=Bunun bir Forgejo hatası olduÄŸunu düşünüyorsanız, lütfen GitHub sayfasında sorunu arayın veya gerekiyorsa yeni bir sorun oluÅŸturun. +report_message=Bunun bir Forgejo hatası olduÄŸunu düşünüyorsanız, lütfen Codeberg sayfasında sorunu arayın veya gerekiyorsa yeni bir sorun oluÅŸturun. missing_csrf=Hatalı İstek: CSRF anahtarı yok invalid_csrf=Hatalı İstek: geçersiz CSRF eriÅŸim anahtarı not_found=Hedef bulunamadı. network_error=AÄŸ hatası +server_internal = İç sunucu hatası [startpage] app_desc=Zahmetsiz, kendi sunucunuzda barındırabileceÄŸiniz Git servisi install=Kurulumu kolay install_desc=Platformunuz için ikili dosyayı çalıştırın, Docker ile yükleyin veya paket olarak edinin. platform=Farklı platformlarda çalışablir -platform_desc=Forgejo Go ile derleme yapılabilecek her yerde çalışmaktadır: Windows, macOS, Linux, ARM, vb. Hangisini seviyorsanız onu seçin! lightweight=Hafif lightweight_desc=Forgejo'nın minimal gereksinimleri çok düşüktür ve ucuz bir Raspberry Pi üzerinde çalışabilmektedir. Makine enerjinizden tasarruf edin! license=Açık Kaynak @@ -220,12 +233,12 @@ install=Kurulum title=BaÅŸlangıç Yapılandırması docker_helper=EÄŸer Forgejo'yı Docker içerisinde çalıştırıyorsanız, lütfen herhangi bir deÄŸiÅŸiklik yapmadan önce belgeleri okuyun. require_db_desc=Forgejo MySQL, PostgreSQL, SQLite3 veya TiDB (MySQL protokolü) gerektirir. -db_title=Veritabanı Ayarları -db_type=Veritabanı Türü +db_title=Veritabanı ayarları +db_type=Veritabanı tipi host=Sunucu user=Kullanıcı adı password=Parola -db_name=Veritabanı Adı +db_name=Veritabanı adı db_schema=Åžema db_schema_helper=Veritabanı varsayılanı için boÅŸ bırakın ("genel"). ssl_mode=SSL @@ -244,16 +257,16 @@ err_admin_name_is_reserved=Yönetici Kullanıcı Adı geçersiz, bu kullanıcı 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 -general_title=Genel Ayarlar +general_title=Genel ayarlar app_name=Site BaÅŸlığı app_name_helper=Åžirket adınızı buraya girebilirsiniz. -repo_path=Depo Kök Yolu +repo_path=Depo kök dizini repo_path_helper=Tüm uzak Git depoları bu dizine kaydedilecektir. -lfs_path=Git LFS Kök Yolu +lfs_path=Git LFS kök dizini lfs_path_helper=Git LFS tarafından izlenen dosyalar bu dizinde saklanacaktır. LFS'yi devre dışı bırakmak için boÅŸ bırakın. run_user=Åžu Kullanıcı Olarak Çalıştır run_user_helper=Forgejo'nin çalışacağı iÅŸletim sistemi kullanıcı adı. Bu kullanıcının depo kök yoluna eriÅŸiminin olması gerektiÄŸini unutmayın. -domain=Sunucu Alan Adı +domain=Sunucu alan adı domain_helper=Sunucu için alan adı veya ana bilgisayar adresi. ssh_port=SSH Sunucu Portu ssh_port_helper=SSH sunucusunun dinleyeceÄŸi port numarası. EtkisizleÅŸtimek için boÅŸ bırakın. @@ -265,25 +278,25 @@ log_root_path=Günlük Dosyaları Yolu log_root_path_helper=Günlük dosyaları bu dizine kaydedilecektir. optional_title=İsteÄŸe BaÄŸlı Ayarlar -email_title=E-posta Ayarları -smtp_addr=SMTP Sunucusu -smtp_port=SMTP Portu +email_title=E-posta ayarları +smtp_addr=SMTP sunucusu +smtp_port=SMTP portu smtp_from=E-posta Gönderen smtp_from_helper=Forgejo'nın kullanacağı e-posta adresi. Yalın bir e-posta adresi girin veya "İsim" biçimini kullanın. -mailer_user=SMTP Kullanıcı Adı -mailer_password=SMTP Parolası +mailer_user=SMTP kullanıcı adı +mailer_password=SMTP parolası register_confirm=Kayıt için E-posta DoÄŸrulaması Gereksin -mail_notify=E-Posta Bildirimlerini EtkinleÅŸtir +mail_notify=E-Posta bildirimlerini etkinleÅŸtir server_service_title=Sunucu ve DiÄŸer Servis Ayarları offline_mode=Yerel Kipi EtkinleÅŸtir offline_mode.description=Üçüncü parti içerik teslim aÄŸlarını etkisizleÅŸtirin ve bütün kaynakları yerelden sunun. disable_gravatar=Gravatar'ı Devre Dışı Bırak -disable_gravatar.description=Gravatar ve üçüncü parti avatar kaynaklarını iptal edin. Kullanıcı bir avatar yüklemediÄŸi zaman varsayılan bir avatar kullanılacaktır. +disable_gravatar.description=Gravatar ve diÄŸer üçüncü parti profil resmi kaynaklarını kullanma. Kullanıcı bir profil resmi yüklemediÄŸi zaman varsayılan bir resim kullanılacaktır. federated_avatar_lookup=BirleÅŸtirilmiÅŸ Avatarları EtkinleÅŸtir -federated_avatar_lookup.description=Libravatar kullanarak federe avatar aramasını etkinleÅŸtirin. +federated_avatar_lookup.description=Libravatar kullanarak federe profil resmi aramasını etkinleÅŸtirin. disable_registration=Kendi Kendine Kaydolmayı Devre Dışı Bırak disable_registration.description=Kullanıcının kendi kendine kaydolmasını devre dışı bırak. Yalnızca yöneticiler yeni hesaplar oluÅŸturabilecek. -allow_only_external_registration.description=Sadece dış hizmetler aracılığıyla kullanıcı kaydına izin ver +allow_only_external_registration.description=Sadece belirlenen dış hizmetler aracılığıyla kullanıcı kaydına izin ver. openid_signin=OpenID Oturum Açmayı EtkinleÅŸtiriniz openid_signin.description=OpenID ile kullanıcı giriÅŸini etkinleÅŸtir. openid_signup=OpenID ile Kendi Kendine Kaydı EtkinleÅŸtir @@ -292,12 +305,12 @@ enable_captcha=CAPTCHA kaydını etkinleÅŸtir enable_captcha.description=Kullanıcının kendi kendine kaydolması için captcha doÄŸrulaması gereksin. require_sign_in_view=Sayfaları Görüntülemek için GiriÅŸ Yapmak Gereksin require_sign_in_view.description=Sayfa eriÅŸimini giriÅŸ yapmış kullanıcılarla sınırlandır. Ziyaretçiler sadece oturum açma ve kayıt sayfalarını görecektir. -admin_setting.description=Bir yönetici hesabı açmak isteÄŸe baÄŸlıdır. İlk kayıtlı kullanıcı kendiliÄŸinden yönetici olmaktadır. -admin_title=Yönetici Hesabı Ayarları -admin_name=Yönetici Kullanıcı Adı +admin_setting.description=Bir yönetici hesabı açmak isteÄŸe baÄŸlıdır. İlk kayıt olan kullanıcı kendiliÄŸinden yönetici olacaktır. +admin_title=Yönetici hesabı ayarları +admin_name=Yönetici kullanıcı adı admin_password=Parola -confirm_password=Parolayı DoÄŸrula -admin_email=E-posta Adresi +confirm_password=Parolayı doÄŸrula +admin_email=E-posta adresi install_btn_confirm=Forgejo'u Kur test_git_failed='git' komut testi baÅŸarısız: %v sqlite3_not_available=Bu Gieta sürümü SQLite3 desteklemiyor. Lütfen %s adresinden resmi çalışır sürümü ('gobuild' sürümünü deÄŸil) indirin. @@ -312,7 +325,7 @@ save_config_failed=%v Yapılandırması kaydedilirken hata oluÅŸtu invalid_admin_setting=Yönetici hesap ayarları geçersiz: %v invalid_log_root_path=Log dosya yolu geçersiz: %v default_keep_email_private=E-posta adreslerini varsayılan olarak gizle -default_keep_email_private.description=Yeni kullanıcı hesaplarının e-posta adreslerini varsayılan olarak gizle. +default_keep_email_private.description=Kayıt olunduktan hemen sonra bilgi sızıntısı olmaması için yeni kullanıcı hesaplarının e-posta adreslerini varsayılan olarak gizle. default_allow_create_organization=Varsayılan Olarak Organizasyon OluÅŸturmaya İzin Ver default_allow_create_organization.description=Varsayılan olarak yeni kullanıcı hesaplarının organizasyon oluÅŸturmasına izin ver. default_enable_timetracking=Varsayılan Olarak Zaman Takibini EtkinleÅŸtir @@ -322,12 +335,19 @@ no_reply_address_helper=GizlenmiÅŸ e-posta adresine sahip kullanıcılar için a password_algorithm=Parola Hash Algoritması invalid_password_algorithm=Hatalı parola hash algoritması password_algorithm_helper=Parola hash algoritmasını ayarlayın. Algoritmalar deÄŸiÅŸen gereksinimlere ve güce sahiptirler. argon2 algoritması iyi özelliklere sahip olmasına raÄŸmen fazla miktarda bellek kullanır ve küçük sistemler için uygun olmayabilir. -enable_update_checker=Güncelleme Denetleyicisini EtkinleÅŸtir +enable_update_checker=Güncelleme denetleyicisini etkinleÅŸtir env_config_keys=Ortam Yapılandırma env_config_keys_prompt=AÅŸağıdaki ortam deÄŸiÅŸkenleri de yapılandırma dosyanıza eklenecektir: +allow_only_external_registration = Sadece dış hizmetler aracılığıyla kullanıcı kaydına izin ver +app_slogan = OluÅŸum sloganı +app_slogan_helper = OluÅŸum sloganınızı giriniz. Devre dışı bırakmak için boÅŸ bırakınız. +enable_update_checker_helper_forgejo = release.forgejo.org adresindeki TXT DNS kayıdı kullanılarak yeni Forgejo sürümleri düzenli olarak kontrol edilecektir. +allow_dots_in_usernames = Kullanıcı isimlerinde noktaya izin ver. Var olan kullanıcıları etkilemez. + +smtp_from_invalid = `"E-posta Olarak Gönder" adresi geçersiz` [home] -uname_holder=Kullanıcı Adı veya E-Posta Adresi +uname_holder=Kullanıcı adı veya e-posta adresi password_holder=Parola switch_dashboard_context=Panoya GeçiÅŸ Yap my_repos=Depolar @@ -374,15 +394,19 @@ code_search_results=`"%s" için sonuçları ara` code_last_indexed_at=Son dizinlenen %s relevant_repositories_tooltip=Çatal olan veya konusu, simgesi veya açıklaması olmayan depolar gizlenmiÅŸtir. relevant_repositories=Sadece iliÅŸkili depolar gösteriliyor, süzülmemiÅŸ sonuçları göster. +stars_one = %d yıldız +stars_few = %d yıldız +forks_one = %d çatal +forks_few = %d çatal [auth] -create_new_account=Hesap OluÅŸtur +create_new_account=Hesap oluÅŸtur register_helper_msg=Bir hesabınız var mı? Åžimdi giriÅŸ yapın! social_register_helper_msg=Hesabınız var mı? Hemen baÄŸlayın! disable_register_prompt=Kayıt iÅŸlemi devre dışıdır. Lütfen site yöneticinizle iletiÅŸim kurun. disable_register_mail=Kayıt için e-posta doÄŸrulama devre dışıdır. manual_activation_only=EtkinleÅŸtirmeyi tamamlamak için site yöneticinizle baÄŸlantıya geçin. -remember_me=Bu Aygıtı hatırla +remember_me=Bu cihazı hatırla remember_me.compromised=Oturum açma tokeni artık geçerli deÄŸil, bu ele geçirilmiÅŸ bir hesaba iÅŸaret ediyor olabilir. Lütfen hesabınızda olaÄŸandışı faaliyet olup olmadığını denetleyin. forgot_password_title=Åžifremi unuttum forgot_password=Åžifrenizi mi unuttunuz? @@ -401,7 +425,7 @@ has_unconfirmed_mail=Merhaba %s, doÄŸrulanmamış bir e-posta adresin var (%s resend_mail=EtkinleÅŸtirme e-postasını tekrar almak için buraya tıklayın email_not_associate=Bu e-posta adresi hiçbir hesap ile iliÅŸkilendirilmemiÅŸtir. send_reset_mail=Hesap Kurtarma E-postası Gönder -reset_password=Hesap Kurtarma +reset_password=Hesap kurtarma invalid_code=DoÄŸrulama kodunuz geçersiz veya süresi dolmuÅŸ. invalid_code_forgot_password=Onay kodunuz hatalı veya süresi geçmiÅŸ. Yeni bir oturum baÅŸlatmak için buraya tıklayın. invalid_password=Parolanız hesap oluÅŸturulurken kullanılan parolayla eÅŸleÅŸmiyor. @@ -415,9 +439,9 @@ use_scratch_code=Bir çizgi kodu kullanınız twofa_scratch_used=Geçici kodunuzu kullandınız. İki aÅŸamalı ayarlar sayfasına yönlendirildiniz, burada aygıt kaydınızı kaldırabilir veya yeni bir geçici kod oluÅŸturabilirsiniz. twofa_passcode_incorrect=Åžifreniz yanlış. Aygıtınızı yanlış yerleÅŸtirdiyseniz, oturum açmak için çizgi kodunuzu kullanın. twofa_scratch_token_incorrect=Çizgi kodunuz doÄŸru deÄŸildir. -login_userpass=Oturum Aç +login_userpass=Oturum aç tab_openid=Açık Kimlik -oauth_signup_tab=Yeni Hesap OluÅŸtur +oauth_signup_tab=Yeni hesap oluÅŸtur oauth_signup_title=Yeni Hesabı Tamamla oauth_signup_submit=Hesabı Tamamla oauth_signin_tab=Mevcut Hesaba BaÄŸla @@ -445,6 +469,15 @@ authorization_failed_desc=Geçersiz bir istek tespit ettiÄŸimiz için yetkilendi sspi_auth_failed=SSPI kimlik doÄŸrulaması baÅŸarısız oldu password_pwned=SeçtiÄŸiniz parola, daha önce herkese açık veri ihlallerinde açığa çıkan bir çalınan parola listesindedir. Lütfen farklı bir parola ile tekrar deneyin ve baÅŸka yerlerde de bu parolayı deÄŸiÅŸtirmeyi düşünün. password_pwned_err=HaveIBeenPwned'e yapılan istek tamamlanamadı +change_unconfirmed_email_summary = Aktivasyon e-postasının geldiÄŸi adresi deÄŸiÅŸtir. +change_unconfirmed_email_error = E-posta adresi deÄŸiÅŸtirilemedi: %v +last_admin = Son yöneticiyi kaldırmazsınız. En az bir yönetici olmalıdır. +back_to_sign_in = GiriÅŸ yapa dön +sign_up_button = Hemen kaydol. +hint_register = Hesaba ihtiyacın var mı? Hemen kaydol. +sign_in_openid = OpenID ile giriÅŸ yap +hint_login = Mevcut hesabın var mı? Hemen giriÅŸ yap! +use_onetime_code = Tek kullanımlık kod kullan [mail] view_it_on=%s üzerinde görüntüle @@ -511,6 +544,18 @@ team_invite.subject=%[1]s sizi %[2]s organizasyonuna katılmaya davet etti team_invite.text_1=%[1]s sizi %[3]s organizasyonundaki %[2]s takımına katılmaya davet etti. team_invite.text_2=Takıma katılmak lütfen aÅŸağıdaki baÄŸlantıya tıklayın: team_invite.text_3=Not: Bu davet %[1]s içindi. Bu daveti beklemiyorsanız, e-postayı yok sayabilirsiniz. +totp_disabled.text_1 = Hesabınızdaki zaman-tabanlı tek kullanımlık ÅŸifre/iki faktörlü doÄŸrulama (TOTP) devre dışı bırakıldı. +removed_security_key.subject = Bir güvenlik anahtarı kaldırıldı +primary_mail_change.subject = Ana e-posta adresiniz deÄŸiÅŸti +totp_disabled.subject = TOTP devre dışı bırakıldı +removed_security_key.text_1 = Güvenlik anahtarı "%[1]s" hesabınızdan kaldırıldı. +account_security_caution.text_2 = EÄŸer bu siz deÄŸilseniz hesabınız ele geçirilmiÅŸ demektir. Lütfen site yöneticileri ile iletiÅŸime geçiniz. +admin.new_user.subject = Yeni kullanıcı %s kayıt oldu +account_security_caution.text_1 = EÄŸer bu sizseniz bu e-postayı görmezden gelebilirsiniz. +password_change.subject = Parolanız deÄŸiÅŸti +admin.new_user.user_info = Kullanıcı bilgisi +admin.new_user.text = Lütfen bu kullanıcıyı admin panelinden yönetmek için buraya tıklayın. +password_change.text_1 = Hesabınızın parolası deÄŸiÅŸti. [modal] yes=Evet @@ -609,8 +654,22 @@ org_still_own_repo=Bu organizasyon hala bir veya daha fazla depoya sahip, önce org_still_own_packages=Bu organizasyon hala bir veya daha fazla pakete sahip, önce onları silin. target_branch_not_exist=Hedef dal mevcut deÄŸil. +To = Dal adı +Description = Açıklama +Pronouns = Adıllar +FullName = Tam isim +required_prefix = Girdi "%s" ile baÅŸlamalıdır +Biography = Biyografi +AccessToken = EriÅŸim jetonu +Location = Konum +Website = Websitesi +admin_cannot_delete_self = Yöneticiyken kullanıcınızı silemezsiniz. Lütfen önce yönetici yetkilerinizi kaldırın. +username_error_no_dots = ` sadece alfanumerik karakterler ("0-9","a-z","A-Z"), tire ("-") ve alt tire ("-") içerebilir. Alfanumerik olmayan karakterlerle baÅŸlayamaz ve bitemez, ayrıca ardışık alfanumerik olmayan karakterler de kullanılamaz.` +unset_password = Oturum açma kullanıcısı parola belirlemedi. +unsupported_login_type = Oturum açma türü hesap silmeyi desteklemiyor. + [user] change_avatar=Profil resmini deÄŸiÅŸtir… joined_on=%s tarihinde katıldı @@ -635,6 +694,23 @@ settings=Kullanıcı Ayarları form.name_reserved=`"%s" kullanıcı adı rezerve edilmiÅŸ.` form.name_pattern_not_allowed=Kullanıcı adında "%s" deseni kullanılamaz. form.name_chars_not_allowed=`"%s" kullanıcı adı geçersiz karakterler içeriyor.` +following.title.few = Takip edilenler +public_activity.visibility_hint.admin_private = Bu aktivite yönetici olduÄŸunuz için açıktır ama kullanıcı gizli kalmasını tercih etmiÅŸtir. +block_user = Kullanıcıyı engelle +public_activity.visibility_hint.self_public = Gizli alanlar haricindeki aktiviteleriniz herkese açıktır. DeÄŸiÅŸtir. +public_activity.visibility_hint.admin_public = Bu aktivite herkese açıktır ama bir yönetici olarak gizli alanlardaki etkileÅŸimleri de görebilirsiniz. +unblock = Engeli kaldır +following_one = %d takipçi +follow_blocked_user = Bu kullanıcıyı takip edemezsiniz çünkü bu kullanıcıyı engellediniz veya bu kullanıcı tarafından engellendiniz. +followers.title.few = Takipçiler +following.title.one = Takip edilenler +followers.title.one = Takipçi +block = Engelle +public_activity.visibility_hint.self_private = Aktiviteniz sadece size ve oluÅŸum yöneticilerine açıktır. DeÄŸiÅŸtir. +followers_one = %d takipçi +block_user.detail_2 = Bu kullanıcı sahip olduÄŸunuz depolar, açtığınız sorunlar ve yaptığınız yorumlar ile etkileÅŸime geçemeyecek. +block_user.detail_1 = Birbirinizden takipten çıkacak ve birbirinizi takip edemeyeceksiniz. +block_user.detail = Bu kullanıcıyı engellediÄŸinizde: [settings] profile=Profil @@ -852,7 +928,7 @@ select_permissions=İzinleri seçin permission_no_access=EriÅŸim Yok permission_read=OkunmuÅŸ permission_write=Okuma ve Yazma -access_token_desc=Seçili token izinleri, yetkilendirmeyi ilgili API yollarıyla sınırlandıracaktır. Daha fazla bilgi için belgeleri okuyun. +access_token_desc=Seçili token izinleri, yetkilendirmeyi ilgili API yollarıyla sınırlandıracaktır. Daha fazla bilgi için belgeleri okuyun. at_least_one_permission=Bir token oluÅŸturmak için en azından bir izin seçmelisiniz permissions_list=İzinler: @@ -947,6 +1023,16 @@ visibility.limited=Sınırlı visibility.limited_tooltip=Sadece oturum açmış kullanıcılar tarafından görünür visibility.private=Özel visibility.private_tooltip=Sadece katıldığınız organizasyonların üyeleri tarafından görünür +user_unblock_success = Kullanıcının engeli baÅŸarılı bir ÅŸekilde kaldırıldı. +user_block_success = Kullanıcı baÅŸarılı bir ÅŸekilde engellendi. +language.title = Varsayılan dil +change_password = Parolayı güncelle +pronouns = Adıllar +blocked_users = Engelli kullanıcılar +pronouns_unspecified = BelirtilmemiÅŸ +hints = İpuçları +language.description = Bu dil giriÅŸ yaptığınızda varsayılan dil olarak kullanılmak üzere hesabınıza kaydedilecektir. +keep_activity_private.description = Åžu anki halka açık aktiviteniz sadece size ve oluÅŸum yöneticilerine açık olacaktır. [repo] new_repo_helper=Bir depo, sürüm geçmiÅŸi dahil tüm proje dosyalarını içerir. Zaten baÅŸka bir yerde mi barındırıyorsunuz? Depoyu taşıyın. @@ -1041,9 +1127,9 @@ blame.ignore_revs=.git-blame-ignore-revs dosyasındaki sürüml blame.ignore_revs.failed=.git-blame-ignore-revs dosyasındaki sürümler yok sayılamadı. author_search_tooltip=En fazla 30 kullanıcı görüntüler -tree_path_not_found_commit=%[1] yolu, %[2]s iÅŸlemesinde mevcut deÄŸil -tree_path_not_found_branch=%[1] yolu, %[2]s dalında mevcut deÄŸil -tree_path_not_found_tag=%[1] yolu, %[2]s etiketinde mevcut deÄŸil +tree_path_not_found_commit=%[1]s yolu, %[2]s iÅŸlemesinde mevcut deÄŸil +tree_path_not_found_branch=%[1]s yolu, %[2]s dalında mevcut deÄŸil +tree_path_not_found_tag=%[1]s yolu, %[2]s etiketinde mevcut deÄŸil transfer.accept=Aktarımı Kabul Et transfer.accept_desc=`"%s" tarafına aktar` @@ -1117,7 +1203,7 @@ migrate.migrating_failed_no_addr=Göç baÅŸarısız oldu. migrate.github.description=Github.com veya diÄŸer Github sunucularından veri aktar. migrate.git.description=Herhangi bir Git hizmetinden sadece bir depoyu aktar. migrate.gitlab.description=Gitlab.com veya diÄŸer Gitlab sunucularından veri aktar. -migrate.gitea.description=Gitea.com veya diÄŸer Gitea/Forgejo sunucularından veri aktar. +migrate.gitea.description=Gitea.com veya diÄŸer Gitea sunucularından veri aktar. migrate.gogs.description=Notabug.org veya diÄŸer Gogs sunucularından veri aktar. migrate.onedev.description=Code.onedev.io ve diÄŸer OneDev sunucularından veri aktar. migrate.codebase.description=Codebasehq.com sitesinden veri aktar. @@ -1205,6 +1291,7 @@ view_git_blame=Git Suç Görüntüle video_not_supported_in_browser=Tarayıcınız HTML5 'video' etiketini desteklemiyor. audio_not_supported_in_browser=Tarayıcınız HTML5 'audio' etiketini desteklemiyor. stored_lfs=Git LFS ile depolandı +stored_annex=Git Annex ile depolandı symbolic_link=Sembolik BaÄŸlantı executable_file=Çalıştırılabilir Dosya commit_graph=İşleme GrafiÄŸi @@ -1228,6 +1315,7 @@ editor.upload_file=Dosya Yükle editor.edit_file=Dosyayı Düzenle editor.preview_changes=DeÄŸiÅŸiklikleri Önizle editor.cannot_edit_lfs_files=LFS dosyaları web arayüzünde düzenlenemez. +editor.cannot_edit_annex_files=Annex dosyaları web arayüzünde düzenlenemez. editor.cannot_edit_non_text_files=Bu tür dosyalar web arayüzünden düzenlenemez. editor.edit_this_file=Dosyayı Düzenle editor.this_file_locked=Dosya kilitlendi @@ -1242,7 +1330,8 @@ editor.or=veya editor.cancel_lower=İptal editor.commit_signed_changes=İmzalı DeÄŸiÅŸiklikleri İşle editor.commit_changes=DeÄŸiÅŸiklikleri Uygula -editor.add_tmpl='' eklendi +editor.add_tmpl='<%s>' eklendi +editor.add_tmpl.filename = dosyaadi editor.add=%s Ekle editor.update=%s Güncelle editor.delete=%s Sil @@ -1252,7 +1341,7 @@ editor.fail_to_apply_patch=`"%s" yaması uygulanamıyor` editor.new_patch=Yeni Yama editor.commit_message_desc=İsteÄŸe baÄŸlı uzun bir açıklama ekleyin… editor.signoff_desc=İşleme günlüğü mesajının sonuna iÅŸleyen tarafından imzalanan bir fragman ekleyin. -editor.commit_directly_to_this_branch=DoÄŸrudan %s bölümüne uygula. +editor.commit_directly_to_this_branch=DoÄŸrudan %[1]s bölümüne uygula. editor.create_new_branch=Bu iÅŸleme için yeni bir dal oluÅŸturun ve bir deÄŸiÅŸiklik isteÄŸi baÅŸlatın. editor.create_new_branch_np=Bu iÅŸleme için yeni bir dal oluÅŸtur. editor.propose_file_change=Dosya deÄŸiÅŸikliÄŸi öner @@ -1618,7 +1707,7 @@ issues.error_modifying_due_date=BitiÅŸ tarihi deÄŸiÅŸtirilemedi. issues.error_removing_due_date=BitiÅŸ tarihi silinemedi. issues.push_commit_1=%d iÅŸlemeyi %s ekledi issues.push_commits_n=%d iÅŸlemeyi %s ekledi -issues.force_push_codes=`%[1]s %[2]s hedefinden %[4]s hedefine zorla gönderildi %[6]s` +issues.force_push_codes=`%[1]s %[2]s hedefinden %[4]s hedefine zorla gönderildi %[6]s` issues.force_push_compare=KarşılaÅŸtır issues.due_date_form=yyyy-aa-gg issues.due_date_form_add=BitiÅŸ tarihi ekle @@ -1733,7 +1822,7 @@ pulls.nothing_to_compare=Bu dallar eÅŸit. DeÄŸiÅŸiklik isteÄŸi oluÅŸturmaya gere pulls.nothing_to_compare_and_allow_empty_pr=Bu dallar eÅŸittir. Bu Dİ boÅŸ olacak. pulls.has_pull_request=`Bu dallar arasında zaten bir deÄŸiÅŸiklik isteÄŸi var: %[2]s#%[3]d` pulls.create=DeÄŸiÅŸiklik İsteÄŸi OluÅŸtur -pulls.title_desc_few=%[2]s içindeki %[1]d iÅŸlemeyi %[3]s ile birleÅŸtirmek istiyor +pulls.title_desc_few=%[2]s içindeki %[1]d iÅŸlemeyi %[3]s ile birleÅŸtirmek istiyor pulls.merged_title_desc_few=%[4]s %[2]s içindeki %[1]d iÅŸlemeyi %[3]s ile birleÅŸtirdi pulls.change_target_branch_at='hedef dal %s adresinden %s%s adresine deÄŸiÅŸtirildi' pulls.tab_conversation=Sohbet @@ -1826,7 +1915,7 @@ pulls.cmd_instruction_hint=`Komut satırı talimatlarını görüntüleyin.` pulls.cmd_instruction_checkout_title=Çekme pulls.cmd_instruction_checkout_desc=Proje deponuzdan yeni bir dalı çekin ve deÄŸiÅŸiklikleri test edin. pulls.cmd_instruction_merge_title=BirleÅŸtir -pulls.cmd_instruction_merge_desc=DeÄŸiÅŸiklikleri birleÅŸtirin ve Gitea'da güncelleyin. +pulls.cmd_instruction_merge_desc=DeÄŸiÅŸiklikleri birleÅŸtirin ve Forgejo güncelleyin. pulls.clear_merge_message=BirleÅŸtirme iletilerini temizle pulls.clear_merge_message_hint=BirleÅŸtirme iletisini temizlemek sadece iÅŸleme ileti içeriÄŸini kaldırır ama üretilmiÅŸ "Co-Authored-By …" gibi git fragmanlarını korur. @@ -2344,9 +2433,9 @@ settings.protect_branch_name_pattern=KorunmuÅŸ Dal Adı Deseni settings.protect_branch_name_pattern_desc=KorunmuÅŸ dal isim desenleri. Desen sözdizimi için belgelere bakabilirsiniz. Örnekler: main, release/** settings.protect_patterns=Desenler settings.protect_protected_file_patterns=Korumalı dosya kalıpları (noktalı virgülle ayrılmış ';'): -settings.protect_protected_file_patterns_desc=Kullanıcının bu dalda dosya ekleme, düzenleme veya silme hakları olsa bile doÄŸrudan deÄŸiÅŸtirilmesine izin verilmeyen korumalı dosyalar. Birden çok desen noktalı virgül (';') kullanılarak ayrılabilir. Desen sözdizimi için github.com/gobwas/glob belgelerine bakın. Örnekler: .drone.yml, /docs/**/*.txt. +settings.protect_protected_file_patterns_desc=Kullanıcının bu dalda dosya ekleme, düzenleme veya silme hakları olsa bile doÄŸrudan deÄŸiÅŸtirilmesine izin verilmeyen korumalı dosyalar. Birden çok desen noktalı virgül (';') kullanılarak ayrılabilir. Desen sözdizimi için %[2]s belgelerine bakın. Örnekler: .drone.yml, /docs/**/*.txt. settings.protect_unprotected_file_patterns=Korunmasız dosya desenleri (noktalı virgülle ayrılmış ';'): -settings.protect_unprotected_file_patterns_desc=Kullanıcının yazma eriÅŸimi, itme kısıtlamasını atlama hakkı olduÄŸunda doÄŸrudan deÄŸiÅŸtirmesine izin verilen korunmasız dosyalar. Birden çok desen noktalı virgül (';') kullanılarak ayrılabilir. Desen söz dizimi için %[2]s belgelerine bakın. Örnekler: .drone.yml, /docs/**/*.txt. +settings.protect_unprotected_file_patterns_desc=Kullanıcının yazma eriÅŸimi, itme kısıtlamasını atlama hakkı olduÄŸunda doÄŸrudan deÄŸiÅŸtirmesine izin verilen korunmasız dosyalar. Birden çok desen noktalı virgül (';') kullanılarak ayrılabilir. Desen söz dizimi için %[2]s belgelerine bakın. Örnekler: .drone.yml, /docs/**/*.txt. settings.add_protected_branch=Korumayı etkinleÅŸtir settings.delete_protected_branch=Korumayı devre dışı bırak settings.update_protect_branch_success=Dal koruma kuralı "%s" güncellendi. @@ -2590,8 +2679,59 @@ find_file.no_matching=EÅŸleÅŸen dosya bulunamadı error.csv.too_large=Bu dosya çok büyük olduÄŸu için iÅŸlenemiyor. error.csv.unexpected=%d satırı ve %d sütununda beklenmeyen bir karakter içerdiÄŸinden bu dosya iÅŸlenemiyor. error.csv.invalid_field_count=%d satırında yanlış sayıda alan olduÄŸundan bu dosya iÅŸlenemiyor. +admin.enabled_flags = Etiketler ÅŸu depo için etkinleÅŸti: +admin.update_flags = Etiketleri güncelle +admin.failed_to_replace_flags = Depo etiketleri deÄŸiÅŸtirilemedi +admin.manage_flags = Etiketleri yönet +admin.flags_replaced = Depo etiketleri deÄŸiÅŸtirildi +rss.must_be_on_branch = RSS akışı için bir dalda olmalısınız. +settings.transfer_quota_exceeded = Yeni sahip (%s) kotayı aÅŸmış. Depo aktarılamadı. +contributors.contribution_type.filter_label = Katılım tipi: +settings.enter_repo_name = Sahibi ve depo adını tam olarak ÅŸu ÅŸekilde girin: +contributors.contribution_type.additions = Eklemeler +settings.units.overview = Genel Bakış +settings.federation_settings = Federasyon Ayarları +wiki.cancel = İptal +settings.transfer.button = SahipliÄŸi aktar +settings.transfer.modal.title = SahipliÄŸi aktar +wiki.no_search_results = Sonuç yok +settings.federation_not_enabled = OluÅŸumunuz federasyona açık deÄŸildir. +settings.pull_mirror_sync_quota_exceeded = Kota aşıldı, deÄŸiÅŸiklikler çekilmeyecek. +activity.navbar.contributors = Katılımcılar +contributors.contribution_type.deletions = Çıkarmalar +settings.new_owner_blocked_doer = Yeni sahip sizi engelledi. + +open_with_editor = %s ile aç +object_format = Nesne Biçimi +mirror_sync = eÅŸitlendi +stars = Yıldızlar +desc.sha256 = SHA256 +vendored = SaÄŸlanmış +generated = ÜretilmiÅŸ +editor.push_out_of_date = İtme eskimiÅŸ. +commits.search_branch = Bu Dal +issues.edit.already_changed = Konuya yapılan deÄŸiÅŸiklikler kaydedilemiyor. İçerik baÅŸka kullanıcı tarafından deÄŸiÅŸtirilmiÅŸ gözüküyor. DiÄŸerlerinin deÄŸiÅŸikliklerinin üzerine yazmamak için lütfen sayfayı yenileyin ve tekrar düzenlemeye çalışın +pulls.edit.already_changed = DeÄŸiÅŸiklik isteÄŸine yapılan deÄŸiÅŸiklikler kaydedilemiyor. İçerik baÅŸka kullanıcı tarafından deÄŸiÅŸtirilmiÅŸ gözüküyor. DiÄŸerlerinin deÄŸiÅŸikliklerinin üzerine yazmamak için lütfen sayfayı yenileyin ve tekrar düzenlemeye çalışın +pulls.nothing_to_compare_have_tag = Seçili dal/etiket aynı. +pulls.fast_forward_only_merge_pull_request = Sadece ileri sarma +comments.edit.already_changed = Yoruma yapılan deÄŸiÅŸiklikler kaydedilemiyor. İçerik baÅŸka kullanıcı tarafından deÄŸiÅŸtirilmiÅŸ gözüküyor. DiÄŸerlerinin deÄŸiÅŸikliklerinin üzerine yazmamak için lütfen sayfayı yenileyin ve tekrar düzenlemeye çalışın +milestones.filter_sort.name = Ad +activity.navbar.pulse = EÄŸilim +activity.navbar.code_frequency = Kod Frekansı +activity.navbar.recent_commits = Son İşlemeler +settings.mirror_settings.pushed_repository = İtilmiÅŸ depo +settings.ignore_stale_approvals = EskimiÅŸ onayları yoksay +settings.ignore_stale_approvals_desc = Daha eski iÅŸlemelere (eski incelemelere) yapılmış olan onayları, Dİ'nin kaç onayı olduÄŸunu belirlerken sayma. EskimiÅŸ incelemeler atıldıysa bu ilgisizdir. +error.broken_git_hook = Bu deponun Git İstemcileri bozuk gibi gözüküyor. Onarmak için lütfen belgelere bakın, daha sonra durumu yenilemek için bazı iÅŸlemeler itin. [graphs] +component_loading = %s yükleniyor... +component_loading_failed = %s yüklenemedi +component_loading_info = Bu biraz sürebilir… +component_failed_to_load = Beklenmedik bir hata oluÅŸtu. +code_frequency.what = kod frekansı +contributors.what = katkılar +recent_commits.what = son iÅŸlemeler [org] org_name_holder=Organizasyon Adı @@ -2925,12 +3065,12 @@ packages.size=Boyut packages.published=Yayınlandı defaulthooks=Varsayılan Web İstemcileri -defaulthooks.desc=Web İstemcileri, belirli Gitea olayları tetiklendiÄŸinde otomatik olarak HTTP POST isteklerini sunucuya yapar. Burada tanımlanan Web İstemcileri varsayılandır ve tüm yeni depolara kopyalanır. web istemcileri kılavuzunda daha fazla bilgi edinin. +defaulthooks.desc=Web İstemcileri, belirli Forgejo olayları tetiklendiÄŸinde otomatik olarak HTTP POST isteklerini sunucuya yapar. Burada tanımlanan Web İstemcileri varsayılandır ve tüm yeni depolara kopyalanır. web istemcileri kılavuzunda daha fazla bilgi edinin. defaulthooks.add_webhook=Varsayılan Web İstemcisi Ekle defaulthooks.update_webhook=Varsayılan Web İstemcisini Güncelle systemhooks=Sistem Web İstemcileri -systemhooks.desc=Belirli Gitea olayları tetiklendiÄŸinde Web istemcileri otomatik olarak bir sunucuya HTTP POST istekleri yapar. Burada tanımlanan web istemcileri sistemdeki tüm depolar üzerinde çalışır, bu yüzden lütfen bunun olabilecek tüm performans sonuçlarını göz önünde bulundurun. web istemcileri kılavuzunda daha fazla bilgi edinin. +systemhooks.desc=Belirli Forgejo olayları tetiklendiÄŸinde Web istemcileri otomatik olarak bir sunucuya HTTP POST istekleri yapar. Burada tanımlanan web istemcileri sistemdeki tüm depolar üzerinde çalışır, bu yüzden lütfen bunun olabilecek tüm performans sonuçlarını göz önünde bulundurun. web istemcileri kılavuzunda daha fazla bilgi edinin. systemhooks.add_webhook=Sistem Web İstemcisi Ekle systemhooks.update_webhook=Sistem Web İstemcisi Güncelle @@ -3245,6 +3385,23 @@ notices.op=İşlem notices.delete_success=Sistem bildirimleri silindi. +self_check = Öz Denetim +config_summary = Özet +config_settings = Ayarlar +dashboard.sync_repo_tags = Etiketleri git verisinden veritabanına eÅŸitle +emails.delete = E-postayı Sil +emails.delete_desc = Bu e-posta adresini silmek istediÄŸinizden emin misiniz? +emails.deletion_success = E-posta adresi silindi. +emails.delete_primary_email_error = Ana e-posta adresini silemezsiniz. +config.cache_test = ÖnbelleÄŸi Sına +config.cache_test_failed = ÖnbelleÄŸin incelenmesi baÅŸarısız oldu: %v. +config.cache_test_slow = Önbellek sınaması baÅŸarılı, ancak yanıt yavaÅŸ: %s. +config.cache_test_succeeded = Önbellek sınaması baÅŸarılı, %s sürede bir yanıt alındı. +config.open_with_editor_app_help = Klon menüsü için "Birlikte aç" düzenleyicileri. BoÅŸ bırakılırsa, varsayılan kullanılacaktır. Varsayılanı görmek için geniÅŸletin. +self_check.no_problem_found = Henüz bir sorun bulunmadı. +self_check.database_collation_mismatch = Veritabanının ÅŸu harmanlamayı kullanmasını bekle: %s +self_check.database_inconsistent_collation_columns = Veritabanı %s harmanlamasını kullanıyor, ancak bu sütunlar uyumsuz harmanlamalar kullanıyor. Bu beklenmedik sorunlar oluÅŸturabilir. + [action] create_repo=depo %s oluÅŸturuldu rename_repo=%[1]s olan depo adını %[3]s buna çevirdi @@ -3485,6 +3642,9 @@ owner.settings.chef.title=Chef Kütüğü owner.settings.chef.keypair=Anahtar çifti üret owner.settings.chef.keypair.description=Chef kütüğünde kimlik doÄŸrulaması için bir anahtar çifti gereklidir. EÄŸer daha önce bir anahtar çifti ürettiyseniz, yeni bir anahtar çifti üretmek eski anahtar çiftini ıskartaya çıkartacaktır. +npm.dependencies.bundle = PaketlenmiÅŸ Bağımlılıklar +rpm.repository.multiple_groups = Bu paket birçok grupta mevcut. + [secrets] secrets=Gizlilikler description=Gizlilikler belirli iÅŸlemlere aktarılacaktır, bunun dışında okunamaz. @@ -3576,7 +3736,7 @@ need_approval_desc=DeÄŸiÅŸiklik isteÄŸi çatalında iÅŸ akışı çalıştırmak variables=DeÄŸiÅŸkenler variables.management=DeÄŸiÅŸken Yönetimi -variables.creation=DeÄŸiÅŸken Ekle +variables.creation=DeÄŸiÅŸken ekle variables.none=Henüz hiçbir deÄŸiÅŸken yok. variables.deletion=DeÄŸiÅŸkeni kaldır variables.deletion.description=Bir deÄŸiÅŸkeni kaldırma kalıcıdır ve geri alınamaz. Devam edilsin mi? @@ -3592,14 +3752,18 @@ runs.no_workflows.documentation = Gitea İşlem'i hakkında daha fazla bilgi iç variables.id_not_exist = %d kimlikli deÄŸiÅŸken mevcut deÄŸil. runs.no_workflows.quick_start = Gitea İşlem'i nasıl baÅŸlatacağınızı bilmiyor musunuz? Hızlı baÅŸlangıç rehberine bakabilirsiniz. +runs.no_job_without_needs = İş akışı en azından bağımlılığı olmayan bir görev içermelidir. +runs.no_job = İş akışı en azından bir görev içermelidir +runs.expire_log_message = Günlükler, çok eski oldukları için temizlendiler. + [projects] type-1.display_name=KiÅŸisel Proje type-2.display_name=Depo Projesi type-3.display_name=Organizasyon Projesi +deleted.display_name = SilinmiÅŸ proje [git.filemode] changed_filemode=%[1]s → %[2]s -; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … directory=Dizin normal_file=Normal dosya executable_file=Çalıştırılabilir dosya @@ -3610,10 +3774,26 @@ submodule=Alt modül [search] project_kind = Projeleri ara... -org_kind = Organizasyonları ara... -team_kind = Takımları ara... -search = Ara... -code_kind = Kodları 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... -user_kind = Kullanıcıları ara... \ No newline at end of file +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... +no_results = EÅŸleÅŸen sonuç bulunamadı. +code_search_unavailable = Kod araması ÅŸu anda kullanıma açık deÄŸildir. Lütfen site yöneticisi ile iletiÅŸime geçin. +issue_kind = Sorunları ara... +pull_kind = BirleÅŸtirme isteklerini ara... +code_search_by_git_grep = Anlık kod araması sonuçları "git grep" komutu tarafından saÄŸlanmaktadır. Site yöneticisinin kod endekslemesini açması durumunda daha iyi sonuçlar verilmesi mümkün olabilir. +keyword_search_unavailable = Anahtar kelime ile arama ÅŸu anda kullanıma açık deÄŸildir. Lütfen site yöneticisi ile iletiÅŸime geçin. +fuzzy_tooltip = Arama terimine yakın olan eÅŸleÅŸmeleri dahil et +union_tooltip = BoÅŸlukla ayrılmış anahtar kelime eÅŸleÅŸmelerini dahil et +exact_tooltip = Sadece arama terimiyle tam uyuÅŸan sonuçları dahit et. +fuzzy = Bulanık +exact = Tam diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 70ac146062..bb80e54914 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -23,10 +23,10 @@ toc=ЗміÑÑ‚ licenses=Ліцензії return_to_forgejo=ПовернутиÑÑ Ð´Ð¾ Forgejo -username=Ім'Ñ ÐºÑ€Ð¸Ñтувача +username=Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувач_ки email=ÐдреÑа електронної пошти password=Пароль -access_token=Токен ДоÑтупу +access_token=Токен доÑтупу re_type=ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ captcha=CAPTCHA twofa=Двофакторна Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ @@ -41,11 +41,11 @@ mirror=Дзеркало new_repo=Ðовий репозиторій new_migrate=Ðова Ð¼Ñ–Ð³Ñ€Ð°Ñ†Ñ–Ñ new_mirror=Ðове дзеркало -new_fork=Ðовий репозиторій - ÐºÐ¾Ð¿Ñ–Ñ +new_fork=Ðовий форк репозиторію new_org=Ðова Ð¾Ñ€Ð³Ð°Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ new_project=Ðовий проєкт manage_org=ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ñ€Ð³Ð°Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñми -admin_panel=Панель ÐдмініÑтратора +admin_panel=Панель адмініÑтрації account_settings=ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу settings=ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ your_profile=Профіль @@ -86,7 +86,7 @@ preview=Попередній переглÑд loading=ЗавантаженнÑ… error=Помилка -error404=Сторінка, до Ñкої ви намагаєтеÑÑ Ð·Ð²ÐµÑ€Ð½ÑƒÑ‚Ð¸ÑÑ Ð°Ð±Ð¾ до , не Ñ–Ñнує або Ви не маєте права на Ñ—Ñ— переглÑд. +error404=Сторінка, до Ñкої ви намагаєтеÑÑ Ð·Ð²ÐµÑ€Ð½ÑƒÑ‚Ð¸ÑÑ, не Ñ–Ñнує, Ñ—Ñ— було видалено або ви не маєте права на Ñ—Ñ— переглÑд. never=Ðіколи @@ -104,11 +104,11 @@ name=Ðазва logo = Логотип sign_in_with_provider = Увійти через %s tracked_time_summary = ПідÑумок відÑтеженого чаÑу з урахуваннÑм фільтрів ÑпиÑку задач -enable_javascript = Сайту треба JavaScript. +enable_javascript = Цей вебÑайт потребує JavaScript. webauthn_press_button = ÐатиÑніть кнопку на ключі безпеки… webauthn_use_twofa = Введіть код Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð· телефону webauthn_error = Ðе вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ñ‚Ð¸ ключ безпеки. -webauthn_error_unknown = ТрапилаÑÑŒ невідома помилка. Будь лаÑка, повторіть Ñпробу. +webauthn_error_unknown = СталаÑÑ Ð½ÐµÐ²Ñ–Ð´Ð¾Ð¼Ð° помилка. Будь лаÑка, повторіть Ñпробу. webauthn_error_unable_to_process = Сервер не зміг обробити запит. webauthn_error_duplicated = Запит із наданим ключем безпеки відхилено. ВпевнітьÑÑ, що цього ключа ще не зареєÑтровано. webauthn_error_empty = Ключ Ñлід ÑкоÑÑŒ назвати. @@ -132,18 +132,56 @@ value = Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ webauthn_insert_key = Під'єднайте ключ безпеки download_logs = Завантажити журнали webauthn_sign_in = ÐатиÑніть кнопку на ключі безпеки. Якщо ключ безпеки не має кнопки, від'єднайте його й під'єднайте ще раз. -webauthn_unsupported_browser = Ваш оглÑдач наразі не підтримує WebAuthn. +webauthn_unsupported_browser = Ваш браузер наразі не підтримує WebAuthn. webauthn_error_insecure = WebAuthn підтримує лише захищені з'єднаннÑ. Ð”Ð»Ñ Ñ‚ÐµÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· HTTP можете викориÑтати origin-Ñ€Ñдок «localhost» чи «127.0.0.1» webauthn_error_timeout = Ключ не вÑтиг зчитатиÑÑŒ протÑгом відведеного терміну. Будь лаÑка, перезавантажте Ñторінку й повторіть Ñпробу. locked = Заблоковано +filter.is_template = Шаблони +test = ТеÑÑ‚ +show_timestamps = Показувати відмітки чаÑу +filter.clear = ОчиÑтити фільтри +filter.is_archived = Ðрхівовано +filter = Фільтри +toggle_menu = Перемкнути видиміÑть меню +confirm_delete_artifact = Ви впевнені, що хочете видалити артефакт «%s»? +artifacts = Ðртефакти +filter.not_archived = Ðе архівовано +filter.public = ЗагальнодоÑтупні +filter.private = Приватні +more_items = Більше пунктів +remove_label_str = Видалити об'єкт «%s» +new_repo.title = Ðовий репозиторій +new_migrate.title = Ðова Ð¼Ñ–Ð³Ñ€Ð°Ñ†Ñ–Ñ +new_org.title = Ðова Ð¾Ñ€Ð³Ð°Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ +new_repo.link = Ðовий репозиторій +new_migrate.link = Ðова Ð¼Ñ–Ð³Ñ€Ð°Ñ†Ñ–Ñ +new_org.link = Ðова Ð¾Ñ€Ð³Ð°Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ +copy_generic = Скопіювати до буфера обміну +show_log_seconds = Показувати Ñекунди +show_full_screen = Показувати у повноекранному режимі +filter.is_fork = Форки +filter.not_fork = Ðе форки +filter.is_mirror = Дзеркала +filter.not_mirror = Ðе дзеркала +filter.not_template = Ðе шаблони +error413 = Ви вичерпали Ñвою квоту. +invalid_data = ÐедійÑні дані: %v +copy_path = Копіювати шлÑÑ… [aria] -footer.software = Про програму +footer.software = Про заÑтоÑунок footer.links = ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ +footer = Ðижній колонтитул +navbar = Панель навігації [heatmap] less = Менше more = Більше +contributions_one = внеÑок +number_of_contributions_in_the_last_12_months = %s внеÑків за оÑтанні 12 міÑÑців +contributions_zero = Ðема внеÑків +contributions_format = {contributions} за {month} {day}, {year} +contributions_few = внеÑки [editor] buttons.bold.tooltip = Додати грубий шрифт @@ -155,23 +193,45 @@ buttons.list.unordered.tooltip = Додати маркований ÑпиÑок buttons.list.ordered.tooltip = Додати нумерований ÑпиÑок buttons.list.task.tooltip = Додати ÑпиÑок завдань buttons.heading.tooltip = Додати заголовок +buttons.switch_to_legacy.tooltip = ВикориÑтовувати заÑтарілий редактор заміÑть поточного +buttons.disable_monospace_font = Вимкнути моноширинний шрифт +buttons.indent.tooltip = ВклаÑти предмет на один рівень +buttons.unindent.tooltip = ВиклаÑти об'єкт на один рівень +buttons.mention.tooltip = Згадати кориÑтувача чи команду +buttons.ref.tooltip = ПоÑлатиÑÑŒ на задачу чи на запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ +buttons.enable_monospace_font = Увімкнути моноширинний шрифт +buttons.new_table.tooltip = Додати таблицю +table_modal.label.columns = Стовпці +table_modal.header = Додати таблицю +table_modal.placeholder.header = Заголовок +table_modal.placeholder.content = ВміÑÑ‚ +table_modal.label.rows = РÑдки +link_modal.description = ÐžÐ¿Ð¸Ñ +link_modal.url = URL +link_modal.header = Додати поÑÐ¸Ð»Ð°Ð½Ð½Ñ +link_modal.paste_reminder = Підказка: Ñкщо Ñкопіювати URL-адреÑу в буфер обміну, можна Ñтворювати поÑиланнÑ, вÑтавлÑючи Ñ—Ñ— безпоÑередньо в редакторі. [filter] +string.asc = Ð - Я +string.desc = Я - Ð [error] occurred=СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° missing_csrf=Ðекоректний запит: токен CSRF не задано network_error=Помилка мережі +server_internal = Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° Ñервера +report_message = Якщо ви думаєте, що це вада Forgejo, будь лаÑка, пошукайте Ñ—Ñ— у ÑпиÑку задач на Codeberg чи Ñтворіть нову задачу, Ñкщо необхідно. +not_found = Ціль не була знайдена. [startpage] app_desc=Зручний влаÑний ÑÐµÑ€Ð²Ñ–Ñ Ñ…Ð¾Ñтингу репозиторіїв Git install=Легко вÑтановити platform=ПлатформонезалежніÑть -platform_desc=Forgejo виконуєтьÑÑ Ð½Ð° платформі, Ð´Ð»Ñ Ñкої можливо Ñкомпілювати Go: Windows, macOS, Linux, ARM, та інших. Оберіть ту, Ñка вам до вподоби! +platform_desc=Forgejo підтверджено працює на вільних операційних ÑиÑтемах, Ñк-от Linux Ñ– FreeBSD, так Ñамо й на різних архітектурах ЦП. Оберіть, Ñка вам до вподоби! lightweight=ÐевибагливіÑть lightweight_desc=Forgejo має низькі вимоги до реÑурÑів та може працювати на недорогому Raspberry Pi. Заощадьте енергію Ñвого комп'ютера! license=Відкритий вихідний код -license_desc=Відвідайте Forgejo! ПриєднайтеÑÑŒ до Ð½Ð°Ñ Ñ‚Ð° зробіть Ñвій внеÑок до проєкту, щоб зробити його ще краще. Ðе бійтеÑÑ Ð´Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ÑÑ! +license_desc=Відвідайте Forgejo! ПриєднуйтеÑÑ Ð´Ð¾ Ð½Ð°Ñ Ñ– зробіть Ñвій внеÑок, щоб покращити проєкт ще більше. Ðе бійтеÑÑ Ð´Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ÑÑ! install_desc = ПроÑто запуÑтіть уже зібрану програму Ð´Ð»Ñ Ñвоєї платформи, розгорніть Ñ—Ñ— за допомогою Docker або вÑтановіть пакунок. [install] @@ -183,7 +243,7 @@ db_type=Тип бази даних host=ХоÑÑ‚ user=Ім'Ñ ÐºÑ€Ð¸Ñтувача password=Пароль -db_name=Ім'Ñ Ð±Ð°Ð·Ð¸ даних +db_name=Ðазва бази даних db_schema=Схема db_schema_helper=Залиште пуÑтим Ð´Ð»Ñ Ð±Ð°Ð·Ð¸ даних за замовчуваннÑм ("публічна"). ssl_mode=SSL @@ -198,92 +258,108 @@ 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=Ðеправильне ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача-адмініÑтратора general_title=Загальні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ -app_name=Ðазва Ñайту -app_name_helper=Тут ви можете ввеÑти назву Ñвоєї компанії. -repo_path=Кореневий шлÑÑ… Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ +app_name=Ðазва екземплÑра +app_name_helper=Уведіть тут назву Ñвого екземплÑра. Вона відображатиметьÑÑ Ð½Ð° кожній Ñторінці. +repo_path=Коренева тека репозиторію repo_path_helper=Ð’ÑÑ– вилучені Git репозиторії будуть збережені в цей каталог. -lfs_path=Кореневої шлÑÑ… Git LFS +lfs_path=Кореневий шлÑÑ… Git LFS lfs_path_helper=У цій папці будуть зберігатиÑÑ Ñ„Ð°Ð¹Ð»Ð¸ Git LFS. Залиште порожнім, щоб вимкнути LFS. -run_user=ЗапуÑк від імені КориÑтувача +run_user=КориÑтувач, від Ñкого запуÑтити domain=Домен Ñервера domain_helper=Домен або адреÑа хоÑта Ñервера. -ssh_port=Порт SSH Ñервера -ssh_port_helper=Ðомер порту, Ñкий викориÑтовує SSH Ñервер. Залиште порожнім, щоб вимкнути SSH. -http_port=Forgejo HTTP порт -http_port_helper=Ðомер порту, Ñкий буде проÑлуховуватиÑÑ Forgejos веб-Ñервером. -app_url=Базова URL-адреÑа Forgejo +ssh_port=Порт SSH-Ñервера +ssh_port_helper=Ðомер порту, що викориÑтовує SSH Ñервер. Залиште порожнім, аби вимкнути SSH. +http_port=HTTP-порт Ð´Ð»Ñ Ð¿Ñ€Ð¾ÑÐ»ÑƒÑ…Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ +http_port_helper=Ðомер порту, що буде проÑлуховуватиÑÑ Ð²ÐµÐ±Ñервером Forgejo. +app_url=Базова URL-адреÑа app_url_helper=Базова адреÑа Ð´Ð»Ñ HTTP(S) ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· URL та повідомлень електронної пошти. -log_root_path=ШлÑÑ… до лог файлу +log_root_path=ШлÑÑ… до файлу журналу log_root_path_helper=Файли журналу будуть запиÑані в цей каталог. optional_title=Додаткові Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ -email_title=ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Email -smtp_addr=SMTP хоÑÑ‚ -smtp_port=SMTP порт -smtp_from=ВідправлÑти Email від імені +email_title=ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ email +smtp_addr=ÐдреÑа SMTP +smtp_port=Порт SMTP +smtp_from=ВідправлÑти email від імені smtp_from_helper=Електронна пошта Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð² GÑ–tea. Введіть звичайну електронну адреÑу або викориÑтовуйте формат: "Ім'Ñ" . -mailer_user=SMTP Ім'Ñ ÐºÑ€Ð¸Ñтувача -mailer_password=SMTP Пароль +mailer_user=SMTP Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача +mailer_password=SMTP пароль register_confirm=Потрібно підтвердити електронну пошту Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрації mail_notify=Увімкнути ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾ÑŽ поштою server_service_title=Сервер Ñ– Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ–Ñ… Ñлужб offline_mode=Увімкнути локальний режим -offline_mode.description=Відключити Ñторонні мережі доÑтавки контенту Ñ– обÑлуговувати вÑÑ– реÑурÑи локально. +offline_mode.description=Відключити поÑÑ‚Ð°Ñ‡Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ñƒ зі Ñторонніх мереж й обÑлуговувати вÑÑ– реÑурÑи локально. disable_gravatar=Вимкнути Gravatar -disable_gravatar.description=Відключити Gravatar Ñ– Ñторонні джерела аватарів. Якщо кориÑтувач не завантажить аватар локально то за замовчуваннÑм буде викориÑтовуватиÑÑ Ñтандартний аватар. -federated_avatar_lookup=Увімкнути федеративні аватари -federated_avatar_lookup.description=Увімкнути зовнішний Ðватар за допомогою Libravatar. +disable_gravatar.description=Вимкнути Gravatar або інші Ñторонні джерела аватарів. Якщо кориÑтувач не завантажить влаÑний аватар локально, то буде викориÑтовуватиÑÑ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм. +federated_avatar_lookup=Увімкнути федеровані аватари +federated_avatar_lookup.description=Увімкнути зовнішні аватари за допомогою Libravatar. disable_registration=Вимкнути ÑамоÑтійну реєÑтрацію -disable_registration.description=Вимкнути ÑамоÑтійну реєÑтрацію кориÑтувачів, тільки адмініÑтратор може Ñтворювати нові облікові запиÑи. -allow_only_external_registration.description=Дозволити реєÑтрацію тільки через Ñторонні ÑервіÑи +disable_registration.description=Тільки адмініÑтратор може Ñтворювати нові облікові запиÑи. ÐаÑтійно рекомендуємо залишити реєÑтрацію вимкненою, Ñкщо ви не збираєтеÑÑ Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÑƒÐ²Ð°Ñ‚Ð¸ загальнодоÑтупний екземплÑÑ€ та ÑприÑти поÑві величезної кількоÑті Ñпам-акаунтів. +allow_only_external_registration.description=КориÑтувачам буде дозволено реєÑтруватиÑÑŒ лише через налаштовані Ñторонні ÑервіÑи. openid_signin=Увімкнути реєÑтрацію за допомогою OpenID openid_signin.description=Увімкнути вхід за допомогою OpenID. openid_signup=Увімкнути ÑамоÑтійну реєÑтрацію за допомогою OpenID -openid_signup.description=Увімкнути ÑамореєÑтрацію кориÑтувачів на оÑнові OpenID. +openid_signup.description=Увімкнути ÑамореєÑтрацію кориÑтувачів тільки через OpenID. enable_captcha=Увімкнути CAPTCHA при реєÑтрації -enable_captcha.description=Вимагати перевірку CAPTCHA при ÑамоÑтійній реєÑтрації кориÑтувача. -require_sign_in_view=Вимагати авторизації Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду Ñторінок -admin_setting.description=Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу адмініÑтратора необов'Ñзково. Перший зареєÑтрований кориÑтувач автоматично Ñтає адмініÑтратором. +enable_captcha.description=Вимагати перевірку CAPTCHA Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¸Ñ… запиÑів. +require_sign_in_view=Вимагати авторизації Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду вміÑту екземплÑра +admin_setting.description=Створювати обліковий Ð·Ð°Ð¿Ð¸Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратора необов'Ñзково. Перший зареєÑтрований кориÑтувач автоматично Ñтає адмініÑтратором. admin_title=ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу адмініÑтратора -admin_name=Ім'Ñ ÐºÑ€Ð¸Ñтувача ÐдмініÑтратора +admin_name=Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача-адмініÑтратора admin_password=Пароль confirm_password=ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ admin_email=ÐдреÑа електронної пошти install_btn_confirm=Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Forgejo -test_git_failed=Ðе в змозі перевірити 'git' команду: %v -sqlite3_not_available=Ð¦Ñ Ð²ÐµÑ€ÑÑ–Ñ Forgejo не підтримує SQLite3. Будь лаÑка, завантажте офіційну бінарну верÑÑ–ÑŽ з %s (не верÑÑ–ÑŽ gobuild). +test_git_failed=Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¸Ñ‚Ð¸ команду «git»: %v +sqlite3_not_available=Ð¦Ñ Ð²ÐµÑ€ÑÑ–Ñ Forgejo не підтримує SQLite3. Будь лаÑка, завантажте офіційну бінарну верÑÑ–ÑŽ з %s (не верÑÑ–ÑŽ «gobuild»). invalid_db_setting=ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних Ñ” некоректними: %v invalid_repo_path=Помилковий шлÑÑ… до ÐºÐ¾Ñ€ÐµÐ½Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–ÑŽ: %v invalid_app_data_path=Ðекоректний шлÑÑ… до даних програми: %v -run_user_not_match=Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача 'run as' не Ñ” поточним ім'Ñм кориÑтувача: %s -> %s +run_user_not_match=Ім'Ñ Ð² «КориÑтувач, від Ñкого запуÑтити» не Ñ” ім'Ñм поточного кориÑтувача: %s -> %s internal_token_failed=Ðе вдалоÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ внутрішній токен: %v secret_key_failed=Ðе вдалоÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ Ñекретний ключ: %v save_config_failed=Ðе в змозі зберегти конфігурацію: %v invalid_admin_setting=ÐеприпуÑтимі Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу адмініÑтратора: %v invalid_log_root_path=ÐеприпуÑтимий шлÑÑ… Ð´Ð»Ñ Ð»Ð¾Ð³Ñ–Ð²: %v -default_keep_email_private=Приховати адреÑу електронної пошти за замовчуваннÑм -default_keep_email_private.description=Приховати адреÑу електронної пошти нових облікових запиÑів за замовчуваннÑм. +default_keep_email_private=Приховати адреÑи електронної пошти за замовчуваннÑм +default_keep_email_private.description=За замовчуваннÑм приховати адреÑи електронної пошти нових облікових запиÑів, щоб Ñ†Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð½Ðµ «витікала» одразу піÑÐ»Ñ Ñ€ÐµÑ”Ñтрації. default_allow_create_organization=Дозволити ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ñ€Ð³Ð°Ð½Ñ–Ð·Ð°Ñ†Ñ–Ð¹ за замовчуваннÑм -default_allow_create_organization.description=Дозволити новим обліковим запиÑам кориÑтувачів Ñтворювати організації за замовчуваннÑм. +default_allow_create_organization.description=Дозволити новим кориÑтувачам Ñтворювати організації за замовчуваннÑм. Якщо цю опцію вимкнено, дозвіл на ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ñ€Ð³Ð°Ð½Ñ–Ð·Ð°Ñ†Ñ–Ð¹ новим кориÑтувачам надає адмініÑтратор. default_enable_timetracking=Увімкнути відÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу за замовчуваннÑм -default_enable_timetracking.description=Включити відÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… репозиторіїв за замовчуваннÑм. +default_enable_timetracking.description=Дозволити викориÑÑ‚Ð°Ð½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— відÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… репозиторіїв за замовчуваннÑм. no_reply_address=Прихований поштовий домен -no_reply_address_helper=Доменне ім'Ñ Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів із прихованою електронною адреÑою. Ðаприклад, ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача 'joe' буде входити в Git Ñк 'joe@noreply.example.org', Ñкщо Ð´Ð»Ñ Ð¿Ñ€Ð¸Ñ…Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾ домену електронної пошти вÑтановлено 'noreply.example.org'. +no_reply_address_helper=Доменне ім'Ñ Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів із прихованою електронною адреÑою. Ðаприклад, кориÑтувач «joe» буде входити в Git Ñк «joe@noreply.example.org», Ñкщо Ð´Ð»Ñ Ð¿Ñ€Ð¸Ñ…Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾ домену електронної пошти вÑтановлено «noreply.example.org». password_algorithm=Ðлгоритм Ñ…ÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ +config_location_hint = Ці опції налаштувань будуть збережені в: +env_config_keys = ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñередовища +env_config_keys_prompt = Ці змінні Ñередовища будуть також заÑтоÑовані до вашого файлу конфігурації: +invalid_db_table = База даних «%s» недійÑна: %v +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 Ñ” доÑить безпечним, проте Ñпоживає багато памʼÑті та Ñ” недоречним Ð´Ð»Ñ Ð¼Ð°Ð»Ð¸Ñ… ÑиÑтем. +app_slogan = ГаÑло екземплÑра +app_slogan_helper = Уведіть гаÑло вашого екземплÑра тут. Залиште порожнім, аби вимкнути. +run_user_helper = Ð†Ð¼Ê¼Ñ ÐºÐ¾Ñ€Ð¸Ñтувача операційної ÑиÑтеми, від Ñкого запущено Forgejo. Зауважте, що цей кориÑтувач повинен мати доÑтуп до кореневої теки репозиторію. +smtp_from_invalid = ÐдреÑа з «ВідправлÑти email від імені» недійÑна +allow_dots_in_usernames = Дозволити кориÑтувачам викориÑтовувати крапки у Ñвоїх іменах. Ðе впливає на облікові запиÑи, що вже Ñ–Ñнують. +invalid_password_algorithm = ÐедійÑний варіант алгоритму Ñ…ÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ–Ð² +enable_update_checker_helper_forgejo = ÐаÑвніÑть нових верÑій Forgejo періодично перевірÑтиметьÑÑ Ñ‡ÐµÑ€ÐµÐ· перевірку запиÑу TXT DNS на release.forgejo.org. [home] -uname_holder=Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача або Ел. пошта +uname_holder=Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача або ел. пошта password_holder=Пароль switch_dashboard_context=Переключити контекÑÑ‚ панелі ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ my_repos=Репозиторії show_more_repos=Показати більше репозиторіїв… collaborative_repos=Спільні репозиторії -my_orgs=Мої організації +my_orgs=Організації my_mirrors=Мої дзеркала view_home=ПереглÑнути %s search_repos=Шукати репозиторій… @@ -317,7 +393,12 @@ org_no_results=Відповідних організацій не знайден code_no_results=Відповідний пошуковому запитанню код не знайдено. code_last_indexed_at=ОÑтанні індекÑовані %s relevant_repositories = ВідображаютьÑÑ Ð»Ð¸ÑˆÐµ релевантні репозиторії, переглÑнути результати без фільтру. -relevant_repositories_tooltip = Приховано форки, а також Ñховища без теми, значка й опиÑу. +relevant_repositories_tooltip = Приховано форки, а також репозиторії без теми, значка й опиÑу. +go_to = Перейти до +stars_one = %d зірка +stars_few = %d зірок +forks_one = %d форк +forks_few = %d форків [auth] create_new_account=РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу @@ -325,22 +406,22 @@ register_helper_msg=Вже зареєÑтровані? Увійдіть зара social_register_helper_msg=Вже Ñ” аккаунт? Зв'Ñжіть його зараз! disable_register_prompt=Вибачте, можливіÑть реєÑтрації відключена. Будь лаÑка, зв'ÑжітьÑÑ Ð· адмініÑтратором Ñайту. disable_register_mail=ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ñ€ÐµÑ”Ñтрації електронною поштою вимкнено. -remember_me=Запам’Ñтати цей приÑтрій -forgot_password_title=Забув пароль +remember_me=Запам'Ñтати цей приÑтрій +forgot_password_title=Забули пароль forgot_password=Забули пароль? sign_up_now=Потрібен обліковий запиÑ? ЗареєÑтруйтеÑÑ Ð·Ð°Ñ€Ð°Ð·. -confirmation_mail_sent_prompt=Ðовий лиÑÑ‚ Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð±ÑƒÐ»Ð¾ відправлено на %s, будь лаÑка, перевірте вашу поштову Ñкриньку протÑгом %s Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€ÐµÑ”Ñтрації. +confirmation_mail_sent_prompt=Ðовий лиÑÑ‚ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð±ÑƒÐ»Ð¾ надіÑлано %s. Щоб завершити реєÑтрацію, перевірте вхідні й перейдіть за наведеним поÑиланнÑм (на це маєте %s). Якщо електронну адреÑу вказано неправильно, ви можете ввійти Ñ– Ñтворити запит Ð´Ð»Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñ‰Ðµ одного лиÑта Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð½Ð° іншу адреÑу. must_change_password=Оновіть Ñвій пароль allow_password_change=Вимагати в кориÑтувача змінити пароль (рекомендуєтьÑÑ) -reset_password_mail_sent_prompt=Електронний лиÑÑ‚ із підтвердженнÑм надіÑлано %s. Перевірте папку 'Вхідні' в межах наÑтупних %s, щоб завершити Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу. +reset_password_mail_sent_prompt=ЛиÑÑ‚ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð±ÑƒÐ»Ð¾ надіÑлано %s. Щоб завершити Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу, перевірте вхідні й перейдіть за наведеним поÑиланнÑм (на це маєте %s). active_your_account=Ðктивувати обліковий Ð·Ð°Ð¿Ð¸Ñ account_activated=Обліковий Ð·Ð°Ð¿Ð¸Ñ Ð°ÐºÑ‚Ð¸Ð²Ð¾Ð²Ð°Ð½Ð¾ -prohibit_login=Вхід заборонений +prohibit_login=Обліковий Ð·Ð°Ð¿Ð¸Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾ resent_limit_prompt=Вибачте, ви вже запроÑили активацію по електронній пошті нещодавно. Будь лаÑка, зачекайте 3 хвилини, а потім Ñпробуйте ще раз. has_unconfirmed_mail=Привіт %s, у Ð²Ð°Ñ Ñ” непідтверджена електронна адреÑа (%s ). Якщо ви не отримали електронний лиÑÑ‚ із підтвердженнÑм або вам потрібно надіÑлати новий, натиÑніть на кнопку нижче. resend_mail=ÐатиÑніть тут, щоб виÑлати лиÑÑ‚ активації знову email_not_associate=Ð¦Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð° пошта не пов'Ñзана ні з одним обліковим запиÑом. -send_reset_mail=ÐадіÑлати електронний лиÑÑ‚ Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу +send_reset_mail=ÐадіÑлати лиÑта Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ reset_password=Ð’Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу invalid_code=Цей код Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð½ÐµÐ´Ñ–Ð¹Ñний або закінчивÑÑ. reset_password_helper=Відновити обліковий Ð·Ð°Ð¿Ð¸Ñ @@ -355,10 +436,10 @@ twofa_scratch_token_incorrect=Ðевірний одноразовий парол login_userpass=Увійти tab_openid=OpenID oauth_signup_tab=ЗареєÑтрувати обліковий Ð·Ð°Ð¿Ð¸Ñ -oauth_signup_title=Повний новий обліковий Ð·Ð°Ð¿Ð¸Ñ -oauth_signup_submit=Повний обліковий Ð·Ð°Ð¿Ð¸Ñ +oauth_signup_title=Завершити реєÑтрацію +oauth_signup_submit=Завершити oauth_signin_tab=ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Ñ–Ñнуючий обліковий Ð·Ð°Ð¿Ð¸Ñ -oauth_signin_title=Увійдіть щоб авторизувати пов'Ñзаний обліковий Ð·Ð°Ð¿Ð¸Ñ +oauth_signin_title=Увійдіть, щоб авторизувати пов'Ñзаний обліковий Ð·Ð°Ð¿Ð¸Ñ oauth_signin_submit=Прив'Ñзати обліковий Ð·Ð°Ð¿Ð¸Ñ openid_connect_submit=Під’єднатиÑÑ openid_connect_title=ПідключитиÑÑ Ð´Ð¾ Ñ–Ñнуючого облікового запиÑу @@ -371,15 +452,38 @@ email_domain_blacklisted=З вказаним email реєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð½ÐµÐ¼Ð¾ authorize_application=Ðвторизувати програму authorize_redirect_notice=Ð’Ð°Ñ Ð±ÑƒÐ´Ðµ переадреÑовано до %s, Ñкщо ви авторизуєте цю програму. authorize_application_created_by=Ð¦Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð° Ñтворена %s. -authorize_application_description=Якщо ви надаÑте цей доÑтуп, то він матиме доÑтуп до вÑÑ–Ñ… ваших даних облікового запиÑу, включаючи приватні репозиторії та організації. -authorize_title=Ðвторизуйвати "%s" Ð´Ð»Ñ Ð´Ð¾Ñтупу до вашого облікового запиÑу? +authorize_application_description=Якщо ви надаÑте дозвіл, то програма отримає доÑтуп до вÑÑ–Ñ… даних вашого облікового запиÑу, включно з приватними репозиторіÑми та організаціÑми. +authorize_title=Дозволити «%s» доÑтуп до вашого облікового запиÑу? authorization_failed=Помилка авторизації sspi_auth_failed=Помилка SSPI-автентифікації password_pwned_err=Ðе вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ запит до HaveIBeenPwed +change_unconfirmed_email_summary = Змінити адреÑу електронної пошти, на Ñку надходÑть активаційні лиÑти. +oauth.signin.error.temporarily_unavailable = ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ Ð½Ðµ вдалаÑÑ, оÑкільки Ñервер автентифікації тимчаÑово недоÑтупний. Будь лаÑка, Ñпробуйте пізніше. +change_unconfirmed_email = Якщо під Ñ‡Ð°Ñ Ñ€ÐµÑ”Ñтрації ви вказали неправильну електронну адреÑу, ви можете змінити Ñ—Ñ— нижче. ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð±ÑƒÐ´Ðµ надіÑлано на нову адреÑу. +last_admin = Ви не можете видалити оÑтаннього адмініÑтратора. Має бути хоча б один адмініÑтратор. +oauth.signin.error.access_denied = Запит на авторизацію було відхилено. +change_unconfirmed_email_error = Ðе вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ електронну адреÑу: %v +manual_activation_only = Зв'ÑжітьÑÑ Ð· адмініÑтратором Ñайту, аби завершити активацію. +prohibit_login_desc = Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð±ÑƒÐ»Ð¾ відізвано від взаємодії з екземплÑром. ЗвʼÑжітьÑÑ Ð· адмініÑтратором екземплÑра, щоб отримати доÑтуп знову. +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. +invalid_password = Ваш пароль не відповідає тому, що був заданий при Ñтворенні облікового запиÑу. +hint_login = Вже маєте обліковий запиÑ? Увійдіть зараз! +hint_register = Потрібен обліковий запиÑ? ЗареєÑтруйтеÑÑ Ð·Ð°Ñ€Ð°Ð·. +sign_up_button = ЗареєÑтруватиÑÑ. +sign_up_successful = Обліковий Ð·Ð°Ð¿Ð¸Ñ ÑƒÑпішно Ñтворений. Вітаємо! +unauthorized_credentials = Хибні або проÑтрочені дані Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ. Спробуйте ще раз або перейдіть до %s по докладнішу інформацію +use_onetime_code = ВикориÑтати одноразовий код +oauth.signin.error = Виникла помилка при обробці запиту на авторизацію. Якщо Ñ†Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° буде повторюватиÑÑŒ, звернітьÑÑ Ð´Ð¾ адмініÑтратора Ñайту. +authorization_failed_desc = ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ Ð½Ðµ відбулаÑÑ: виÑвлено недійÑний запит. Будь лаÑка, звернітьÑÑ Ð´Ð¾ розробника програми, Ñку ви намагалиÑÑ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·ÑƒÐ²Ð°Ñ‚Ð¸. +password_pwned = Вибраний вами пароль Ñ” у ÑпиÑку викрадених паролів, виÑвлених під Ñ‡Ð°Ñ Ð²Ð¸Ñ‚Ð¾ÐºÑ–Ð² даних. Будь лаÑка, Ñпробуйте ще раз з іншим паролем. Варто також змінити цей пароль в інших міÑцÑÑ…. [mail] view_it_on=ПереглÑнути на %s -link_not_working_do_paste=Ðе працює? Спробуйте Ñкопіювати та вÑтавити його в Ñвій браузер. +link_not_working_do_paste=ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ðµ працює? Спробуйте його Ñкопіювати та вÑтавити у Ñвій браузер. hi_user_x=Привіт %s, activate_account=Будь лаÑка, активуйте ваш обліковий Ð·Ð°Ð¿Ð¸Ñ @@ -390,15 +494,15 @@ activate_account.text_2=Перейдіть за цим поÑиланнÑм, щ activate_email=Підтвердить вашу адреÑу електронної пошти activate_email.text=Перейдіть за цим поÑиланнÑм, щоб підтвердити вашу електронну адреÑу в %s: -register_notify=ЛаÑкаво проÑимо у %s +register_notify=Вітаємо у %s register_notify.title=%[1]s, лаÑкаво проÑимо до %[2]s register_notify.text_1=це ваша е-пошта Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ñ€ÐµÑ”Ñтрації Ð´Ð»Ñ %s! -register_notify.text_2=Тепер ви можете увійти Ñк: %s. -register_notify.text_3=Якщо цей обліковий Ð·Ð°Ð¿Ð¸Ñ Ð±ÑƒÐ»Ð¾ Ñтворено Ð´Ð»Ñ Ð²Ð°Ñ, будь лаÑка, Ñпочатку вÑтановіть Ñвій пароль. +register_notify.text_2=Ви можете ввійти до Ñвого облікового запиÑу, викориÑтовуючи ім'Ñ: %s +register_notify.text_3=Якщо цей обліковий Ð·Ð°Ð¿Ð¸Ñ Ð±ÑƒÐ»Ð¾ Ñтворено не вами, будь лаÑка, Ñпочатку вÑтановіть Ñвій пароль. reset_password=Ð’Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ облікового запиÑу reset_password.title=%s, ви відправили запит на Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу -reset_password.text=Перейдіть за цим поÑиланнÑм, щоб відновити ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð² %s: +reset_password.text=Перейдіть за цим поÑиланнÑм, щоб відновити Ñвій обліковий Ð·Ð°Ð¿Ð¸Ñ Ð² %s: register_success=РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ ÑƒÑпішна @@ -428,13 +532,36 @@ release.downloads=ЗвантаженнÑ: release.download.zip=Вихідний код (ZIP) release.download.targz=Вихідний код (TAR.GZ) -repo.transfer.subject_to=%s бажає передати"%s" в %s -repo.transfer.subject_to_you=%s бажає передати"%s" вам +repo.transfer.subject_to=%s бажає передати репозиторій «%s» в %s +repo.transfer.subject_to_you=%s бажає передати вам репозиторій «%s» repo.transfer.to_you=вам repo.transfer.body=Щоб прийнÑти або відхилити перейдіть до %s або проÑто ігноруйте. -repo.collaborator.added.subject=%s додав Ð²Ð°Ñ Ð´Ð¾ %s -repo.collaborator.added.text=Ви були додані в ÑкоÑті Ñпівавтора репозиторію: +repo.collaborator.added.subject=%s додав Ð²Ð°Ñ Ð´Ð¾ %s в ÑкоÑті Ñпівавтора +repo.collaborator.added.text=Ð’Ð°Ñ Ð´Ð¾Ð´Ð°Ð½Ð¾ в ÑкоÑті Ñпівавтора репозиторію: +primary_mail_change.subject = Ваша оÑновна пошта була змінена +totp_disabled.subject = TOTP було вимкнено +totp_disabled.text_1 = ТимчаÑовий одноразовий пароль (TOTP) на вашому обліковому запиÑÑ– було вимкнено. +password_change.subject = Ваш пароль уÑпішно змінено +password_change.text_1 = Пароль до вашого облікового запиÑу було щойно змінено. +reply = чи відповіÑти напрÑму з електронної адреÑи +admin.new_user.user_info = Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ ÐºÐ¾Ñ€Ð¸Ñтувача +admin.new_user.text = Будь лаÑка, натиÑніть тут, щоб керувати цим кориÑтувачем із панелі адмініÑтрації. +admin.new_user.subject = Ðовий кориÑтувач %s щойно ввійшов +removed_security_key.text_1 = Ключ безпеки «%[1]s» було щойно видалено з вашого облікового запиÑу. +removed_security_key.subject = Ключ безпеки видалено +team_invite.text_2 = Щоб приєднатиÑÑ Ð´Ð¾ команди, будь лаÑка, перейдіть за поÑиланнÑм: +team_invite.subject = %[1]s запрошує Ð’Ð°Ñ Ð¿Ñ€Ð¸Ñ”Ð´Ð½Ð°Ñ‚Ð¸ÑÑ Ð´Ð¾ організації %[2]s +team_invite.text_3 = Примітка: Це Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ðµ Ð´Ð»Ñ %[1]s. Якщо Ви не очікували цього запрошеннÑ, можете проігнорувати цей лиÑÑ‚. +team_invite.text_1 = %[1]s запрошує Ð’Ð°Ñ Ð¿Ñ€Ð¸Ñ”Ð´Ð½Ð°Ñ‚Ð¸ÑÑ Ð´Ð¾ команди %[2]s в організації %[3]s. +primary_mail_change.text_1 = ОÑновну адреÑу електронної пошти вашого облікового запиÑу було змінено на %[1]s. Це означає, що Ñ†Ñ Ð°Ð´Ñ€ÐµÑа більше не отримуватиме ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ облікового запиÑу. +account_security_caution.text_1 = Якщо це були ви, можете Ñміливо знехтувати цим лиÑтом. +account_security_caution.text_2 = Якщо це були не ви, ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð·Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑŒÑÑ Ð¿Ñ–Ð´ загрозою. Будь лаÑка, звʼÑжітьÑÑ Ð· адмініÑтраторами цього Ñайту. +totp_enrolled.subject = Ви задіÑли TOTP Ñк заÑіб двофакторної автентифікації +totp_enrolled.text_1.has_webauthn = Ви щойно задіÑли TOTP Ð´Ð»Ñ Ñвого облікового запиÑу. Ð’ÑÑ– наÑтупні Ñпроби входу вимагатимуть викориÑÑ‚Ð°Ð½Ð½Ñ TOTP Ñк заÑобу двофакторної автентифікації або будь-Ñкого з ваших ключів безпеки. +totp_enrolled.text_1.no_webauthn = Ви щойно задіÑли TOTP Ð´Ð»Ñ Ñвого облікового запиÑу. Ð’ÑÑ– наÑтупні Ñпроби входу вимагатимуть викориÑÑ‚Ð°Ð½Ð½Ñ TOTP Ñк заÑобу двофакторної автентифікації. +totp_disabled.no_2fa = Ðе налаштовано жодного заÑобу двофакторної автентифікації. Це означає, що ви можете входити у Ñвій обліковий Ð·Ð°Ð¿Ð¸Ñ Ð±ÐµÐ· необхідноÑті викориÑтовувати двофакторну автентифікацію. +removed_security_key.no_2fa = Ðе налаштовано жодного заÑобу двофакторної автентифікації. Це означає, що ви можете входити у Ñвій обліковий Ð·Ð°Ð¿Ð¸Ñ Ð±ÐµÐ· необхідноÑті викориÑтовувати двофакторну автентифікацію. [modal] @@ -442,6 +569,7 @@ yes=Так no=ÐÑ– cancel=Відмінити modify=ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ +confirm = Підтвердити [form] UserName=Ð†Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача @@ -467,8 +595,8 @@ SSPISeparatorReplacement=Розділювач SSPIDefaultLanguage=Типова мова require_error=` не може бути пуÑтим.` -alpha_dash_error=` повинен міÑтити тільки літерно-цифрові Ñимволи, Ð´ÐµÑ„Ñ–Ñ ('-') та підкреÑÐ»ÐµÐ½Ð½Ñ ('_'). ` -alpha_dash_dot_error=` повинен міÑтити тільки літерно-цифрові Ñимволи, Ð´ÐµÑ„Ñ–Ñ ('-') , підкреÑÐ»ÐµÐ½Ð½Ñ ('_') та точки ('.'). ` +alpha_dash_error=` повинен міÑтити тільки літерно-цифрові Ñимволи, Ð´ÐµÑ„Ñ–Ñ («-») та підкреÑÐ»ÐµÐ½Ð½Ñ («_»).` +alpha_dash_dot_error=` повинен міÑтити тільки літерно-цифрові Ñимволи, Ð´ÐµÑ„Ñ–Ñ («-») , підкреÑÐ»ÐµÐ½Ð½Ñ («_») та крапки («.»).` git_ref_name_error=` повинен бути правильним поÑилальним ім'Ñм Git.` size_error=` повинен бути розмір %s.` min_size_error=` повинен бути принаймні %s Ñимволів.` @@ -507,7 +635,7 @@ enterred_invalid_owner_name=Ім'Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ влаÑника не Ñ” дій enterred_invalid_password=Введений вами пароль некоректний. user_not_exist=Даний кориÑтувач не Ñ–Ñнує. team_not_exist=Команда не Ñ–Ñнує. -last_org_owner=Ви не можете видалити оÑтаннього кориÑтувача з команди 'влаÑники'. У кожній команді має бути принаймні один влаÑник. +last_org_owner=Ви не можете видалити оÑтаннього кориÑтувача з команди «ВлаÑники». Ð’ організації має бути принаймні один влаÑник. cannot_add_org_to_team=Організацію неможливо додати Ñк учаÑника команди. invalid_ssh_key=Ðеможливо перевірити ваш SSH ключ: %s @@ -517,18 +645,48 @@ auth_failed=Помилка автентифікації: %v target_branch_not_exist=Цільової гілки не Ñ–Ñнує. +still_own_packages = Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð²Ð¾Ð»Ð¾Ð´Ñ–Ñ” одним чи більше пакунками, Ñпочатку видаліть Ñ—Ñ…. +org_still_own_packages = ÐžÑ€Ð³Ð°Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð²Ñе ще володіє одним чи більше пакунками, Ñпочатку видаліть Ñ—Ñ…. +username_error_no_dots = ` може міÑтити тільки літерно-цифрові Ñимволи («0-9», «a-z», «A-Z»), Ð´ÐµÑ„Ñ–Ñ («-») та підкреÑÐ»ÐµÐ½Ð½Ñ («_»). Ðе може починатиÑÑ Ð°Ð±Ð¾ закінчуватиÑÑ Ð½ÐµÐ»Ñ–Ñ‚ÐµÑ€Ð½Ð¸Ð¼Ð¸ Ñимволами; нелітерні Ñимволи підрÑд також заборонені.` +username_error = ` може міÑтити тільки літерно-цифрові Ñимволи («0-9», «a-z», «A-Z»), Ð´ÐµÑ„Ñ–Ñ («-»), підкреÑÐ»ÐµÐ½Ð½Ñ («_») та крапки («.»). Ðе може починатиÑÑ Ð°Ð±Ð¾ закінчуватиÑÑ Ð½ÐµÐ»Ñ–Ñ‚ÐµÑ€Ð½Ð¸Ð¼Ð¸ Ñимволами; нелітерні Ñимволи підрÑд також заборонені.` +Description = ÐžÐ¿Ð¸Ñ +Pronouns = Займенники +Biography = Про Ñебе +FullName = Повне ім'Ñ +Website = ВебÑайт +url_error = `«%s» Ñ” недійÑним поÑиланнÑм.` +To = Ðазва гілки +Location = Ð Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ +AccessToken = Токен доÑтупу +unable_verify_ssh_key = Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¸Ñ‚Ð¸ ключ SSH, перевірте його на наÑвніÑть помилок. +repository_force_private = Увімкнено примуÑову приватніÑть: приватні репозиторії не можна зробити публічними. +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` +unsupported_login_type = Цей тип входу не підтримує Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу. +admin_cannot_delete_self = Ви не можете видалити Ñебе, Ñкщо ви Ñ” адмініÑтратором. Спочатку зніміть із Ñебе права адмініÑтратора. +unset_password = Ð”Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача не вÑтановлено пароль. +username_claiming_cooldown = Це ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача не можна приÑвоїти, оÑкільки його період захиÑту ще не закінчивÑÑ. Ім'Ñ Ð¼Ð¾Ð¶Ð½Ð° буде приÑвоїти %[1]s. +email_domain_is_not_allowed = Домен адреÑи електронної пошти %s конфліктує з EMAIL_DOMAIN_ALLOWLIST або EMAIL_DOMAIN_BLOCKLIST. Перевірте, чи ви правильно вказали адреÑу електронної пошти. +still_own_repo = Вашому обліковому запиÑу належать один чи більше репозиторіїв. Спершу видаліть або передайте Ñ—Ñ…. +org_still_own_repo = Цій організації доÑÑ– належать один чи більше репозиторіїв. Спершу видаліть або передайте Ñ—Ñ…. +required_prefix = Потрібно почати з «%s» [user] change_avatar=Змінити Ñвій аватар… repositories=Репозиторії activity=Публічна активніÑть -followers_few=%d читачі -starred=Обрані Репозиторії +followers_few=%d cтежать +starred=Обрані репозиторії watched=ВідÑтежувані репозиторії projects=Проєкт overview=ОглÑд -following_few=%d читає +following_few=%d відÑтежуваних follow=ПідпиÑатиÑÑ unfollow=ВідпиÑатиÑÑ user_bio=Ð‘Ñ–Ð¾Ð³Ñ€Ð°Ñ„Ñ–Ñ @@ -537,6 +695,30 @@ joined_on = РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ %s email_visibility.private = Ваш email видно лише вам Ñ– адмініÑтраторам email_visibility.limited = Вашу е-пошту видно вÑім авторизованим settings = КориÑтувацькі параметри +block_user.detail_3 = Ви не зможете додати один одного в ÑкоÑті Ñпівавтора репозиторію. +show_on_map = Показати це міÑце на мапі +block_user.detail_2 = Цей кориÑтувач не зможе взаємодіÑти з репозиторіÑми, влаÑником Ñких Ñ” ви, а також із задачами та коментарÑми, Ñкі ви Ñтворили. +block_user.detail_1 = Ви припините Ñтежити один за одним Ñ– не зможете підпиÑатиÑÑ Ð¾Ð´Ð¸Ð½ на одного. +block = Заблокувати +unblock = Розблокувати +code = Код +block_user = Заблокувати кориÑтувача +block_user.detail = Зверніть увагу, що Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача має такі наÑлідки: +follow_blocked_user = Ви не можете Ñтежити за цим кориÑтувачем, тому що ви його заблокували або він заблокував ваÑ. +following_one = %d відÑтежуваний +followers_one = %d cтежить +followers.title.one = Cтежить +followers.title.few = Cтежать +following.title.one = ВідÑтежуваний +following.title.few = ВідÑтежувані +form.name_reserved = Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача «%s» зарезервовано. +form.name_chars_not_allowed = Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача «%s» міÑтить неприпуÑтимі Ñимволи. +public_activity.visibility_hint.self_private = Вашу діÑльніÑть бачитимете лише ви й адмініÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ñервера. Ðалаштувати. +public_activity.visibility_hint.admin_private = Цю дію видно адмініÑтрації, зокрема вам, але кориÑтувач_ка бажає залишити Ñ—Ñ— приватною. +public_activity.visibility_hint.self_private_profile = Вашу діÑльніÑть видно лише вам Ñ– адмініÑтрації Ñервера, оÑкільки ваш профіль приватний. Ðалаштувати. +public_activity.visibility_hint.self_public = Вашу діÑльніÑть бачитимуть уÑÑ–, за винÑтком взаємодій у приватних проÑторах. Ðалаштувати. +form.name_pattern_not_allowed = Вираз «%s» не може бути чаÑтиною кориÑтувацького імені. +public_activity.visibility_hint.admin_public = Цю дію видно вÑім, але адмініÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ (зокрема й ви) може бачити ще й взаємодії в приватних проÑторах. [settings] @@ -546,13 +728,13 @@ appearance=Зовнішній виглÑд password=Пароль security=Безпека avatar=Ðватар -ssh_gpg_keys=SSH / GPG ключі +ssh_gpg_keys=Ключі SSH / GPG social=Соціальні облікові запиÑи applications=Додатки -orgs=ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ñ€Ð³Ð°Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñми +orgs=Організації repos=Репозиторії delete=Видалити обліковий Ð·Ð°Ð¿Ð¸Ñ -twofa=Двофакторна Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ +twofa=Двофакторна Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ (TOTP) account_link=Прив'Ñзані облікові запиÑи organization=Організації @@ -561,9 +743,9 @@ password_username_disabled=Ðелокальним кориÑтувачам за full_name=Повне ім'Ñ website=Веб-Ñайт location=МіÑÑ†ÐµÐ·Ð½Ð°Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ -update_theme=Оновити тему +update_theme=Змінити тему update_profile=Оновити профіль -update_language=Оновити мову +update_language=Змінити мову update_language_success=Мову оновлено. update_profile_success=Профіль уÑпішно оновлено. change_username=Ваше Ім'Ñ ÐºÑ€Ð¸Ñтувача було змінено. @@ -580,7 +762,7 @@ comment_type_group_project=Проєкт privacy=ПриватніÑть keep_activity_private_popup=Показувати вашу активніÑть лише Вам та адмініÑтраторам -lookup_avatar_by_mail=Знайти Ðватар за адреÑою електронної пошти +lookup_avatar_by_mail=Знайти аватар за адреÑою електронної пошти federated_avatar_lookup=Знайти зовнішній аватар enable_custom_avatar=Увімкнути кориÑтувацькі аватари choose_new_avatar=Оберіть новий аватар @@ -594,14 +776,14 @@ update_password=Оновити пароль old_password=Поточний пароль new_password=Ðовий пароль password_incorrect=Поточний пароль неправильний. -change_password_success=Ваш пароль був оновлений. Тепер увійдіть в ÑиÑтему, викориÑтовуючи новий пароль. +change_password_success=Ваш пароль оновлено. Відтепер входьте в ÑиÑтему, викориÑтовуючи новий пароль. password_change_disabled=Ðелокальні акаунти не можуть змінити пароль через Forgejo. emails=ÐдреÑа електронної пошти manage_emails=ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð´Ñ€ÐµÑами ел. пошти -manage_themes=Виберіть тему за замовчуваннÑм -manage_openid=ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ OpenID -theme_desc=Ð¦Ñ Ñ‚ÐµÐ¼Ð° буде типовою Ð´Ð»Ñ Ð²Ñього Ñайту. +manage_themes=Тема за замовчуваннÑм +manage_openid=ÐдреÑи OpenID +theme_desc=Ð¦Ñ Ñ‚ÐµÐ¼Ð° буде типовою Ð´Ð»Ñ Ð²ÐµÐ±-інтерфейÑу, коли ви ввійдете в ÑиÑтему. primary=ОÑновний activated=Ðктивовано requires_activation=Потрібна Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ @@ -617,8 +799,8 @@ theme_update_error=Вибрана тема не Ñ–Ñнує. openid_deletion=Видалити адреÑу OpenID openid_deletion_desc=Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— OpenID-адреÑи з вашого облікового запиÑу заборонÑÑ” вам входити з ним. Продовжити? openid_deletion_success=ÐдреÑа OpenID була видалена. -add_new_email=Додати нову адреÑу електронної пошти -add_new_openid=Додати новий OpenID URI +add_new_email=Додати адреÑу електронної пошти +add_new_openid=Додати новий URI OpenID add_email=Додати адреÑу електронної пошти add_openid=Додати OpenID URI add_email_success=Додано нову адреÑу електронної пошти. @@ -627,20 +809,20 @@ add_openid_success=Ðова адреÑа OpenID була додана. keep_email_private=Приховати адреÑу електронної пошти openid_desc=OpenID дозволÑÑ” делегувати аутентифікацію зовнішньому поÑтачальнику поÑлуг. -manage_ssh_keys=Керувати SSH ключами +manage_ssh_keys=ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð°Ð¼Ð¸ SSH manage_ssh_principals=Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ SSH Ñертифікатами кориÑтувачів -manage_gpg_keys=Керувати GPG ключами +manage_gpg_keys=ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð°Ð¼Ð¸ GPG add_key=Додати ключ -ssh_desc=Ці відкриті SSH-ключі пов'Ñзані з вашим обліковим запиÑом. Відповідні приватні ключі дозволÑють отримати повний доÑтуп до ваших репозиторіїв. +ssh_desc=Ці відкриті ключі SSH повʼÑзані з вашим обліковим запиÑом. Відповідні приватні ключі дозволÑють отримати повний доÑтуп до ваших репозиторіїв. Підтверджені ключі можна викориÑтати Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñ–Ð² Git, підпиÑані з SSH. principal_desc=Ці наÑтройки SSH Ñертифікатів вказані у вашому обліковому запиÑÑ– та надають повний доÑтуп до ваших репозиторіїв. gpg_desc=Ці публічні ключі GPG пов'Ñзані з вашим обліковим запиÑом. Тримайте Ñвої приватні ключі в безпеці, оÑкільки вони дозволÑють здійÑнювати перевірку комітів. ssh_helper=Потрібна допомога? ДивітьÑÑ Ð³Ñ–Ð´ на GitHub з генерації ключів SSH або Ð²Ð¸Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¸Ñ… неполадок SSH. gpg_helper= Потрібна допомога? ПереглÑньте поÑібник GitHub про GPG . add_new_key=Додати SSH ключ add_new_gpg_key=Додати GPG ключ -key_content_ssh_placeholder=ПочинаєтьÑÑ Ð· 'ssh-ed25519', 'ssh-rsa', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'sk-ecdsa-sha2-nistp256@openssh.com', або 'sk-ssh-ed25519@openssh.com' -key_content_gpg_placeholder=ПочинаєтьÑÑ Ð· '-----BEGIN PGP PUBLIC KEY BLOCK-----' -add_new_principal=Додати кориÑтувача +key_content_ssh_placeholder=ПочинаєтьÑÑ Ð· «ssh-ed25519», «ssh-rsa», «ecdsa-sha2-nistp256», «ecdsa-sha2-nistp384», «ecdsa-sha2-nistp521», «sk-ecdsa-sha2-nistp256@openssh.com» або «sk-ssh-ed25519@openssh.com» +key_content_gpg_placeholder=ПочинаєтьÑÑ Ð· «-----BEGIN PGP PUBLIC KEY BLOCK-----» +add_new_principal=Додати принципал ssh_key_been_used=Цей SSH ключ вже був додано до Ñервера. ssh_key_name_used=Ключ SSH з таким ім'Ñм вже Ñ–Ñнує у вашому обліковому запиÑÑ–. ssh_principal_been_used=Цей кориÑтувач вже був доданий на Ñервер. @@ -657,7 +839,7 @@ gpg_token=Токен gpg_token_help=Ви можете Ñтворити Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ð·Ð° допомогою: gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=ТекÑтовий (armored) Ð¿Ñ–Ð´Ð¿Ð¸Ñ GPG -key_signature_gpg_placeholder=`ПочинаєтьÑÑ Ð· "-----BEGIN PGP SIGNATURE-----"` +key_signature_gpg_placeholder=ПочинаєтьÑÑ Ð· «-----BEGIN PGP SIGNATURE-----» ssh_key_verified=Перевірений ключ ssh_key_verify=Підтвердити ssh_token_required=Вам потрібно надати Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ð´Ð»Ñ Ð½Ð¸Ð¶Ñ‡ÐµÐ²ÐºÐ°Ð·Ð°Ð½Ð¾Ð³Ð¾ токена @@ -669,8 +851,8 @@ key_name=Ім'Ñ ÐºÐ»ÑŽÑ‡Ð° key_content=ЗміÑÑ‚ principal_content=ЗміÑÑ‚ delete_key=Видалити -ssh_key_deletion=Видалити SSH ключ -gpg_key_deletion=Видалити GPG ключ +ssh_key_deletion=Видалити ключ SSH +gpg_key_deletion=Видалити ключ GPG ssh_principal_deletion=Видалити SSH Ñертифікат кориÑтувача ssh_key_deletion_desc=Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð° SSH ÑкаÑовує доÑтуп до вашого облікового запиÑу. Продовжити? gpg_key_deletion_desc=Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ GPG ключа ÑкаÑовує перевірку підпиÑаних ним комітів. Продовжити? @@ -693,10 +875,10 @@ ssh_externally_managed=Цей ключ SSH має зовнішнє управл manage_social=Керувати зв'Ñзаними обліковими запиÑами Ñоціальних мереж unbind=Від'єднати -manage_access_token=ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð¾ÐºÐµÐ½Ð°Ð¼Ð¸ доÑтупу +manage_access_token=Токени доÑтупу generate_new_token=Згенерувати новий токен tokens_desc=Ці токени надають доÑтуп до вашого облікового запиÑу за допомогою Forgejo API. -token_name=Ім'Ñ Ñ‚Ð¾ÐºÐµÐ½Ñƒ +token_name=Ім'Ñ Ñ‚Ð¾ÐºÐµÐ½Ð° generate_token=Згенерувати токен generate_token_success=Ваш новий токен був Ñтворений. Скопіюйте його зараз, оÑкільки він не буде показаний знову. generate_token_name_duplicate=Ðазва програми %s вже викориÑтовуєтьÑÑ. Будь лаÑка, викориÑтайте нову. @@ -713,13 +895,13 @@ oauth2_applications_desc=Програми OAuth2 дають можливіÑть remove_oauth2_application=Видалити програму OAuth2 remove_oauth2_application_desc=Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ OAuth2 ÑкаÑовує доÑтуп до вÑÑ–Ñ… підпиÑаних маркерів доÑтупу. Продовжити? remove_oauth2_application_success=Програму видалено. -create_oauth2_application=Створити нову програму OAuth2 +create_oauth2_application=Створити новий додаток OAuth2 create_oauth2_application_button=Створити програму oauth2_application_name=Ðазва програми save_application=Зберегти oauth2_client_id=ID Клієнта oauth2_client_secret=Ключ клієнта -oauth2_regenerate_secret=Відновити ключ +oauth2_regenerate_secret=Згенерувати новий ключ oauth2_regenerate_secret_hint=Ви втратили Ñвій ключ? oauth2_application_edit=Редагувати oauth2_application_create_description=Програми OAuth2 надають вашим Ñтороннім програмам доÑтуп до облікових запиÑів кориÑтувачів у цьому екземплÑрі. @@ -731,9 +913,9 @@ revoke_oauth2_grant_description=СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ñтупу Ð´Ð»Ñ Ñ†Ñ– twofa_desc=Двофакторна Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÑƒÑ” безпеку вашого облікового запиÑу. twofa_is_enrolled=Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° даний Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтовує двофакторну автентифікацію. -twofa_not_enrolled=Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½Ð°Ñ€Ð°Ð·Ñ– не викориÑтовує двофакторну автентифікаціїю. +twofa_not_enrolled=Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½Ð°Ñ€Ð°Ð·Ñ– не викориÑтовує двофакторну автентифікацію. twofa_disable=Вимкнути двофакторну автентифікацію -twofa_scratch_token_regenerate=ПереÑтворити токен одноразового Ð¿Ð°Ñ€Ð¾Ð»Ñ +twofa_scratch_token_regenerate=Згенерувати новий одноразовий ключ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ twofa_enroll=Увімкнути двофакторну автентифікацію twofa_disable_note=При необхідноÑті можна відключити двофакторну автентифікацію. twofa_disable_desc=Ð’Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð´Ð²Ð¾Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð¾Ñ— автентифікації зробить ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð¼ÐµÐ½Ñˆ безпечним. Продовжити? @@ -747,28 +929,28 @@ twofa_enrolled=Ð”Ð»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ облікового запиÑу було в twofa_failed_get_secret=Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ñекрет. -manage_account_links=ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¸Ð¼Ð¸ запиÑами +manage_account_links=Пов'Ñзані облікові запиÑи manage_account_links_desc=Ці зовнішні акаунти прив'Ñзані до вашого аккаунту Forgejo. account_links_not_available=Ðаразі немає зовнішніх облікових запиÑів, пов'Ñзаних із вашим обліковим запиÑом Forgejo. link_account=Прив'Ñзати обліковий Ð·Ð°Ð¿Ð¸Ñ -remove_account_link=Видалити облікові запиÑи +remove_account_link=Видалити пов'Ñзаний обліковий Ð·Ð°Ð¿Ð¸Ñ remove_account_link_desc=Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²'Ñзаного облікового запиÑу відкликає його доÑтуп до вашого облікового запиÑу Forgejo. Продовжити? remove_account_link_success=Зв'Ñзаний обліковий Ð·Ð°Ð¿Ð¸Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð¾. orgs_none=Ви не Ñ” учаÑником будь-Ñкої організації. -delete_account=Видалити ваш обліковий Ð·Ð°Ð¿Ð¸Ñ +delete_account=Видалити Ñвій обліковий Ð·Ð°Ð¿Ð¸Ñ delete_prompt=Ð¦Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð¾Ñтаточно видалить обліковий Ð·Ð°Ð¿Ð¸Ñ ÐºÐ¾Ñ€Ð¸Ñтувача. Це ÐЕ МОЖЛИВО відмінити. delete_with_all_comments=Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð¼Ð¾Ð»Ð¾Ð´ÑˆÐ¸Ð¹ за %s днів. Щоб уникнути коментарів-привидів, вÑÑ– запити/PR коментрарі будуть видалені з ним. -confirm_delete_account=ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ -delete_account_title=Видалити цей обліковий Ð·Ð°Ð¿Ð¸Ñ +confirm_delete_account=Підтвердити Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ +delete_account_title=Видалити обліковий Ð·Ð°Ð¿Ð¸Ñ delete_account_desc=Ви впевнені, що хочете оÑтаточно видалити цей обліковий запиÑ? -email_notifications.enable=Увімкнути ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ email -email_notifications.onmention=ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ email тільки коли згадують -email_notifications.disable=Вимкнути email ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ -email_notifications.submit=Ðалаштувати параметри email +email_notifications.enable=Увімкнути email-ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ +email_notifications.onmention=Email тільки коли згадують +email_notifications.disable=Вимкнути email-ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ +email_notifications.submit=Зберегти параметри email visibility=ВидиміÑть кориÑтувача visibility.public=Публічний @@ -777,16 +959,124 @@ visibility.private=Приватний saved_successfully = ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑƒÑпішно збережено. comment_type_group_time_tracking = Облік чаÑу location_placeholder = ПоділітьÑÑ Ð· іншими, де приблизно ви знаходитеÑÑŒ -biography_placeholder = Розкажіть трохи про Ñебе! (Можете викориÑтати Markdown) +biography_placeholder = Розкажіть трохи про Ñебе! (ПідтримуєтьÑÑ Markdown) hidden_comment_types = Приховані типи коментарів -keep_activity_private = Приховати ÐктивніÑть зі Ñторінки профілю +keep_activity_private = Приховати активніÑть зі Ñторінки профілю blocked_users = Заблоковані кориÑтувачі -blocked_users_none = Ви не заблокували жодного кориÑтувача. -profile_desc = Керуйте тим, Ñк ваш профіль відображаєтьÑÑ Ñ–Ð½ÑˆÐ¸Ð¼ кориÑтувачам. Ваша оÑновна адреÑа електронної пошти буде викориÑтовуватиÑÑ Ð´Ð»Ñ Ñповіщень, Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ñ‚Ð° операцій з Git через веб-інтерфейÑ. +blocked_users_none = Ðемає заблокованих кориÑтувачів. +profile_desc = Про Ñебе retype_new_password = Підтвердіть новий пароль email_desc = Ваша оÑновна адреÑа електронної пошти буде викориÑтовуватиÑÑ Ð´Ð»Ñ Ñповіщень, Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ñ–, за умови, що вона не прихована, Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ð¹ з Git через веб-інтерфейÑ. visibility.limited_tooltip = Видимий(а) тільки Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ… кориÑтувачів visibility.private_tooltip = Видимий(а) тільки Ð´Ð»Ñ ÑƒÑ‡Ð°Ñників організацій, до Ñких ви приєдналиÑÑ +twofa_scratch_token_regenerated = Ваш одноразовий ключ відновленнÑ: %s. Збережіть його у безпечному міÑці, бо він не буде показаний знову. +authorized_oauth2_applications_description = Ви надали цим Ñтороннім заÑтоÑункам доÑтуп до вашого облікового запиÑу Forgejo. Будь лаÑка, відкличте доÑтуп із заÑтоÑунків, що більше не викориÑтовуютьÑÑ. +webauthn_delete_key = Видалити ключ безпеки +webauthn_key_loss_warning = Якщо ви втратите ключ безпеки, то втратите доÑтуп до вашого облікового запиÑу. +webauthn_register_key = Додати ключ безпеки +webauthn_nickname = ПÑевдонім +webauthn_desc = Ключі безпеки — це апаратні приÑтрої, що міÑÑ‚Ñть криптографічні ключі. Вони можуть викориÑтовуватиÑÑŒ Ð´Ð»Ñ Ð´Ð²Ð¾Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð¾Ñ— автентифікації. Ключі безпеки мають підтримувати Ñтандарт WebAuthn Authenticator. +revoke_oauth2_grant_success = ДоÑтуп відкликано уÑпішно. +twofa_recovery_tip = Якщо ви втратите ваш приÑтрій, ви зможете викориÑтати одноразовий ключ відновленнÑ, щоб знову отримати доÑтуп до Ñвого облікового запиÑу. +webauthn_delete_key_desc = Якщо ви видалите ключ безпеки, ви більше не зможете з ним зайти. Продовжити? +change_password = Зміна Ð¿Ð°Ñ€Ð¾Ð»Ñ +email_notifications.andyourown = І ваші влаÑні ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ +visibility.public_tooltip = Видимий(а) Ð´Ð»Ñ Ð²ÑÑ–Ñ… +update_language_not_found = Мова «%s» недоÑтупна. +pronouns = Займенники +pronouns_unspecified = Ðе вказані +hints = Підказки +language.title = Мова за замовчуваннÑм +update_hints = Оновити підказки +update_hints_success = Підказки оновлено. +additional_repo_units_hint = Пропонувати увімкнути додаткові розділи репозиторію +additional_repo_units_hint_description = Показувати підказку «Увімкнути ще» Ð´Ð»Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ—Ð², у Ñких увімкнено не вÑÑ– доÑтупні розділи. +language.description = Цю мову буде збережено у вашому обліковому запиÑÑ–, вона викориÑтовуватиметьÑÑ Ð¿Ñ–ÑÐ»Ñ Ñ‚Ð¾Ð³Ð¾, Ñк ви ввійдете в ÑиÑтему. +language.localization_project = Допоможіть нам переклаÑти Forgejo вашою мовою! ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ. +permissions_list = Дозволи: +comment_type_group_dependency = ЗалежніÑть +comment_type_group_pull_request_push = Додані коміти +permissions_public_only = Тільки публічні +select_permissions = Виберіть дозволи +permissions_access_all = УÑÑ– (публічні, приватні й обмежені) +create_oauth2_application_success = Ви уÑпішно Ñтворили новий додаток OAuth2. +keep_email_private_popup = Ваша адреÑа електронної пошти не буде відображатиÑÑ Ñƒ вашому профілі Ñ– не буде викориÑтовуватиÑÑ Ð·Ð° замовчуваннÑм Ð´Ð»Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñ–Ð², зроблених через веб-інтерфейÑ, таких Ñк Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð², Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ– об'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñ–Ð². ÐатоміÑть ви можете викориÑтовувати Ñпеціальну адреÑу %s Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð²'Ñзки комітів до Ñвого облікового запиÑу. Ð¦Ñ Ð¾Ð¿Ñ†Ñ–Ñ Ð½Ðµ вплине на Ñ–Ñнуючі коміти. +blocked_since = Заблокований з %s +can_not_add_email_activations_pending = ОчікуєтьÑÑ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ, Ñпробуйте ще раз за кілька хвилин, Ñкщо хочете додати нову адреÑу електронної пошти. +ssh_signonly = SSH наразі вимкнено, тому ці ключі викориÑтовуютьÑÑ Ð»Ð¸ÑˆÐµ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ підпиÑу комітів. +uid = UID +at_least_one_permission = Ð”Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ð¾ÐºÐµÐ½Ð° необхідно вибрати хоча б один дозвіл +verify_gpg_key_success = Ключ GPG «%s» перевірено. +repos_none = Ви не Ñ” влаÑником жодного репозиторію. +add_gpg_key_success = Ключ GPG «%s» додано. +add_key_success = Ключ SSH «%s» додано. +permission_no_access = Ðемає доÑтупу +permission_write = Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ– Ð·Ð°Ð¿Ð¸Ñ +uploaded_avatar_is_too_big = Розмір завантаженого файлу (%d КіБ) перевищує макÑимальний розмір (%d КіБ). +verify_ssh_key_success = Ключ SSH «%s» перевірено. +ssh_invalid_token_signature = Ðаданий SSH-ключ, Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ð°Ð±Ð¾ токен не збігаютьÑÑ Ð°Ð±Ð¾ токен заÑтарів. +valid_until_date = ДійÑний до %s +added_on = Додано %s +key_signature_ssh_placeholder = ПочинаєтьÑÑ Ð· «-----BEGIN SSH SIGNATURE-----» +user_block_yourself = Ви не можете заблокувати Ñебе. +pronouns_custom_label = Інші займенники +repo_and_org_access = ДоÑтуп до репозиторію та організації +change_username_redirect_prompt.with_cooldown.few = Старе ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача буде доÑтупне вÑім піÑÐ»Ñ Ð¿ÐµÑ€Ñ–Ð¾Ð´Ñƒ захиÑту, Ñкий триватиме %[1]d днів. ПротÑгом періоду захиÑту ви ще можете повернути Ñобі Ñтаре ім'Ñ. +change_username_redirect_prompt.with_cooldown.one = Старе ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача буде доÑтупне вÑім піÑÐ»Ñ Ð¿ÐµÑ€Ñ–Ð¾Ð´Ñƒ захиÑту, Ñкий триватиме %[1]d день. ПротÑгом періоду захиÑту ви ще можете повернути Ñобі Ñтаре ім'Ñ. +change_username_redirect_prompt = Старе ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача буде перенаправленнÑм, поки хтоÑÑŒ не приÑвоїть ім'Ñ Ñобі. +comment_type_group_lock = Стан Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ +webauthn_alternative_tip = Можливо, ви бажаєте налаштувати додатковий ÑпоÑіб входу. +user_unblock_success = КориÑтувач_ку уÑпішно розблоковано. +webauthn = Двофакторний вхід (ключі безпеки) +keep_activity_private.description = Вашу загальнодоÑтупну діÑльніÑть буде видно лише вам Ñ– адмініÑтрації Ñервера. +hidden_comment_types_description = Позначені тут типи коментарів не буде показано на Ñторінках завдань. Ðаприклад, Ñкщо тут позначена «Мітка», то вÑÑ– коментарі « додає/вилучає
      на %[3]s із дзеркала approve_pull_request=`Ñхвалив %[3]s#%[2]s` reject_pull_request=`запропонував зміни до %[3]s#%[2]s` -publish_release=`опублікував випуÑк "%[4]s" з %[3]s` +publish_release=`публікує випуÑк %[4]s з %[3]s` review_dismissed=`відхилив відгук від %[4]s Ð´Ð»Ñ %[3]s#%[2]s` review_dismissed_reason=Причина: create_branch=Ñтворив гілку %[3]s в %[4]s starred_repo=додав %[2]s у обране watched_repo=почав Ñлідкувати за %[2]s +auto_merge_pull_request = `автоматично об'єднав запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ %[3]s#%[2]s` [tool] now=зараз @@ -2709,11 +3379,11 @@ default_key=ПідпиÑано типовим ключем error.extract_sign=Ðе вдалоÑÑ Ð²Ð¸Ñ‚Ñгти Ð¿Ñ–Ð´Ð¿Ð¸Ñ error.generate_hash=Ðе вдалоÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ хеш коміту error.no_committer_account=Ðккаунт кориÑтувача з таким Email не знайдено -error.no_gpg_keys_found=Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ GPG ключ що відповідає даному підпиÑу +error.no_gpg_keys_found=Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ GPG-ключ, що відповідає даному підпиÑу error.not_signed_commit=ÐепідпиÑаний коміт -error.failed_retrieval_gpg_keys=Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ відповідний GPG ключ кориÑтувача -error.probable_bad_signature=УВÐГÐ! Хоча ключ з таким ID Ñ– Ñ” в базі, коміт не може бути ним перевірено! Цей коміт ПІДОЗРІЛИЙ. -error.probable_bad_default_signature=УВÐГÐ! Хоча типовий ключ має цей ID, коміт не може бути ним перевірено! Цей коміт ПІДОЗРІЛИЙ. +error.failed_retrieval_gpg_keys=Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ключ, пов'Ñзаний з обліковим запиÑом комітера +error.probable_bad_signature=УВÐГÐ! Хоча ключ із таким ID Ñ– Ñ” в базі, коміт неможливо ним перевірити! Цей коміт ПІДОЗРІЛИЙ. +error.probable_bad_default_signature=УВÐГÐ! Хоча типовий ключ має цей ID, коміт неможливо ним перевірити! Цей коміт ПІДОЗРІЛИЙ. [units] error.no_unit_allowed_repo=У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” доÑтупу до жодного розділу цього репозиториÑ. @@ -2725,19 +3395,148 @@ alpine.repository.branches=Гілки alpine.repository.repositories=Репозиторії conan.details.repository=Репозиторій owner.settings.cleanuprules.enabled=Увімкнено -about = Про цей пакет +about = Про цей пакунок empty = Поки що тут немає пакунків. -empty.documentation = Ð”Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації щодо реєÑтру пакунків, переглÑньте документацію. -registry.documentation = Ð”Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації щодо реєÑтру %s, переглÑньте документацію. -settings.delete.notice = Ви збираєтеÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ %s (%s). Цю операцію не можна відмінити, ви впевнені? +empty.documentation = Докладніше про реєÑтр пакунків читайте в документації. +registry.documentation = Докладніше про реєÑтр %s читайте в документації. +settings.delete.notice = Ви збираєтеÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ %s (%s). Цю операцію не можна ÑкаÑувати, ви впевнені? details.author = Ðвтор +title = Пакунки +arch.version.backup = Резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ +arch.version.conflicts = Суперечки +arch.version.replaces = Заміни +arch.version.provides = Ðадає +arch.version.groups = Група +conda.install = Ðби вÑтановити пакунок, викориÑтовуючи Conda, виконайте команду: +cargo.install = Ðби вÑтановити пакунок, викориÑтовуючи Cargo, виконайте команду: +versions.view_all = ПереглÑнути вÑÑ– +generic.download = Завантажте пакунок із командного Ñ€Ñдка: +details = Подробиці +arch.version.optdepends = ÐеобовʼÑзково залежить +installation = УÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ +details.license = Ð›Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ +filter.type.all = УÑÑ– +conan.install = Ðби вÑтановити пакунок, викориÑтовуючи Conan, виконайте команду: +container.layers = Шари образу +details.project_site = ВебÑторінка проєкту +details.documentation_site = ВебÑторінка документації +desc = ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÑƒÐ½ÐºÐ°Ð¼Ð¸ репозиторію. +requirements = Вимоги +dependencies = ЗалежноÑті +empty.repo = Ви опублікували пакунок, але він не показаний тут? Перейдіть до налаштувань пакунків та привʼÑжіть його до цього репозиторію. +alpine.repository = Про репозиторій +alpine.install = Ðби вÑтановити цей пакунок, виконайте команду: +cran.install = Ðби вÑтановити пакунок, виконайте команду: +composer.dependencies.development = ЗалежноÑті розробки +container.labels.key = Ключ +container.labels.value = Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ +composer.install = Ðби вÑтановити пакунок, викориÑтовуючи Composer, виконайте команду: +debian.repository.components = Складові +filter.container.tagged = Відмічений +filter.container.untagged = Ðевідмічений +container.multi_arch = ОС / Ðрхітектура +arch.pacman.helper.gpg = Додайте Ñертифікат довіреноÑті до pacman: +arch.pacman.sync = Синхронізуйте пакунок з pacman: +arch.pacman.conf = Додайте Ñервер з повʼÑзаним доÑтрибутивом та архітектурою до /etc/pacman.conf : +arch.version.properties = ВлаÑтивоÑті верÑÑ–Ñ— +arch.version.description = ÐžÐ¿Ð¸Ñ +chef.install = Ðби вÑтановити пакунок, виконайте команду: +container.details.platform = Платформа +container.details.type = Тип образу +container.pull = Завантажити образ із командного Ñ€Ñдка: +details.repository_site = ВебÑторінка репозиторію +composer.dependencies = ЗалежноÑті +debian.install = Ðби вÑтановити пакунок, виконайте команду: +debian.repository = Про репозиторій +debian.repository.distributions = ДиÑтрибутиви +alpine.repository.architectures = Ðрхітектури +arch.version.depends = Залежить +go.install = Ð’Ñтановити пакунок із командного Ñ€Ñдка: +debian.repository.architectures = Ðрхітектури +helm.install = Ðби вÑтановити пакунок, виконайте команду: +keywords = Ключові Ñлова +assets = РеÑурÑи +versions = ВерÑÑ–Ñ— +dependency.version = ВерÑÑ–Ñ +container.labels = Мітки +filter.no_result = Ваш фільтр не видав жодних результатів. +dependency.id = ID +rpm.repository = Про репозиторій +rpm.repository.architectures = Ðрхітектури +settings.delete.error = Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ пакунок. +settings.delete.success = Пакунок видалено. +npm.dependencies = ЗалежноÑті +settings.delete = Видалити пакунок +npm.dependencies.development = ЗалежноÑті розробки +rubygems.dependencies.development = ЗалежноÑті розробки +npm.dependencies.optional = Ðеобов'Ñзкові залежноÑті +container.images.title = Образи +search_in_external_registry = Шукати в %s +owner.settings.cleanuprules.keep.count.n = %d верÑій на пакунок +settings.delete.description = Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ð°ÐºÑƒÐ½ÐºÐ° Ñ” оÑтаточним Ñ– його неможливо ÑкаÑувати. +owner.settings.cleanuprules.keep.count.1 = 1 верÑÑ–ÑŽ на пакунок +rpm.repository.multiple_groups = Цей пакунок доÑтупний у кількох групах. +helm.registry = Ðалаштуйте цей реєÑтр із командного Ñ€Ñдка: +rpm.registry = Ðалаштуйте цей реєÑтр із командного Ñ€Ñдка: +conan.registry = Ðалаштуйте цей реєÑтр із командного Ñ€Ñдка: +nuget.registry = Ðалаштуйте цей реєÑтр із командного Ñ€Ñдка: +swift.registry = Ðалаштуйте цей реєÑтр із командного Ñ€Ñдка: +alt.repository.architectures = Ðрхітектури +alt.repository = Про репозиторій +alt.repository.multiple_groups = Цей пакунок доÑтупний у кількох групах. +alt.install = Ð’Ñтановити пакунок +alt.registry = Ðалаштуйте цей реєÑтр із командного Ñ€Ñдка: +debian.registry = Ðалаштуйте цей реєÑтр із командного Ñ€Ñдка: +debian.registry.info = Виберіть $distribution Ñ– $component зі ÑпиÑку нижче. +npm.install = Ðби вÑтановити пакунок, викориÑтовуючи npm, виконайте команду: +alt.registry.install = Щоб уÑтановити пакунок, виконайте команду: +swift.install2 = Ñ– виконайте команду: +rubygems.install = Ðби вÑтановити пакунок, викориÑтовуючи gem, виконайте команду: +alt.setup = Додайте репозиторій до ÑпиÑку підключених репозиторіїв (виберіть потрібну архітектуру заміÑть «_arch_»): +pypi.install = Ðби вÑтановити пакунок, викориÑтовуючи pip, виконайте команду: +nuget.install = Ðби вÑтановити пакунок, викориÑтовуючи NuGet, виконайте команду: +pub.install = Ðби вÑтановити пакунок, викориÑтовуючи Dart, виконайте команду: +rpm.install = Щоб уÑтановити пакунок, виконайте команду: +maven.install = Ð”Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÑƒÐ½ÐºÐ° включіть у блок dependencies у файлі pom.xml таке: +vagrant.install = Щоб додати Ñкриньку Vagrant, виконайте команду: +owner.settings.chef.keypair = Згенерувати пару ключів +published_by_in = %[1]s опубліковано %[3]s в %[5]s +npm.install2 = або додайте його у файл package.json: +npm.details.tag = Тег +rubygems.install2 = або додайте його у Gemfile: +published_by = %[1]s опубліковано %[3]s +swift.install = Додайте пакунок у Ñвій файл Package.swift: +settings.link.select = Виберіть репозиторій +alpine.registry.info = Виберіть $branch Ñ– $repository зі ÑпиÑку нижче. + +alpine.registry = Ðалаштуйте цей реєÑтр, додавши URL у файл /etc/apk/repositories: +arch.pacman.repo.multi.item = ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ %s +cargo.registry = Ðалаштуйте цей реєÑтр у файлі конфігурації Cargo (наприклад, ~/.cargo/config.toml): +chef.registry = Ðалаштуйте цей реєÑтр у файлі ~/.chef/config.rb: +composer.registry = Ðалаштуйте цей реєÑтр у файлі ~/.composer/config.json: +conda.registry = Ð’Ñтановіть цей реєÑтр Ñк репозиторій Conda у Ñвоєму файлі .condarc: +cran.registry = Ðалаштуйте цей реєÑтр у файлі Rprofile.site: +maven.registry = Ðалаштуйте цей реєÑтр у файлі pom.xml Ñвого проєкту: +npm.registry = Ðалаштуйте цей реєÑтр у файлі .npmrc Ñвого проєкту: +owner.settings.chef.title = РеєÑтр Chef [secrets] +deletion = Видалити Ñекрет +creation.success = Секрет «%s» додано. +creation.failed = Ðе вдалоÑÑ Ð´Ð¾Ð´Ð°Ñ‚Ð¸ Ñекрет. +management = ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñекретами +deletion.success = Секрет видалено. +deletion.failed = Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ñекрет. +deletion.description = Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñекрету Ñ” оÑтаточним Ñ– його неможливо ÑкаÑувати. Продовжити? +creation = Додати Ñекрет +none = Секретів ще немає. +creation.name_placeholder = без ÑƒÑ€Ð°Ñ…ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ³Ñ–Ñтру, тільки літерно-цифрові Ñимволи або підкреÑленнÑ, не може починатиÑÑ Ð· GITEA_ або GITHUB_ +secrets = Секрети +creation.value_placeholder = Уведіть довільний вміÑÑ‚. Пробіли на початку та в кінці будуть пропущені. + +description = Секрети передаютьÑÑ Ð¿ÐµÐ²Ð½Ð¸Ð¼ діÑм Ñ– не можуть бути прочитані інакше. [actions] - - - runners.name=Ðазва runners.owner_type=Тип runners.description=ÐžÐ¿Ð¸Ñ @@ -2747,13 +3546,156 @@ runners.task_list.commit=Коміт runners.status.active=Ðктивний runs.commit=Коміт +variables.update.failed = Ðе вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ змінну. +variables.update.success = Змінну змінено. +variables.creation = Додати змінну +variables.none = Змінних ще немає. +variables.deletion = Видалити змінну +variables = Змінні +runs.scheduled = Заплановано +actions = Дії +variables.deletion.success = Змінну видалено. +runners.id = ID +runners.update_runner = Оновити зміни +variables.creation.failed = Ðе вдалоÑÑ Ð´Ð¾Ð´Ð°Ñ‚Ð¸ змінну. +variables.deletion.failed = Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ змінну. +status.waiting = Очікує +variables.creation.success = Змінну «%s» додано. +runners.labels = Мітки +status.unknown = Ðевідомо +runners.task_list.no_tasks = Завдань поки що немає. +runners.version = ВерÑÑ–Ñ +status.blocked = Заблоковано +status.cancelled = СкаÑовано +variables.description = Змінні передаютьÑÑ Ð¿ÐµÐ²Ð½Ð¸Ð¼ діÑм Ñ– не можуть бути прочитані інакше. +variables.deletion.description = Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¾Ñ— Ñ” оÑтаточним Ñ– його неможливо ÑкаÑувати. Продовжити? +variables.management = ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¸Ð¼Ð¸ +variables.id_not_exist = Змінної з ідентифікатором %d не Ñ–Ñнує. +variables.edit = Редагувати змінну +runs.expire_log_message = Журнали очищено, тому що вони були занадто Ñтарі. +runs.empty_commit_message = (порожнє Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ð°) +runners.status.unspecified = Ðевідомо +runs.status_no_select = УÑÑ– Ñтани +runs.status = Стан +runners.task_list.status = Стан +runners.status = Стан +runs.no_workflows.documentation = Докладніше про Дії Forgejo читайте в документації. +runners.reset_registration_token = Скинути токен реєÑтрації +workflow.enable_success = Робочий потік «%s» уÑпішно ввімкнено. +runs.workflow = Робочий потік +workflow.disable = Вимкнути робочий потік +workflow.disable_success = Робочий потік «%s» уÑпішно вимкнено. +workflow.disabled = Робочий потік вимкнено. +workflow.enable = Увімкнути робочий потік +runs.no_workflows = Робочих потоків ще немає. +runs.all_workflows = УÑÑ– робочі потоки +runs.no_results = Ðе знайдено відповідних результатів. +status.failure = Помилка +status.running = Працює +status.success = УÑпіх +status.skipped = Пропущено +need_approval_desc = Потрібне ÑÑ…Ð²Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку робочих потоків Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ на злиттÑ. +variables.not_found = Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ змінну. +runners.task_list.done_at = Завершено +runners.last_online = ВоÑтаннє в мережі +runs.no_workflows.help_no_write_access = Щоб дізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Дії Forgejo, читайте документацію. +runs.no_workflows.help_write_access = Ðе знаєте, Ñк почати роботу з ДіÑми Forgejo? ПереглÑньте поÑібник Ð´Ð»Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑ–Ð²Ñ†Ñ–Ð² у документації, щоб напиÑати Ñвій перший робочий потік, а потім налаштуйте ранер Forgejo Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð°Ð²Ð´Ð°Ð½ÑŒ. +unit.desc = ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð±ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¸Ð¼Ð¸ конвеєрами CI/CD з ДіÑми Forgejo. +runners.delete_runner_failed = Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ ранер +runners.new_notice = Як запуÑтити ранер +runners.update_runner_failed = Ðе вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ ранер +runners.delete_runner_success = Ранер уÑпішно видалено +runners.none = Ðемає доÑтупних ранерів +runners.delete_runner_notice = Якщо на цьому ранері виконуєтьÑÑ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ, його буде завершено Ñ– позначено Ñк невдале. Це може порушити робочий потік збірки. +workflow.dispatch.run = ЗапуÑтити робочий потік +runners.edit_runner = Редагувати ранер +runs.no_runs = Робочий потік ще не запуÑкавÑÑ. +runners = Ранери +runners.runner_manage_panel = ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð°Ð½ÐµÑ€Ð°Ð¼Ð¸ +workflow.dispatch.success = Запит на запуÑк робочого потоку уÑпішно Ñтворено. +runs.no_matching_online_runner_helper = Ðе знайдено ранера в мережі з міткою: %s +runners.reset_registration_token_success = Токен реєÑтрації ранера уÑпішно Ñкинуто +runners.new = Створити новий ранер +runners.delete_runner = Видалити цей ранер +runners.runner_title = Ранер +runners.task_list = Ðещодавні Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ñ€Ð°Ð½ÐµÑ€Ð° +runners.update_runner_success = Ранер оновлено +runners.delete_runner_header = Підтвердіть Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ€Ð°Ð½ÐµÑ€Ð° [projects] +type-3.display_name = Проєкт організації +type-2.display_name = Проєкт репозиторію +type-1.display_name = ОÑобиÑтий проєкт +deleted.display_name = Видалений проєкт [git.filemode] -; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … symbolic_link=Символічне поÑÐ¸Ð»Ð°Ð½Ð½Ñ +directory = Тека +submodule = Підмодуль +normal_file = Звичайний файл +executable_file = Виконуваний файл +changed_filemode = %[1]s → %[2]s + + +[search] +code_kind = Шукати код… +code_search_unavailable = Пошук коду наразі недоÑтупний. Будь лаÑка, звʼÑжітьÑÑ Ð· адмініÑтратором Ñайту. +user_kind = Шукати кориÑтувачів… +repo_kind = Шукати репозиторії… +search = Пошук… +type_tooltip = Вид пошуку +fuzzy = Ðечіткий +fuzzy_tooltip = Включати результати, що подібні пошуковому запиту +union_tooltip = Включати результати, що відповідають будь-Ñкому з ключових Ñлів, розділених пробілами +union = Ключові Ñлова +exact = Точний +exact_tooltip = Включати лише результати, що чітко відповідають запиту +regexp = РегулÑрні вирази +regexp_tooltip = Опрацьовувати пошуковий запит Ñк регулÑрний вираз +org_kind = Шукати організації… +team_kind = Шукати команди… +milestone_kind = Шукати віхи... +commit_kind = Шукати коментарі… +no_results = Ðе знайдено відповідних результатів. +keyword_search_unavailable = Пошук за ключовими Ñловами наразі недоÑтупний. Будь лаÑка, зв'ÑжітьÑÑ Ð· адмініÑтратором Ñайту. +code_search_by_git_grep = Поточні результати пошуку коду надаютьÑÑ Ð· «git grep». Тут можуть бути кращі результати, Ñкщо адмініÑтратор Ñайту ввімкнув індекÑацію коду. +package_kind = Шукати пакунки… +project_kind = Шукати проєкти… +branch_kind = Шукати гілки… +issue_kind = Шукати задачі… +pull_kind = Шукати запити на злиттÑ… +runner_kind = Шукати ранери… + +[markup] +filepreview.truncated = ПереглÑд було урізано +filepreview.line = РÑдок %[1]d в %[2]s +filepreview.lines = РÑдки з %[1]d по %[2]d в %[3]s + +[translation_meta] +test = Це теÑтовий текÑÑ‚. Він не відображаєтьÑÑ Ð² інтерфейÑÑ– кориÑтувача Forgejo, а викориÑтовуєтьÑÑ Ð· метою теÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ + +[repo.permissions] +packages.read = Читати: дивитиÑÑŒ та завантажити пакунки, призначені до репозиторію. +packages.write = ПиÑати: публікувати та видалÑти пакунки, призначені до репозиторію. + +issues.read = Читати: дивитиÑÑŒ Ñ– Ñтворювати задачі та коментарі. +pulls.read = Читати: дивитиÑÑŒ Ñ– Ñтворювати запити на злиттÑ. +releases.read = Читати: дивитиÑÑŒ Ñ– завантажувати випуÑки. +releases.write = ПиÑати: публікувати, змінювати Ñ– видалÑти випуÑки та їхні реÑурÑи. +wiki.read = Читати: переглÑдати вбудовану вікі та Ñ—Ñ— Ñ–Ñторію. +wiki.write = ПиÑати: Ñтворювати, оновлювати та видалÑти Ñторінки вбудованої вікі. +actions.read = Читати: дивитиÑÑ Ð²Ð±ÑƒÐ´Ð¾Ð²Ð°Ð½Ñ– конвеєри CI/CD та їхні журнали. +actions.write = ПиÑати: вручну запуÑкати, перезапуÑкати, ÑкаÑовувати або Ñхвалювати конвеєри CI/CD в очікуванні. + +[munits.data] +pib = ПіБ +eib = ЕіБ +kib = КіБ +mib = МіБ +gib = ГіБ +tib = ТіБ +b = Б diff --git a/options/locale/locale_vi.ini b/options/locale/locale_vi.ini index 98d5506d83..57e592a209 100644 --- a/options/locale/locale_vi.ini +++ b/options/locale/locale_vi.ini @@ -1,6 +1,3 @@ - - - [common] home = Trang chá»§ explore = Khám phá @@ -60,7 +57,7 @@ forks = Các phân nhánh activities = Hoạt động pull_requests = Yêu cầu thêm mã save = Lưu -issues = +issues = enabled = Bật disabled = Tắt copy = Chép @@ -84,4 +81,6 @@ signed_in_as = Äăng nhập bằng re_type = Xác nhận mật khẩu webauthn_sign_in = Nhấn nút trên khóa bảo mật, nếu không có nút thì bạn hãy rút ra rồi cắm lại. new_org.link = Tạo tổ chức -error404 = Trang bạn Ä‘ang tìm không tồn tại hoặc bạn không có quyá»n xem. \ No newline at end of file +error404 = Trang bạn Ä‘ang tìm không tồn tại hoặc bạn không có quyá»n xem. +edit = Chỉnh sá»­a +filter = Lá»c \ No newline at end of file diff --git a/options/locale/locale_yi.ini b/options/locale/locale_yi.ini index 8b13789179..9340e3ef0a 100644 --- a/options/locale/locale_yi.ini +++ b/options/locale/locale_yi.ini @@ -1 +1 @@ - +[common] \ No newline at end of file diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 1873b11478..9ec958d7b2 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -1,6 +1,6 @@ [common] home=首页 -dashboard=首页 +dashboard=æŽ§åˆ¶é¢æ¿ explore=探索 help=帮助 logo=徽标 @@ -12,15 +12,15 @@ sign_up=注册 link_account=链接账户 register=注册 version=当å‰ç‰ˆæœ¬ -powered_by=Powered by %s +powered_by=ç”± %s æä¾›æ”¯æŒ page=é¡µé¢ template=æ¨¡æ¿ language=语言选项 notifications=通知 -active_stopwatch=活动时间跟踪器 -tracked_time_summary=åŸºäºŽé—®é¢˜åˆ—è¡¨è¿‡æ»¤å™¨çš„è·Ÿè¸ªæ—¶é—´æ¦‚è¦ +active_stopwatch=活跃时间跟踪器 +tracked_time_summary=基于工å•åˆ—è¡¨è¿‡æ»¤å™¨çš„è·Ÿè¸ªæ—¶é—´æ¦‚è¦ create_new=创建… -user_profile_and_more=个人信æ¯å’Œè®¾ç½®â€¦ +user_profile_and_more=个人信æ¯ä¸Žè®¾ç½®â€¦ signed_in_as=已登录用户 enable_javascript=æ­¤ç½‘ç«™éœ€è¦ JavaScript。 toc=目录 @@ -30,11 +30,11 @@ return_to_forgejo=返回 Forgejo username=用户å email=电å­é‚®ä»¶åœ°å€ password=å¯†ç  -access_token=访问令牌(Access Token) +access_token=访问令牌 re_type=ç¡®è®¤å¯†ç  captcha=验è¯ç  twofa=ä¸¤æ­¥éªŒè¯ -twofa_scratch=两步验è¯å£ä»¤ +twofa_scratch=两步验è¯å¤‡ç”¨éªŒè¯ç  passcode=验è¯ç  webauthn_insert_key=æ’入安全密钥 @@ -56,28 +56,28 @@ organization=组织 mirror=é•œåƒ new_repo=创建仓库 new_migrate=è¿ç§»å¤–部仓库 -new_mirror=åˆ›å»ºæ–°çš„é•œåƒ -new_fork=新的派生仓库 +new_mirror=åˆ›å»ºé•œåƒ +new_fork=创建派生仓库 new_org=创建组织 new_project=创建项目 new_project_column=创建列 manage_org=ç®¡ç†æˆ‘的组织 -admin_panel=管ç†åŽå° +admin_panel=ç½‘ç«™ç®¡ç† account_settings=叿ˆ·è®¾ç½® settings=设置 your_profile=ä¸ªäººä¿¡æ¯ -your_starred=已点赞 +your_starred=点赞 your_settings=设置 all=所有 -sources=自建 +sources=æ¥æº mirrors=é•œåƒ collaborative=å作 forks=派生 activities=最近活动 pull_requests=åˆå¹¶è¯·æ±‚ -issues=å·¥å•ç®¡ç† +issues=å·¥å• milestones=里程碑 ok=确定 @@ -87,10 +87,10 @@ rerun=釿–°è¿è¡Œ rerun_all=釿–°è¿è¡Œæ‰€æœ‰ä»»åŠ¡ save=ä¿å­˜ add=添加 -add_all=添加所有 +add_all=全部添加 remove=移除 -remove_all=移除所有 -remove_label_str=删除标签 "%s" +remove_all=全部移除 +remove_label_str=删除标签“%s†edit=编辑 view=查看 @@ -109,24 +109,24 @@ copy_type_unsupported=无法å¤åˆ¶æ­¤ç±»åž‹çš„æ–‡ä»¶å†…容 write=撰写 preview=预览 -loading=正在加载... +loading=正在加载… error=错误 -error404=您正å°è¯•è®¿é—®çš„é¡µé¢ ä¸å­˜åœ¨ 或 æ‚¨å°šæœªè¢«æŽˆæƒ æŸ¥çœ‹è¯¥é¡µé¢ã€‚ +error404=您å°è¯•访问的页é¢ä¸å­˜åœ¨ã€å·²è¢«ç§»é™¤æˆ–æ‚¨æ— æƒæŸ¥çœ‹ã€‚ go_back=返回 -never=ä»Žä¸ +never=从未 unknown=未知 rss_feed=RSS è®¢é˜…æº -pin=固定 +pin=置顶 unpin=å–æ¶ˆç½®é¡¶ artifacts=åˆ¶å“ confirm_delete_artifact=您确定è¦åˆ é™¤åˆ¶å““%sâ€å—? -archived=已归档 +archived=已存档 concept_system_global=全局 concept_user_individual=个人 @@ -143,15 +143,15 @@ 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.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 = ç§æœ‰ toggle_menu = 切æ¢èœå• @@ -160,12 +160,13 @@ more_items = 显示更多 copy_generic = å¤åˆ¶åˆ°å‰ªè´´æ¿ test = 测试 error413 = 您已用尽您的é…é¢ã€‚ -new_repo.title = 新仓库 -new_migrate.title = æ–°è¿ç§» -new_org.title = 新组织 -new_repo.link = 新仓库 -new_migrate.link = æ–°è¿ç§» -new_org.link = 新组织 +new_repo.title = 创建仓库 +new_migrate.title = 开始è¿ç§» +new_org.title = 创建组织 +new_repo.link = 创建仓库 +new_migrate.link = 开始è¿ç§» +new_org.link = 创建组织 +copy_path = å¤åˆ¶è·¯å¾„ [aria] navbar=å¯¼èˆªæ  @@ -174,12 +175,12 @@ footer.software=关于软件 footer.links=链接 [heatmap] -number_of_contributions_in_the_last_12_months=一年内 %s 次贡献 -contributions_zero=ç›®å‰è¿˜æ²¡æœ‰è´¡çŒ® -less=æ›´å°‘çš„ -more=更多的 -contributions_format = {year}{month}{day} 当日有 {contributions} -contributions_few = 项贡献 +number_of_contributions_in_the_last_12_months=过去的一年内有 %s 次贡献 +contributions_zero=没有贡献 +less=较少 +more=较多 +contributions_format = {year}å¹´{month}{day}日有{contributions} +contributions_few = 贡献 contributions_one = 贡献 [editor] @@ -198,7 +199,17 @@ buttons.switch_to_legacy.tooltip=使用旧版编辑器 buttons.enable_monospace_font=å¯ç”¨ç­‰å®½å­—体 buttons.disable_monospace_font=ç¦ç”¨ç­‰å®½å­—体 buttons.unindent.tooltip = 解除一级嵌套æ¡ç›® -buttons.indent.tooltip = 解除一级嵌套æ¡ç›® +buttons.indent.tooltip = 嵌套一级æ¡ç›® +table_modal.header = 添加表格 +table_modal.placeholder.header = 标题 +table_modal.label.columns = 列数 +table_modal.label.rows = 行数 +buttons.new_table.tooltip = 添加表格 +table_modal.placeholder.content = 内容 +link_modal.header = 添加链接 +link_modal.url = URL +link_modal.description = æè¿° +link_modal.paste_reminder = æç¤ºï¼šæ‚¨å¯ä»¥å°†å‰ªè´´æ¿ä¸­çš„ URL 直接粘贴到编辑器创建链接。 [filter] string.asc=A - Z @@ -206,7 +217,7 @@ string.desc=Z - A [error] occurred=å‘生了一个错误 -report_message=如果您确定这是一个 Forgejo bug,请在 Codeberg 上æœç´¢é—®é¢˜ï¼Œæˆ–åœ¨å¿…è¦æ—¶åˆ›å»ºä¸€ä¸ªæ–°å·¥å•。 +report_message=如果您确定这是一个 Forgejo çš„ bug,请在 Codeberg 上æœç´¢ç›¸å…³é—®é¢˜æˆ–åœ¨å¿…è¦æ—¶åˆ›å»ºä¸€ä¸ªæ–°å·¥å•。 missing_csrf=错误的请求:没有 CSRF 令牌 invalid_csrf=错误的请求:无效的 CSRF 令牌 not_found=找ä¸åˆ°ç›®æ ‡ã€‚ @@ -216,13 +227,13 @@ server_internal = æœåŠ¡å™¨å†…éƒ¨é”™è¯¯ [startpage] app_desc=ä¸€æ¬¾æžæ˜“æ­å»ºçš„自助 Git æœåŠ¡ install=易安装 -install_desc=通过 二进制 æ¥è¿è¡Œï¼›æˆ–者通过 docker æ¥è¿è¡Œï¼›æˆ–者通过 安装包 æ¥è¿è¡Œ +install_desc=通过二进制æ¥è¿è¡Œï¼›æˆ–者通过Docker æ¥è¿è¡Œï¼›æˆ–者通过安装包 æ¥è¿è¡Œã€‚ platform=è·¨å¹³å° platform_desc=å·²è¯å®žå¯ä»¥åœ¨ Linux å’Œ FreeBSD 等自由æ“作系统以åŠä¸åŒçš„ CPU 架构上è¿è¡Œ Forgejoã€‚æŒ‘ä¸€ä¸ªæ‚¨å–œæ¬¢çš„å°±è¡Œï¼ lightweight=è½»é‡çº§ lightweight_desc=一个廉价的树莓派的é…置足以满足 Forgejo çš„æœ€ä½Žç³»ç»Ÿç¡¬ä»¶è¦æ±‚ã€‚æœ€å¤§ç¨‹åº¦ä¸ŠèŠ‚çœæ‚¨çš„æœåŠ¡å™¨èµ„æºï¼ license=å¼€æºåŒ– -license_desc=所有的代ç éƒ½å¼€æºåœ¨ Forgejo 上,赶快加入我们æ¥å…±åŒå‘展这个伟大的项目ï¼è¿˜ç­‰ä»€ä¹ˆï¼Ÿæˆä¸ºè´¡çŒ®è€…å§ï¼ +license_desc=å–å¾— Forgejoï¼èµ¶å¿«åŠ å…¥æˆ‘ä»¬æ¥å…±åŒå‘展这个伟大的项目ï¼è¿˜ç­‰ä»€ä¹ˆï¼Ÿæˆä¸ºè´¡çŒ®è€…å§ï¼ [install] install=å®‰è£…é¡µé¢ @@ -235,8 +246,8 @@ host=æ•°æ®åº“主机 user=用户å password=æ•°æ®åº“ç”¨æˆ·å¯†ç  db_name=æ•°æ®åº“åç§° -db_schema=Schema -db_schema_helper=留空则数æ®åº“中默认值为("public")。 +db_schema=æž¶æž„æ¨¡å¼ +db_schema_helper=留空则数æ®åº“中默认值为("public")。 ssl_mode=SSL path=æ•°æ®åº“文件路径 sqlite_helper=SQLite3 æ•°æ®åº“的文件路径。
      如果以æœåŠ¡çš„æ–¹å¼è¿è¡Œ Forgejo,请输入ç»å¯¹è·¯å¾„。 @@ -246,7 +257,7 @@ reinstall_confirm_check_1=使用 app.ini 中 SECRET KEY 加密的数æ®å¯èƒ½ä¼š reinstall_confirm_check_2=代ç ä»“库和设置å¯èƒ½éœ€è¦é‡æ–°åŒæ­¥ã€‚å‹¾é€‰æ­¤æ¡†ï¼Œè¡¨ç¤ºæ‚¨ç¡®è®¤å°†æ‰‹åŠ¨é‡æ–°åŒæ­¥ä»“库和 SSH authorized_keys 的钩å­ã€‚您确认您将确ä¿ä»£ç ä»“库和镜åƒè®¾ç½®æ˜¯æ­£ç¡®çš„。 reinstall_confirm_check_3=你确认你ç»å¯¹è‚¯å®šè¿™ä¸ª Forgejo 在正确的 app.ini ä½ç½®ä¸Šè¿è¡Œï¼Œè€Œä¸”ä½ ç¡®å®šä½ å¿…é¡»é‡æ–°å®‰è£…。你确认你知晓上述风险。 err_empty_db_path=SQLite æ•°æ®åº“文件路径ä¸èƒ½ä¸ºç©ºã€‚ -no_admin_and_disable_registration=您ä¸èƒ½å¤Ÿåœ¨æœªåˆ›å»ºç®¡ç†å‘˜ç”¨æˆ·çš„æƒ…å†µä¸‹ç¦æ­¢æ³¨å†Œã€‚ +no_admin_and_disable_registration=您ä¸èƒ½å¤Ÿåœ¨æœªåˆ›å»ºç®¡ç†å‘˜è´¦å·çš„æƒ…å†µä¸‹ç¦æ­¢æ³¨å†Œã€‚ err_empty_admin_password=管ç†å‘˜å¯†ç ä¸èƒ½ä¸ºç©ºã€‚ err_empty_admin_email=管ç†å‘˜ç”µå­é‚®ä»¶ä¸èƒ½ä¸ºç©ºã€‚ err_admin_name_is_reserved=管ç†å‘˜ç”¨æˆ·åæ— æ•ˆï¼Œç”¨æˆ·åæ˜¯ä¿ç•™çš„ @@ -259,8 +270,8 @@ app_name_helper=在此处输入您的实例åç§°ã€‚å®ƒå°†æ˜¾ç¤ºåœ¨æ‰€æœ‰é¡µé¢ repo_path=仓库根目录 repo_path_helper=所有远程 Git 仓库将ä¿å­˜åˆ°æ­¤ç›®å½•。 lfs_path=LFS 根目录 -lfs_path_helper=存储为Git LFS的文件将被存储在此目录。留空ç¦ç”¨LFS -run_user=以用户è¿è¡Œ +lfs_path_helper=存储为Git LFS的文件将被存储在此目录。留空以ç¦ç”¨LFS。 +run_user=è¦ä½¿ç”¨çš„用户身份 run_user_helper=输入 Forgejo è¿è¡Œçš„æ“ä½œç³»ç»Ÿç”¨æˆ·å。请注æ„,此用户必须具有对仓库根路径的访问æƒé™ã€‚ domain=æœåŠ¡å™¨åŸŸå domain_helper=æœåŠ¡å™¨çš„åŸŸåæˆ–主机地å€ã€‚ @@ -269,16 +280,16 @@ ssh_port_helper=SSH æœåŠ¡å™¨çš„ç«¯å£å·ï¼Œä¸ºç©ºåˆ™ç¦ç”¨å®ƒã€‚ http_port=HTTP æœåŠ¡ç«¯å£ http_port_helper=Forgejos web æœåС噍将侦å¬çš„端å£å·ã€‚ app_url=基础URL -app_url_helper=用于 HTTP (S) 克隆和电å­é‚®ä»¶é€šçŸ¥çš„基本地å€ã€‚ +app_url_helper=用于 HTTP(S) 克隆和电å­é‚®ä»¶é€šçŸ¥çš„基础URL。 log_root_path=日志路径 log_root_path_helper=日志文件将写入此目录。 optional_title=å¯é€‰è®¾ç½® -email_title=电å­é‚®ç®±è®¾ç½® +email_title=电å­é‚®ä»¶è®¾ç½® smtp_addr=SMTP ä¸»æœºåœ°å€ smtp_port=SMTP ç«¯å£ smtp_from=电å­é‚®ä»¶å‘件人 -smtp_from_helper=请输入一个用于 Forgejo 的电å­é‚®ä»¶åœ°å€ï¼Œæˆ–者使用完整格å¼ï¼š"åç§°" +smtp_from_helper=Forgejo 使用的电å­é‚®ä»¶åœ°å€ã€‚ç›´æŽ¥è¾“å…¥é‚®ä»¶åœ°å€æˆ–使用完整格å¼ï¼š"åç§°" 。 mailer_user=SMTP 用户å mailer_password=SMTP å¯†ç  register_confirm=需è¦å‘电å­é‚®ä»¶ç¡®è®¤æ³¨å†Œ @@ -291,14 +302,14 @@ disable_gravatar.description=ç¦ç”¨ Gravatar å’Œç¬¬ä¸‰æ–¹å¤´åƒæºã€‚除éžç”¨ federated_avatar_lookup=å¯ç”¨è”é‚¦å¤´åƒ federated_avatar_lookup.description=使用 Libravatar 查找头åƒã€‚ disable_registration=ç¦æ­¢ç”¨æˆ·è‡ªåŠ©æ³¨å†Œ -disable_registration.description=åªæœ‰å®žä¾‹ç®¡ç†å‘˜æ‰èƒ½åˆ›å»ºæ–°çš„ç”¨æˆ·å¸æˆ·ã€‚å¼ºçƒˆå»ºè®®ä¿æŒæ³¨å†Œç¦ç”¨ï¼Œé™¤éžæ‚¨æ‰“算为所有人托管一个公共实例并准备好处ç†å¤§é‡åžƒåœ¾å¸æˆ·ã€‚ +disable_registration.description=åªæœ‰å®žä¾‹ç®¡ç†å‘˜æ‰èƒ½åˆ›å»ºæ–°çš„叿ˆ·ã€‚å¼ºçƒˆå»ºè®®ä¿æŒæ³¨å†Œç¦ç”¨ï¼Œé™¤éžæ‚¨æ‰“算为所有人托管一个公共实例并准备好处ç†å¤§é‡åžƒåœ¾å¸æˆ·ã€‚ allow_only_external_registration.description=ä»…å…许使用已é…置的外部æœåŠ¡æ¥åˆ›å»ºæ–°å¸æˆ·ã€‚ openid_signin=å¯ç”¨ OpenID 登录 openid_signin.description=å…许用户通过 OpenID 登录。 openid_signup=å¯ç”¨ OpenID 自助注册 openid_signup.description=如果å¯ç”¨äº†è‡ªåŠ©æ³¨å†Œï¼Œåˆ™å…许用户通过 OpenID åˆ›å»ºå¸æˆ·ã€‚ enable_captcha=å¯ç”¨æ³¨å†ŒéªŒè¯ç  -enable_captcha.description=è¦æ±‚用户通过 CAPTCHA éªŒè¯æ‰èƒ½åˆ›å»ºå¸æˆ·ã€‚ +enable_captcha.description=è¦æ±‚用户通过验è¯ç æ‰èƒ½åˆ›å»ºå¸æˆ·ã€‚ require_sign_in_view=å¯ç”¨é¡µé¢è®¿é—®é™åˆ¶ require_sign_in_view.description=ä»…å…许已登录用户访问页é¢ã€‚访客åªèƒ½çœ‹åˆ°æ³¨å†Œå’Œç™»å½•页。 admin_setting.description=创建管ç†å‘˜å¸æˆ·æ˜¯å¯é€‰çš„。第一个注册用户将自动æˆä¸ºç®¡ç†å‘˜ã€‚ @@ -310,22 +321,22 @@ admin_email=电å­é‚®ä»¶åœ°å€ install_btn_confirm=ç«‹å³å®‰è£… test_git_failed=无法识别 “git†命令:%v sqlite3_not_available=å½“å‰ Forgejo ç‰ˆæœ¬ä¸æ”¯æŒ SQLite3。请从 %s 下载官方构建版(注:请勿下载标有 “gobuild†的版本)。 -invalid_db_setting=æ•°æ®åº“设置无效: %v -invalid_db_table=æ•°æ®åº“表 '%s' 无效: %v +invalid_db_setting=æ•°æ®åº“设置无效:%v +invalid_db_table=æ•°æ®åº“表 '%s' 无效:%v invalid_repo_path=仓库根目录设置无效:%v -invalid_app_data_path=应用数æ®è·¯å¾„无效: %v +invalid_app_data_path=应用数æ®è·¯å¾„无效:%v run_user_not_match=è¿è¡Œç”¨æˆ·å䏿˜¯å½“å‰çš„用户å:%s -> %s -internal_token_failed=生æˆå†…部令牌失败: %v -secret_key_failed=生æˆå¯†é’¥å¤±è´¥ï¼š %v +internal_token_failed=生æˆå†…部令牌失败:%v +secret_key_failed=生æˆå¯†é’¥å¤±è´¥ï¼š%v save_config_failed=应用é…ç½®ä¿å­˜å¤±è´¥ï¼š%v -invalid_admin_setting=管ç†å‘˜å¸æˆ·è®¾ç½®æ— æ•ˆ: %v -invalid_log_root_path=日志路径无效: %v +invalid_admin_setting=管ç†å‘˜å¸æˆ·è®¾ç½®æ— æ•ˆï¼š%v +invalid_log_root_path=日志路径无效:%v default_keep_email_private=默认情况下éšè—电å­é‚®ä»¶åœ°å€ default_keep_email_private.description=默认为新用户å¯ç”¨ç”µå­é‚®ä»¶åœ°å€éšè—,防止这些信æ¯åœ¨æ³¨å†ŒåŽç«‹å³æ³„露。 default_allow_create_organization=默认情况下å…许创建组织 default_allow_create_organization.description=默认å…许新用户创建组织。ç¦ç”¨æ­¤é€‰é¡¹æ—¶ï¼Œç®¡ç†å‘˜å¿…须呿–°ç”¨æˆ·æŽˆäºˆåˆ›å»ºç»„织的æƒé™ã€‚ default_enable_timetracking=默认情况下å¯ç”¨æ—¶é—´è·Ÿè¸ª -default_enable_timetracking.description=默认å…许新存储库使用时间跟踪功能。 +default_enable_timetracking.description=默认å…许新仓库使用时间跟踪功能。 no_reply_address=éšè—电å­é‚®ä»¶ no_reply_address_helper=用于设置éšè—电å­é‚®ä»¶åœ°å€çš„用户使用的电å­é‚®ä»¶åŸŸå。例如,如果用于éšè—电å­é‚®ä»¶åœ°å€çš„域å设为“noreply.example.orgâ€ï¼Œåˆ™ç”¨æˆ·å “joe†在 Git 中将以 “joe@noreply.example.org†表示。 password_algorithm=密ç å“ˆå¸Œç®—法 @@ -343,7 +354,7 @@ app_slogan = 实例标语 app_slogan_helper = 在此处输入您的实例标语。留空则ç¦ç”¨ã€‚ [home] -uname_holder=ç”¨æˆ·åæˆ–电å­é‚®ç®± +uname_holder=ç”¨æˆ·åæˆ–电å­é‚®ä»¶åœ°å€ password_holder=å¯†ç  switch_dashboard_context=åˆ‡æ¢æŽ§åˆ¶é¢æ¿ç”¨æˆ· my_repos=仓库列表 @@ -357,12 +368,12 @@ filter=其他过滤器 filter_by_team_repositories=按团队仓库筛选 feed_of=`"%s"çš„æº` -show_archived=已归档 -show_both_archived_unarchived=显示已归档和未归档的 -show_only_archived=åªæ˜¾ç¤ºå·²å½’档的 -show_only_unarchived=åªæ˜¾ç¤ºæœªå½’档的 +show_archived=已存档 +show_both_archived_unarchived=显示已存档和未存档的 +show_only_archived=åªæ˜¾ç¤ºå·²å­˜æ¡£çš„ +show_only_unarchived=åªæ˜¾ç¤ºæœªå­˜æ¡£çš„ -show_private=ç§æœ‰åº“ +show_private=ç§æœ‰ show_both_private_public=åŒæ—¶æ˜¾ç¤ºå…¬å¼€çš„å’Œç§æœ‰çš„ show_only_private=åªæ˜¾ç¤ºç§æœ‰çš„ show_only_public=åªæ˜¾ç¤ºå…¬å¼€çš„ @@ -388,7 +399,7 @@ org_no_results=未找到匹é…的组织。 code_no_results=未找到与æœç´¢å­—è¯åŒ¹é…çš„æºä»£ç ã€‚ code_search_results=“%s†的æœç´¢ç»“果是 code_last_indexed_at=最åŽç´¢å¼•于 %s -relevant_repositories_tooltip=派生的仓库,以åŠç¼ºå°‘主题ã€å›¾æ ‡å’Œæè¿°çš„仓库将被éšè—。 +relevant_repositories_tooltip=派生的ã€ç¼ºå°‘主题ã€å›¾æ ‡å’Œæè¿°çš„仓库已被éšè—。 relevant_repositories=åªæ˜¾ç¤ºç›¸å…³çš„仓库, 显示未过滤结果。 stars_one = %d 点赞 stars_few = %d 点赞 @@ -416,7 +427,7 @@ active_your_account=æ¿€æ´»æ‚¨çš„å¸æˆ· account_activated=叿ˆ·å·²æ¿€æ´» prohibit_login=è´¦å·å·²æš‚åœ prohibit_login_desc=您的账å·å·²æš‚åœä¸Žå®žä¾‹äº¤äº’。请与实例管ç†å‘˜è”ç³»ä»¥é‡æ–°èŽ·å¾—è®¿é—®æƒé™ã€‚ -resent_limit_prompt=您请求å‘逿¿€æ´»é‚®ä»¶è¿‡äºŽé¢‘ç¹ï¼Œè¯·ç­‰å¾… 3 分钟åŽå†è¯•ï¼ +resent_limit_prompt=您请求å‘逿¿€æ´»é‚®ä»¶è¿‡äºŽé¢‘ç¹ï¼Œè¯·ç­‰å¾… 3 分钟åŽå†è¯•。 has_unconfirmed_mail=%s 您好,系统检测到您有一å°å‘é€è‡³ %s 但未被确认的邮件。如果您未收到激活邮件,或需è¦é‡æ–°å‘é€ï¼Œè¯·å•击下方的按钮。 resend_mail=å•å‡»æ­¤å¤„é‡æ–°å‘é€ç¡®è®¤é‚®ä»¶ email_not_associate=æ‚¨è¾“å…¥çš„é‚®ç®±åœ°å€æœªè¢«å…³è”到任何å¸å·ï¼ @@ -426,7 +437,7 @@ invalid_code=此确认密钥无效或已过期。 invalid_code_forgot_password=ä½ çš„ç¡®è®¤ç æ— æ•ˆæˆ–者已过期,点击 这里 开始新的会è¯ã€‚ invalid_password=您的密ç ä¸Žç”¨äºŽåˆ›å»ºè´¦æˆ·çš„密ç ä¸åŒ¹é…。 reset_password_helper=æ¢å¤è´¦æˆ· -reset_password_wrong_user=您以 %s 登录,但æ¢å¤è´¦å·é“¾æŽ¥æ˜¯ç”¨äºŽ %s。 +reset_password_wrong_user=您以 %s 登录,但æ¢å¤è´¦å·é“¾æŽ¥é€‚用于 %s password_too_short=密ç é•¿åº¦ä¸èƒ½å°‘于 %d ä½ã€‚ non_local_account=éžæœ¬åœ°å¸æˆ·ä¸èƒ½é€šè¿‡ Forgejo çš„ web ç•Œé¢æ›´æ”¹å¯†ç ã€‚ verify=éªŒè¯ @@ -443,7 +454,7 @@ oauth_signup_submit=完æˆè´¦å· oauth_signin_tab=绑定到现有å¸å· oauth_signin_title=登录以授æƒç»‘å®šå¸æˆ· oauth_signin_submit=ç»‘å®šè´¦å· -oauth.signin.error=å¤„ç†æŽˆæƒè¯·æ±‚时出错。 如果此错误ä»ç„¶å­˜â€‹â€‹åœ¨ï¼Œè¯·è”系站点管ç†å‘˜ã€‚ +oauth.signin.error=å¤„ç†æŽˆæƒè¯·æ±‚时出错。如果此错误ä»ç„¶å­˜åœ¨ï¼Œè¯·è”系站点管ç†å‘˜ã€‚ oauth.signin.error.access_denied=授æƒè¯·æ±‚被拒ç»ã€‚ oauth.signin.error.temporarily_unavailable=授æƒå¤±è´¥ï¼Œå› ä¸ºè®¤è¯æœåŠ¡å™¨æš‚æ—¶ä¸å¯ç”¨ã€‚请ç¨åŽå†è¯•。 openid_connect_submit=连接 @@ -457,7 +468,7 @@ disable_forgot_password_mail_admin=叿ˆ·æ¢å¤ä»…在设置电å­é‚®ä»¶åŽå¯ç”¨ email_domain_blacklisted=您ä¸èƒ½ä½¿ç”¨æ‚¨çš„电å­é‚®ä»¶åœ°å€æ³¨å†Œã€‚ authorize_application=åº”ç”¨æŽˆæƒ authorize_redirect_notice=å¦‚æžœæ‚¨æŽˆæƒæ­¤åº”用,您将会被é‡å®šå‘到 %s。 -authorize_application_created_by=此应用由%s创建。 +authorize_application_created_by=此应用由 %s 创建。 authorize_application_description=如果您å…许,它将能够读å–å’Œä¿®æ”¹æ‚¨çš„æ‰€æœ‰å¸æˆ·ä¿¡æ¯ï¼ŒåŒ…括ç§äººä»“库和组织。 authorize_title=æŽˆæƒ %s è®¿é—®æ‚¨çš„å¸æˆ·ï¼Ÿ authorization_failed=授æƒå¤±è´¥ @@ -468,14 +479,16 @@ password_pwned_err=无法完æˆå¯¹ HaveIBeenPwned 的请求 last_admin=您ä¸èƒ½åˆ é™¤æœ€åŽä¸€ä¸ªç®¡ç†å‘˜ã€‚必须至少ä¿ç•™ä¸€ä¸ªç®¡ç†å‘˜ã€‚ change_unconfirmed_email = 如果您在注册时æä¾›äº†é”™è¯¯çš„邮箱地å€ï¼Œæ‚¨å¯ä»¥åœ¨ä¸‹æ–¹ä¿®æ”¹ï¼Œæ¿€æ´»é‚®ä»¶ä¼šå‘é€åˆ°ä¿®æ”¹åŽçš„邮箱地å€ã€‚ change_unconfirmed_email_summary = ä¿®æ”¹ç”¨æ¥æŽ¥æ”¶æ¿€æ´»é‚®ä»¶çš„é‚®ç®±åœ°å€ã€‚ -change_unconfirmed_email_error = 无法修改邮箱地å€ï¼š %v +change_unconfirmed_email_error = 无法修改邮箱地å€ï¼š%v tab_signin = 登录 tab_signup = 注册 -hint_login = 已创建账户?立å³ç™»å½• +hint_login = å·²ç»æœ‰è´¦æˆ·äº†å—?立å³ç™»å½•ï¼ back_to_sign_in = 返回登录 sign_in_openid = 继续使用 OpenID sign_up_button = ç«‹å³æ³¨å†Œã€‚ hint_register = 需è¦è´¦å·ï¼Ÿç«‹å³æ³¨å†Œã€‚ +unauthorized_credentials = 凭æ®ä¸æ­£ç¡®æˆ–已过期。请é‡è¯•您的命令,或查看 %s ä»¥èŽ·å–æ›´å¤šä¿¡æ¯ +use_onetime_code = ä½¿ç”¨ä¸€æ¬¡æ€§ä»£ç  [mail] view_it_on=在 %s 上查看 @@ -504,8 +517,8 @@ reset_password.text=如果此请求是您本人作出的,则请在 %s register_success=注册æˆåŠŸ -issue_assigned.pull=@%[1]s 已将仓库 %[3]s 中的åˆå¹¶è¯·æ±‚ %[2]s 指派给您 -issue_assigned.issue=@%[1]s 已将仓库 %[3]s ä¸­çš„å·¥å• %[2]s 指派给您 +issue_assigned.pull=@%[1]s 已将仓库 %[3]s 中的åˆå¹¶è¯·æ±‚ %[2]s 指派给您。 +issue_assigned.issue=@%[1]s 已将仓库 %[3]s ä¸­çš„å·¥å• %[2]s 指派给您。 issue.x_mentioned_you=@%s æåˆ°äº†æ‚¨ï¼š issue.action.force_push=%[1]s 强制从 %[3]s æŽ¨é€ %[2]s 至 [4]s。 @@ -517,18 +530,18 @@ issue.action.merge=@%[1]s å°† #%[2]d åˆå¹¶åˆ° #%[3]s。 issue.action.approve=@%[1]s 批准了此åˆå¹¶è¯·æ±‚。 issue.action.reject=@%[1]s 请求更改此åˆå¹¶è¯·æ±‚。 issue.action.review=@%[1]s 评论了这个åˆå¹¶è¯·æ±‚。 -issue.action.review_dismissed=@%[1]s æ‹’ç»äº† %[2]s 对此åˆå¹¶è¯·æ±‚的上个审核。 -issue.action.ready_for_review=@%[1]s 标记此åˆå¹¶è¯·æ±‚已评审通过。 +issue.action.review_dismissed=@%[1]s å–æ¶ˆäº† %[2]s 对此åˆå¹¶è¯·æ±‚的上一个评审。 +issue.action.ready_for_review=@%[1]s 标记了此åˆå¹¶è¯·æ±‚为已准备好接å—评审。 issue.action.new=@%[1]s 创建了 #%[2]d. issue.in_tree_path=在 %s 中: release.new.subject=%[2]s 中的 %[1]s å‘布了 release.new.text=@%[1]s 于 %[3]s å‘布了 %[2]s -release.title=标题: %s +release.title=标题:%s release.note=注释: release.downloads=下载: -release.download.zip=æºä»£ç  (ZIP) -release.download.targz=æºä»£ç  (TAR.GZ) +release.download.zip=æºä»£ç ï¼ˆZIP) +release.download.targz=æºä»£ç ï¼ˆTAR.GZ) repo.transfer.subject_to=%s 想è¦å°† "%s" 仓库转让给 %s repo.transfer.subject_to_you=%s 想è¦å°† "%s" 仓库转让给你 @@ -591,24 +604,24 @@ Content=内容 SSPISeparatorReplacement=分隔符 SSPIDefaultLanguage=默认语言 -require_error=ä¸èƒ½ä¸ºç©ºã€‚ -alpha_dash_error=` åªå…许包å«å­—æ¯æ•°å­—ã€ç ´æŠ˜å·ï¼ˆâ€œ-â€ï¼‰å’Œä¸‹åˆ’线(“_â€ï¼‰å­—符。 +require_error=` ä¸èƒ½ä¸ºç©ºã€‚` +alpha_dash_error=` 应åªåŒ…å«å­—æ¯æ•°å­—ã€ç ´æŠ˜å·ï¼ˆâ€œ-â€ï¼‰å’Œä¸‹åˆ’线(“_â€ï¼‰å­—符。` alpha_dash_dot_error=` 应该åªåŒ…å«åŠè§’å­—æ¯ã€æ•°å­—ã€ç ´æŠ˜å·ï¼ˆâ€œ-â€ï¼‰ã€ä¸‹åˆ’线(“_â€ï¼‰å’ŒåŠè§’å¥å·ï¼ˆâ€œ.â€ï¼‰ 。` git_ref_name_error=` 必须是格å¼è‰¯å¥½çš„ git 引用å称。` -size_error=长度必须为 %s。 -min_size_error=长度最å°ä¸º %s 个字符。 -max_size_error=长度最大为 %s 个字符。 -email_error=䏿˜¯ä¸€ä¸ªæœ‰æ•ˆçš„邮箱地å€ã€‚ +size_error=`长度必须为 %s。` +min_size_error=`长度最å°ä¸º %s 个字符。` +max_size_error=`长度最大为 %s 个字符。` +email_error=`䏿˜¯ä¸€ä¸ªæœ‰æ•ˆçš„邮箱地å€ã€‚` url_error=`'%s' 䏿˜¯ä¸€ä¸ªæœ‰æ•ˆçš„ URL。` include_error=`必须包å«å­å­—符串 "%s"。` glob_pattern_error=`åŒ¹é…æ¨¡å¼æ— æ•ˆï¼š%s.` regex_pattern_error=`æ­£åˆ™è¡¨è¾¾å¼æ— æ•ˆï¼š%s.` username_error=` åªå…许包å«å­—æ¯æ•°å­—字符(“0-9â€ã€â€œa-zâ€ã€â€œA-Zâ€ï¼‰ã€ç ´æŠ˜å·ï¼ˆâ€œ-â€ï¼‰ã€ä¸‹åˆ’线(“_â€ï¼‰å’Œç‚¹ï¼ˆâ€œ.â€ï¼‰ã€‚ä¸èƒ½ä»¥éžå­—æ¯æ•°å­—字符开头或结尾,并且ä¸å…许连续的éžå­—æ¯æ•°å­—字符。` -invalid_group_team_map_error=`映射无效: %s` +invalid_group_team_map_error=`映射无效:%s` unknown_error=未知错误: captcha_incorrect=验è¯ç ä¸æ­£ç¡®ã€‚ password_not_match=密ç ä¸åŒ¹é…。 -lang_select_error=从列表中选出语言 +lang_select_error=从列表中选择一个语言。 username_been_taken=用户å已被使用。 username_change_not_local_user=éžæœ¬åœ°ç”¨æˆ·ä¸å…许更改用户å。 @@ -632,21 +645,21 @@ password_complexity=å¯†ç æœªè¾¾åˆ°å¤æ‚ç¨‹åº¦è¦æ±‚: password_lowercase_one=至少一个å°å†™å­—符 password_uppercase_one=至少一个大写字符 password_digit_one=至少一个数字 -password_special_one=至少一个特殊字符(标点符å·ï¼Œæ‹¬å·ï¼Œå¼•å·ç­‰) -enterred_invalid_repo_name=输入的仓库åç§°ä¸æ­£ç¡® +password_special_one=至少一个特殊字符(标点符å·ï¼Œæ‹¬å·ï¼Œå¼•å·ç­‰ï¼‰ +enterred_invalid_repo_name=输入的仓库åç§°ä¸æ­£ç¡®ã€‚ enterred_invalid_org_name=您输入的组织åç§°ä¸æ­£ç¡®ã€‚ enterred_invalid_owner_name=新的所有者å称无效。 -enterred_invalid_password=输入的密ç ä¸æ­£ç¡® -user_not_exist=该用户ä¸å­˜åœ¨ -team_not_exist=团队ä¸å­˜åœ¨ +enterred_invalid_password=输入的密ç ä¸æ­£ç¡®ã€‚ +user_not_exist=该用户ä¸å­˜åœ¨ã€‚ +team_not_exist=团队ä¸å­˜åœ¨ã€‚ last_org_owner=您ä¸èƒ½ä»Žâ€œæ‰€æœ‰è€…â€å›¢é˜Ÿä¸­åˆ é™¤æœ€åŽä¸€ä¸ªç”¨æˆ·ã€‚组织中必须至少有一个所有者。 cannot_add_org_to_team=组织ä¸èƒ½è¢«åŠ å…¥åˆ°å›¢é˜Ÿä¸­ã€‚ duplicate_invite_to_team=此用户已被邀请为团队æˆå‘˜ã€‚ organization_leave_success=您已æˆåŠŸç¦»å¼€ç»„ç»‡ %s。 -invalid_ssh_key=æ— æ³•éªŒè¯æ‚¨çš„ SSH 密钥: %s -invalid_gpg_key=æ— æ³•éªŒè¯æ‚¨çš„ GPG 密钥: %s -invalid_ssh_principal=无效的规则: %s +invalid_ssh_key=æ— æ³•éªŒè¯æ‚¨çš„ SSH 密钥:%s +invalid_gpg_key=æ— æ³•éªŒè¯æ‚¨çš„ GPG 密钥:%s +invalid_ssh_principal=无效的规则:%s must_use_public_key=您æä¾›çš„密钥是ç§é’¥ã€‚ä¸è¦åœ¨ä»»ä½•地方上传您的ç§é’¥ï¼Œè¯·æ”¹ç”¨æ‚¨çš„公钥。 unable_verify_ssh_key=æ— æ³•éªŒè¯ SSH å¯†é’¥ï¼Œè¯·ä»”ç»†æ£€æŸ¥æ˜¯å¦æœ‰é”™è¯¯ã€‚ auth_failed=授æƒéªŒè¯å¤±è´¥ï¼š%v @@ -659,9 +672,7 @@ org_still_own_packages=è¯¥ç»„ç»‡ä¸‹ä»æœ‰è½¯ä»¶åŒ…,请先删除它们。 target_branch_not_exist=目标分支ä¸å­˜åœ¨ã€‚ username_error_no_dots = ` åªèƒ½åŒ…å«è‹±æ–‡å­—æ¯ä¸Žæ•°å­—(“0-9â€ã€â€œa-zâ€ã€â€œA-Zâ€ï¼‰ã€æ¨ªæ ï¼ˆâ€œ-â€ï¼‰ 与下划线(“_â€ï¼‰ã€‚ 开头与结尾的字符åªèƒ½ä½¿ç”¨è‹±æ–‡å­—æ¯æˆ–数字,且ä¸èƒ½åŒ…å«è¿žç»­çš„éžå­—æ¯éžæ•°å­—字符。` -admin_cannot_delete_self = 您无法以管ç†å‘˜çš„身份删除自己。请先移除您的管ç†å‘˜æƒé™ã€‚ - -admin_cannot_delete_self=当您是管ç†å‘˜æ—¶ï¼Œæ‚¨ä¸èƒ½åˆ é™¤è‡ªå·±ã€‚请先移除您的管ç†å‘˜æƒé™ +admin_cannot_delete_self=当您是管ç†å‘˜æ—¶ï¼Œæ‚¨ä¸èƒ½åˆ é™¤è‡ªå·±ã€‚请先移除您的管ç†å‘˜æƒé™ã€‚ unsupported_login_type = 该账å·ä½¿ç”¨çš„登录方å¼ä¸æ”¯æŒåˆ é™¤æ­¤è´¦æˆ·ã€‚ unset_password = 当å‰ç™»å½•用户尚未设置密ç ã€‚ required_prefix = 输入必须以“%sâ€å¼€å¤´ @@ -672,10 +683,12 @@ To = 分支å AccessToken = 访问令牌 Description = æè¿° Pronouns = 代称 -Biography = 简历 +Biography = 简介 +username_claiming_cooldown = 用户åä¸èƒ½è¢«è®¤é¢†ï¼Œå› ä¸ºå…¶ä»å¤„äºŽä¿æŠ¤æœŸã€‚å…¶å¯ä»¥åœ¨%[1]såŽè¢«è®¤é¢†ã€‚ +email_domain_is_not_allowed = 用户电å­é‚®ä»¶åœ°å€çš„域å%s与EMAIL_DOMAIN_ALLOWLIST或EMAIL_DOMAIN_BLOCKLIST冲çªã€‚è¯·ç¡®ä¿æ‚¨æ­£ç¡®è®¾ç½®äº†ç”µå­é‚®ä»¶åœ°å€ã€‚ [user] -change_avatar=ä¿®æ”¹å¤´åƒ +change_avatar=修改头åƒâ€¦ joined_on=加入于 %s repositories=仓库列表 activity=公开活动 @@ -706,7 +719,7 @@ follow_blocked_user = 您ä¸èƒ½å…³æ³¨è¯¥ç”¨æˆ·ï¼Œå› ä¸ºæ‚¨å·²å±è”½è¯¥ç”¨æˆ·æˆ– block = å±è”½ unblock = 解除å±è”½ block_user.detail_3 = 您将无法将彼此添加为仓库å作者。 -followers_one = %d ä½å…³æ³¨è€… +followers_one = %d 关注者 following_one = %d 关注 public_activity.visibility_hint.self_public = 您的活动对所有人都是å¯è§çš„,但在ç§äººç©ºé—´ä¸­çš„交互除外。é…置。 public_activity.visibility_hint.admin_public = 此活动对所有人å¯è§ï¼Œä½†ä½œä¸ºç®¡ç†å‘˜ï¼Œæ‚¨è¿˜å¯ä»¥çœ‹åˆ°ç§äººç©ºé—´ä¸­çš„交互。 @@ -716,6 +729,7 @@ followers.title.one = 关注者 followers.title.few = 关注者 following.title.one = 关注 following.title.few = 关注 +public_activity.visibility_hint.self_private_profile = ç”±äºŽæ‚¨çš„ä¸ªäººèµ„æ–™æ˜¯ç§æœ‰çš„ï¼Œå› æ­¤æ‚¨çš„æ´»åŠ¨åªæœ‰æ‚¨å’Œå®žä¾‹ç®¡ç†å‘˜å¯è§ã€‚é…置。 [settings] profile=ä¸ªäººä¿¡æ¯ @@ -737,9 +751,9 @@ uid=UID webauthn=两步验è¯ï¼ˆå®‰å…¨å¯†é’¥ï¼‰ public_profile=å…¬å¼€ä¿¡æ¯ -biography_placeholder=å‘Šè¯‰æˆ‘ä»¬ä¸€ç‚¹æ‚¨è‡ªå·±ï¼ (您å¯ä»¥ä½¿ç”¨Markdown) +biography_placeholder=å‘他人介ç»ä¸€ä¸‹ä½ è‡ªå·±ï¼ï¼ˆæ”¯æŒ Markdown) location_placeholder=与他人分享你的大概ä½ç½® -profile_desc=控制您的个人资料对其他用户的显示方å¼ã€‚您的主è¦ç”µå­é‚®ä»¶åœ°å€å°†ç”¨äºŽé€šçŸ¥ã€å¯†ç æ¢å¤å’ŒåŸºäºŽç½‘页界é¢çš„ Git æ“作。 +profile_desc=关于您 password_username_disabled=ä¸å…è®¸éžæœ¬åœ°ç”¨æˆ·æ›´æ”¹ä»–们的用户å。更多详情请è”系您的系统管ç†å‘˜ã€‚ full_name=å…¨å website=个人网站 @@ -749,17 +763,17 @@ update_profile=更新个人资料 update_language=更改语言 update_language_not_found=语言 %s ä¸å¯ç”¨ã€‚ update_language_success=语言已更新。 -update_profile_success=您的资料信æ¯å·²ç»æ›´æ–° +update_profile_success=æ‚¨çš„ä¸ªäººèµ„æ–™å·²ç»æ›´æ–°ã€‚ change_username=您的用户å已更改。 change_username_prompt=注æ„:更改您的用户åä¹Ÿæ›´æ”¹æ‚¨çš„å¸æˆ· URL。 -change_username_redirect_prompt=åœ¨å…¶ä»–ç”¨æˆ·ä½¿ç”¨æ‚¨çš„æ—§ç”¨æˆ·åæ³¨å†Œå‰ï¼Œæ­¤æ—§ç”¨æˆ·å将会é‡å®šå‘到您的新用户å +change_username_redirect_prompt=åœ¨å…¶ä»–ç”¨æˆ·ä½¿ç”¨æ‚¨çš„æ—§ç”¨æˆ·åæ³¨å†Œå‰ï¼Œæ­¤æ—§ç”¨æˆ·å将会é‡å®šå‘到您的新用户å。 continue=ç»§ç»­æ“作 cancel=å–æ¶ˆæ“作 language=界é¢è¯­è¨€ ui=主题 -hidden_comment_types=éšè—的评论类型 -hidden_comment_types_description=此处选中的注释类型ä¸ä¼šæ˜¾ç¤ºåœ¨é—®é¢˜é¡µé¢ä¸­ã€‚æ¯”å¦‚ï¼Œå‹¾é€‰â€æ ‡ç­¾â€œåˆ é™¤æ‰€æœ‰ " 添加/删除的
      - - + + + {{else}} + {{end}}
      images/icon-install.png Installation
      images/icon-usage.png Usage
      {{.Name}} {{.TypeName}} {{if .IsActive}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}{{DateTime "short" .UpdatedUnix}}{{DateTime "short" .CreatedUnix}}{{DateUtils.AbsoluteShort .UpdatedUnix}}{{DateUtils.AbsoluteShort .CreatedUnix}} {{svg "octicon-pencil"}}
      {{ctx.Locale.Tr "repo.pulls.no_results"}}
      diff --git a/templates/admin/auth/new.tmpl b/templates/admin/auth/new.tmpl index 47fa82825c..12d3798278 100644 --- a/templates/admin/auth/new.tmpl +++ b/templates/admin/auth/new.tmpl @@ -50,16 +50,13 @@ {{template "admin/auth/source/oauth" .}} - - {{template "admin/auth/source/sspi" .}} -
      -
      +
      diff --git a/templates/admin/auth/source/oauth.tmpl b/templates/admin/auth/source/oauth.tmpl index 0560cc8256..7d0a64d269 100644 --- a/templates/admin/auth/source/oauth.tmpl +++ b/templates/admin/auth/source/oauth.tmpl @@ -63,19 +63,27 @@
      - {{range .OAuth2Providers}}{{if .CustomURLSettings}} - - - - - - - {{end}}{{end}} - + {{range .OAuth2Providers}} + {{if .CustomURLSettings}} + + + + + + + {{end}} + {{if .CanProvideSSHKeys}} + + {{end}} + {{end}}
      +
      + + +
      diff --git a/templates/admin/auth/source/sspi.tmpl b/templates/admin/auth/source/sspi.tmpl deleted file mode 100644 index 6a3f00f9a8..0000000000 --- a/templates/admin/auth/source/sspi.tmpl +++ /dev/null @@ -1,43 +0,0 @@ -
      -
      -
      - - -

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

      -
      -
      -
      -
      - - -

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

      -
      -
      -
      -
      - - -

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

      -
      -
      -
      - - -

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

      -
      -
      - - -

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

      -
      -
      diff --git a/templates/admin/cron.tmpl b/templates/admin/cron.tmpl index 3cb641488c..ee37f6ca75 100644 --- a/templates/admin/cron.tmpl +++ b/templates/admin/cron.tmpl @@ -23,8 +23,8 @@ {{ctx.Locale.Tr (printf "admin.dashboard.%s" .Name)}} {{.Spec}} - {{DateTime "full" .Next}} - {{if gt .Prev.Year 1}}{{DateTime "full" .Prev}}{{else}}-{{end}} + {{DateUtils.FullTime .Next}} + {{if gt .Prev.Year 1}}{{DateUtils.FullTime .Prev}}{{else}}-{{end}} {{.ExecTimes}} {{if eq .Status ""}}—{{else if eq .Status "finished"}}{{svg "octicon-check" 16}}{{else}}{{svg "octicon-x" 16}}{{end}} diff --git a/templates/admin/emails/list.tmpl b/templates/admin/emails/list.tmpl index b07c6fcc01..5c30df87af 100644 --- a/templates/admin/emails/list.tmpl +++ b/templates/admin/emails/list.tmpl @@ -66,6 +66,8 @@
      + {{else}} + {{ctx.Locale.Tr "repo.pulls.no_results"}} {{end}} diff --git a/templates/admin/notice.tmpl b/templates/admin/notice.tmpl index 33d8a2f963..08f0a4f204 100644 --- a/templates/admin/notice.tmpl +++ b/templates/admin/notice.tmpl @@ -21,9 +21,11 @@ {{.ID}} {{ctx.Locale.Tr .TrStr}} {{.Description}} - {{DateTime "short" .CreatedUnix}} + {{DateUtils.AbsoluteShort .CreatedUnix}} {{svg "octicon-note" 16}} + {{else}} + {{ctx.Locale.Tr "repo.pulls.no_results"}} {{end}} {{if .Notices}} diff --git a/templates/admin/org/list.tmpl b/templates/admin/org/list.tmpl index 987ceab1e0..8c9c198897 100644 --- a/templates/admin/org/list.tmpl +++ b/templates/admin/org/list.tmpl @@ -63,9 +63,11 @@ {{.NumTeams}} {{.NumMembers}} {{.NumRepos}} - {{DateTime "short" .CreatedUnix}} + {{DateUtils.AbsoluteShort .CreatedUnix}} {{svg "octicon-pencil"}} + {{else}} + {{ctx.Locale.Tr "repo.pulls.no_results"}} {{end}} diff --git a/templates/admin/packages/list.tmpl b/templates/admin/packages/list.tmpl index 4ff49b8c43..5f9965e34c 100644 --- a/templates/admin/packages/list.tmpl +++ b/templates/admin/packages/list.tmpl @@ -71,9 +71,11 @@ {{end}} {{ctx.Locale.TrSize .CalculateBlobSize}} - {{DateTime "short" .Version.CreatedUnix}} + {{DateUtils.AbsoluteShort .Version.CreatedUnix}} {{svg "octicon-trash"}} + {{else}} + {{ctx.Locale.Tr "repo.pulls.no_results"}} {{end}} diff --git a/templates/admin/repo/list.tmpl b/templates/admin/repo/list.tmpl index 1ea6183d80..7a75ceded7 100644 --- a/templates/admin/repo/list.tmpl +++ b/templates/admin/repo/list.tmpl @@ -82,10 +82,12 @@ {{.NumIssues}} {{ctx.Locale.TrSize .GitSize}} {{ctx.Locale.TrSize .LFSSize}} - {{DateTime "short" .UpdatedUnix}} - {{DateTime "short" .CreatedUnix}} + {{DateUtils.AbsoluteShort .UpdatedUnix}} + {{DateUtils.AbsoluteShort .CreatedUnix}} {{svg "octicon-trash"}} + {{else}} + {{ctx.Locale.Tr "repo.pulls.no_results"}} {{end}} diff --git a/templates/admin/repo/unadopted.tmpl b/templates/admin/repo/unadopted.tmpl index a33cb43a2f..a95f6b5120 100644 --- a/templates/admin/repo/unadopted.tmpl +++ b/templates/admin/repo/unadopted.tmpl @@ -54,7 +54,7 @@ - {{template "base/modal_actions_confirm" (dict "ModalButtonColors" "primary")}} + {{template "base/modal_actions_confirm"}}
      diff --git a/templates/admin/stacktrace-row.tmpl b/templates/admin/stacktrace-row.tmpl index 694bf56d96..048056cf4e 100644 --- a/templates/admin/stacktrace-row.tmpl +++ b/templates/admin/stacktrace-row.tmpl @@ -7,13 +7,15 @@ {{svg "octicon-cpu" 16}} {{else if eq .Process.Type "normal"}} {{svg "octicon-terminal" 16}} + {{else if eq .Process.Type "git"}} + {{svg "octicon-git-branch" 16}} {{else}} {{svg "octicon-code" 16}} {{end}}
{{.Process.Description}}
-
{{if ne .Process.Type "none"}}{{TimeSince .Process.Start ctx.Locale}}{{end}}
+
{{if ne .Process.Type "none"}}{{DateUtils.TimeSince .Process.Start}}{{end}}
{{if or (eq .Process.Type "request") (eq .Process.Type "normal")}} diff --git a/templates/admin/stacktrace.tmpl b/templates/admin/stacktrace.tmpl index e324570c96..afe8e6942a 100644 --- a/templates/admin/stacktrace.tmpl +++ b/templates/admin/stacktrace.tmpl @@ -8,11 +8,12 @@ {{ctx.Locale.Tr "admin.monitor.stacktrace"}}
-
-
- - {{ctx.Locale.Tr "tool.raw_seconds"}} -
+ + +
diff --git a/templates/admin/user/list.tmpl b/templates/admin/user/list.tmpl index e5d429952f..368e113d24 100644 --- a/templates/admin/user/list.tmpl +++ b/templates/admin/user/list.tmpl @@ -96,9 +96,9 @@ {{if .IsActive}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}} {{if .IsRestricted}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}} {{if index $.UsersTwoFaStatus .ID}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}} - {{DateTime "short" .CreatedUnix}} + {{DateUtils.AbsoluteShort .CreatedUnix}} {{if .LastLoginUnix}} - {{DateTime "short" .LastLoginUnix}} + {{DateUtils.AbsoluteShort .LastLoginUnix}} {{else}} {{ctx.Locale.Tr "admin.users.never_login"}} {{end}} @@ -109,6 +109,8 @@ + {{else}} + {{ctx.Locale.Tr "repo.pulls.no_results"}} {{end}} diff --git a/templates/admin/user/view_details.tmpl b/templates/admin/user/view_details.tmpl index be2f32b5ec..c394b4bd3d 100644 --- a/templates/admin/user/view_details.tmpl +++ b/templates/admin/user/view_details.tmpl @@ -26,6 +26,14 @@ {{svg "octicon-x"}} {{end}} +
+ {{ctx.Locale.Tr "admin.users.prohibit_login"}}: + {{if .User.ProhibitLogin}} + {{svg "octicon-check"}} + {{else}} + {{svg "octicon-x"}} + {{end}} +
{{ctx.Locale.Tr "admin.users.restricted"}}: {{if .User.IsRestricted}} diff --git a/templates/admin/user/view_emails.tmpl b/templates/admin/user/view_emails.tmpl index 22ce305a88..7e77206f1c 100644 --- a/templates/admin/user/view_emails.tmpl +++ b/templates/admin/user/view_emails.tmpl @@ -3,7 +3,7 @@
- {{.Email}} + {{.Email}} {{if .IsPrimary}}
{{ctx.Locale.Tr "settings.primary"}}
{{end}} diff --git a/templates/base/footer_content.tmpl b/templates/base/footer_content.tmpl index 5db7464480..133ebac33a 100644 --- a/templates/base/footer_content.tmpl +++ b/templates/base/footer_content.tmpl @@ -8,7 +8,7 @@ {{if .IsAdmin}} {{AppVer}} {{else}} - {{AppVer}} + {{AppVerNoMetadata}} {{end}} {{end}} {{if and .TemplateLoadTimes ShowFooterTemplateLoadTime}} diff --git a/templates/base/head.tmpl b/templates/base/head.tmpl index 7753f49243..7ec2ac87b3 100644 --- a/templates/base/head.tmpl +++ b/templates/base/head.tmpl @@ -20,12 +20,7 @@ {{template "base/head_script" .}} - + {{template "shared/user/mention_highlight" .}} {{template "base/head_opengraph" .}} {{template "base/head_style" .}} {{template "custom/header" .}} diff --git a/templates/base/head_navbar.tmpl b/templates/base/head_navbar.tmpl index ba17222f9b..0c13f9e844 100644 --- a/templates/base/head_navbar.tmpl +++ b/templates/base/head_navbar.tmpl @@ -194,11 +194,13 @@ {{else}} {{if .ShowRegistrationButton}} - {{svg "octicon-person"}} {{ctx.Locale.Tr "register"}} + {{svg "octicon-person" 16 "tw-mr-1"}} + {{ctx.Locale.Tr "register"}} {{end}} - {{svg "octicon-sign-in"}} {{ctx.Locale.Tr "sign_in"}} + {{svg "octicon-sign-in" 16 "tw-mr-1"}} + {{ctx.Locale.Tr "sign_in"}} {{end}}
diff --git a/templates/base/head_opengraph.tmpl b/templates/base/head_opengraph.tmpl index 292c3bdd92..7f6eae3f49 100644 --- a/templates/base/head_opengraph.tmpl +++ b/templates/base/head_opengraph.tmpl @@ -1,53 +1,37 @@ -{{- /* og:description - a one to two sentence description of your object, maybe it only needs at most 300 bytes */ -}} -{{if .PageIsUserProfile}} - - - - - {{if .ContextUser.Description}} - - {{end}} -{{else if .Repository}} - {{if .Issue}} - - - {{if .Issue.Content}} - - {{end}} - {{else if or .PageIsDiff .IsViewFile}} - - - {{if and .PageIsDiff .Commit}} - {{- $commitMessageParts := StringUtils.Cut .Commit.Message "\n" -}} - {{- $commitMessageBody := index $commitMessageParts 1 -}} - {{- if $commitMessageBody -}} - - {{- end -}} - {{end}} - {{else if .Pages}} - - - {{if .Repository.Description}} - - {{end}} - {{else}} - - - {{if .Repository.Description}} - - {{end}} - {{end}} - - {{if (.Repository.AvatarLink ctx)}} - - {{else}} - - {{end}} +{{- /* See https://ogp.me for specification */ -}} +{{if .OpenGraphTitle}} + +{{else if .Title}} + {{else}} +{{end}} +{{- /* og:description - a one to two sentence description of your object, maybe it only needs at most 300 bytes */ -}} +{{if and .OpenGraphDescription (not .OpenGraphNoDescription)}} + +{{end}} +{{if .OpenGraphURL}} + +{{else}} + +{{end}} +{{if .OpenGraphType}} + +{{else}} - - - +{{end}} +{{if .OpenGraphImageURL}} + + {{if .OpenGraphImageWidth}} + + {{end}} + {{if .OpenGraphImageHeight}} + + {{end}} + {{if .OpenGraphImageAltText}} + + {{end}} +{{else}} + {{end}} diff --git a/templates/base/head_script.tmpl b/templates/base/head_script.tmpl index 22e08e9c8f..d2774010b6 100644 --- a/templates/base/head_script.tmpl +++ b/templates/base/head_script.tmpl @@ -42,6 +42,7 @@ If you introduce mistakes in it, Gitea JavaScript code wouldn't run correctly. modal_confirm: {{ctx.Locale.Tr "modal.confirm"}}, modal_cancel: {{ctx.Locale.Tr "modal.cancel"}}, more_items: {{ctx.Locale.Tr "more_items"}}, + incorrect_root_url: {{ctx.Locale.Tr "incorrect_root_url" AppUrl}}, }, }; {{/* in case some pages don't render the pageData, we make sure it is an object to prevent null access */}} diff --git a/templates/base/modal_actions_confirm.tmpl b/templates/base/modal_actions_confirm.tmpl index c44320deff..8c4e346088 100644 --- a/templates/base/modal_actions_confirm.tmpl +++ b/templates/base/modal_actions_confirm.tmpl @@ -1,7 +1,6 @@ {{/* Two buttons (negative, positive): * ModalButtonTypes: "yes" (default) or "confirm" -* ModalButtonColors: "primary" (default) / "blue" / "yellow" * ModalButtonCancelText * ModalButtonOkText @@ -23,13 +22,7 @@ The ".ok.button" and ".cancel.button" selectors are also used by Fomantic Modal {{if .ModalButtonCancelText}}{{$textNegitive = .ModalButtonCancelText}}{{end}} {{if .ModalButtonOkText}}{{$textPositive = .ModalButtonOkText}}{{end}} - {{$stylePositive := "primary"}} - {{if eq .ModalButtonColors "blue"}} - {{$stylePositive = "blue"}} - {{else if eq .ModalButtonColors "yellow"}} - {{$stylePositive = "yellow"}} - {{end}} - + {{end}}
diff --git a/templates/base/paginate.tmpl b/templates/base/paginate.tmpl index 2ca72f6a34..253892c009 100644 --- a/templates/base/paginate.tmpl +++ b/templates/base/paginate.tmpl @@ -17,7 +17,7 @@ {{if eq .Num -1}} ... {{else}} - {{.Num}} + {{.Num}} {{end}} {{end}} diff --git a/templates/devtest/fomantic-modal.tmpl b/templates/devtest/fomantic-modal.tmpl index 5cd36721a7..5b94afc4f1 100644 --- a/templates/devtest/fomantic-modal.tmpl +++ b/templates/devtest/fomantic-modal.tmpl @@ -54,18 +54,6 @@ {{template "base/modal_actions_confirm" (dict "ModalButtonTypes" "confirm")}}
- - - - {{end}} -
{{ctx.Locale.Tr "org.repo_updated" (TimeSinceUnix .UpdatedUnix ctx.Locale)}}
+
{{ctx.Locale.Tr "org.repo_updated" (DateUtils.TimeSince .UpdatedUnix)}}
{{else}} diff --git a/templates/explore/user_list.tmpl b/templates/explore/user_list.tmpl index f2cf939ffb..4cfb6c9bf5 100644 --- a/templates/explore/user_list.tmpl +++ b/templates/explore/user_list.tmpl @@ -8,7 +8,7 @@
{{template "shared/user/name" .}} {{if .Visibility.IsPrivate}} - {{ctx.Locale.Tr "repo.desc.private"}} + {{ctx.Locale.Tr "repo.desc.private"}} {{end}}
@@ -21,7 +21,7 @@ {{.Email}} {{end}} - {{svg "octicon-calendar"}}{{ctx.Locale.Tr "user.joined_on" (DateTime "short" .CreatedUnix)}} + {{svg "octicon-calendar"}}{{ctx.Locale.Tr "user.joined_on" (DateUtils.AbsoluteShort .CreatedUnix)}}
diff --git a/templates/home.tmpl b/templates/home.tmpl index 11e2ea06c3..168bfbefa6 100644 --- a/templates/home.tmpl +++ b/templates/home.tmpl @@ -11,41 +11,6 @@ -
-
-

- {{svg "octicon-flame"}} {{ctx.Locale.Tr "startpage.install"}} -

-

- {{ctx.Locale.Tr "startpage.install_desc" "https://forgejo.org/download/#installation-from-binary" "https://forgejo.org/download/#container-image" "https://forgejo.org/download"}} -

-
-
-

- {{svg "octicon-device-desktop"}} {{ctx.Locale.Tr "startpage.platform"}} -

-

- {{ctx.Locale.Tr "startpage.platform_desc" "https://go.dev/"}} -

-
-
-
-
-

- {{svg "octicon-rocket"}} {{ctx.Locale.Tr "startpage.lightweight"}} -

-

- {{ctx.Locale.Tr "startpage.lightweight_desc"}} -

-
-
-

- {{svg "octicon-code"}} {{ctx.Locale.Tr "startpage.license"}} -

-

- {{ctx.Locale.Tr "startpage.license_desc" "https://forgejo.org/download" "https://codeberg.org/forgejo/forgejo"}} -

-
-
+ {{template "home_forgejo" .}} {{template "base/footer" .}} diff --git a/templates/home_forgejo.tmpl b/templates/home_forgejo.tmpl new file mode 100644 index 0000000000..d5d18c794b --- /dev/null +++ b/templates/home_forgejo.tmpl @@ -0,0 +1,36 @@ +
+
+

+ {{svg "octicon-flame"}} {{ctx.Locale.Tr "startpage.install"}} +

+

+ {{ctx.Locale.Tr "startpage.install_desc" "https://forgejo.org/download/#installation-from-binary" "https://forgejo.org/download/#container-image" "https://forgejo.org/download"}} +

+
+
+

+ {{svg "octicon-device-desktop"}} {{ctx.Locale.Tr "startpage.platform"}} +

+

+ {{ctx.Locale.Tr "startpage.platform_desc"}} +

+
+
+
+
+

+ {{svg "octicon-rocket"}} {{ctx.Locale.Tr "startpage.lightweight"}} +

+

+ {{ctx.Locale.Tr "startpage.lightweight_desc"}} +

+
+
+

+ {{svg "octicon-code"}} {{ctx.Locale.Tr "startpage.license"}} +

+

+ {{ctx.Locale.Tr "startpage.license_desc" "https://forgejo.org/download" "https://codeberg.org/forgejo/forgejo"}} +

+
+
diff --git a/templates/install.tmpl b/templates/install.tmpl index ae800df130..7a9b40826f 100644 --- a/templates/install.tmpl +++ b/templates/install.tmpl @@ -363,5 +363,5 @@ - +{{ctx.Locale.Tr {{template "base/footer" .}} diff --git a/templates/org/header.tmpl b/templates/org/header.tmpl index 494dedf67a..4359b819a1 100644 --- a/templates/org/header.tmpl +++ b/templates/org/header.tmpl @@ -5,8 +5,8 @@
{{.Org.DisplayName}} - {{if .Org.Visibility.IsLimited}}{{ctx.Locale.Tr "org.settings.visibility.limited_shortname"}}{{end}} - {{if .Org.Visibility.IsPrivate}}{{ctx.Locale.Tr "org.settings.visibility.private_shortname"}}{{end}} + {{if .Org.Visibility.IsLimited}}{{ctx.Locale.Tr "org.settings.visibility.limited_shortname"}}{{end}} + {{if .Org.Visibility.IsPrivate}}{{ctx.Locale.Tr "org.settings.visibility.private_shortname"}}{{end}}
diff --git a/templates/org/home.tmpl b/templates/org/home.tmpl index 3ae5f01d04..a4fafc3432 100644 --- a/templates/org/home.tmpl +++ b/templates/org/home.tmpl @@ -23,7 +23,7 @@ {{if .CanCreateOrgRepo}}
{{ctx.Locale.Tr "new_repo.link"}} - {{if not .DisableNewPullMirrors}} + {{if not .DisableMigrations}} {{ctx.Locale.Tr "new_migrate.link"}} {{end}}
diff --git a/templates/org/member/members.tmpl b/templates/org/member/members.tmpl index 4388dc9520..dccf588f6a 100644 --- a/templates/org/member/members.tmpl +++ b/templates/org/member/members.tmpl @@ -15,7 +15,7 @@
{{template "shared/user/name" .}} {{if not $isPublic}} - {{ctx.Locale.Tr "org.members.private"}} + {{ctx.Locale.Tr "org.members.private"}} {{end}}
{{if not $.PublicOnly}} diff --git a/templates/org/projects/view.tmpl b/templates/org/projects/view.tmpl index e1ab81c4cd..bd74114fe2 100644 --- a/templates/org/projects/view.tmpl +++ b/templates/org/projects/view.tmpl @@ -1,9 +1,13 @@ {{template "base/head" .}} -
- {{template "shared/user/org_profile_avatar" .}} -
- {{template "user/overview/header" .}} -
+
+ {{if .ContextUser.IsOrganization}} + {{template "org/header" .}} + {{else}} + {{template "shared/user/org_profile_avatar" .}} +
+ {{template "user/overview/header" .}} +
+ {{end}}
{{template "projects/view" .}}
diff --git a/templates/org/settings/blocked_users.tmpl b/templates/org/settings/blocked_users.tmpl index f685a1b998..d139276b55 100644 --- a/templates/org/settings/blocked_users.tmpl +++ b/templates/org/settings/blocked_users.tmpl @@ -1,5 +1,8 @@ {{template "org/settings/layout_head" (dict "ctxData" . "pageClass" "organization settings blocked-users")}}
+

+ {{ctx.Locale.Tr "settings.blocked_users"}} +

{{.CsrfTokenHtml}} diff --git a/templates/org/settings/navbar.tmpl b/templates/org/settings/navbar.tmpl index b245768203..4ae7f56aca 100644 --- a/templates/org/settings/navbar.tmpl +++ b/templates/org/settings/navbar.tmpl @@ -38,9 +38,14 @@
{{end}} - + {{ctx.Locale.Tr "settings.blocked_users"}} + {{if .EnableQuota}} + + {{ctx.Locale.Tr "settings.storage_overview"}} + + {{end}} {{ctx.Locale.Tr "org.settings.delete"}} diff --git a/templates/org/settings/options.tmpl b/templates/org/settings/options.tmpl index 62debfc0ae..2ef7031aef 100644 --- a/templates/org/settings/options.tmpl +++ b/templates/org/settings/options.tmpl @@ -6,14 +6,18 @@
{{.CsrfTokenHtml}} -
- +
+ + {{ctx.Locale.Tr "org.settings.change_orgname_prompt"}} + {{if gt .CooldownPeriod 0}} + {{ctx.Locale.TrN .CooldownPeriod "org.settings.change_orgname_redirect_prompt.with_cooldown.one" "org.settings.change_orgname_redirect_prompt.with_cooldown.few" .CooldownPeriod}} + {{else}} + {{ctx.Locale.Tr "org.settings.change_orgname_redirect_prompt"}} + {{end}} + +
diff --git a/templates/org/settings/storage_overview.tmpl b/templates/org/settings/storage_overview.tmpl new file mode 100644 index 0000000000..e3f8c53152 --- /dev/null +++ b/templates/org/settings/storage_overview.tmpl @@ -0,0 +1,5 @@ +{{template "org/settings/layout_head" (dict "ctxData" . "pageClass" "organization settings size-overview")}} +
+ {{template "shared/quota_overview" .}} +
+{{template "org/settings/layout_footer" .}} diff --git a/templates/package/content/alt.tmpl b/templates/package/content/alt.tmpl new file mode 100644 index 0000000000..9a5e9c7656 --- /dev/null +++ b/templates/package/content/alt.tmpl @@ -0,0 +1,49 @@ +{{if eq .PackageDescriptor.Package.Type "alt"}} +

{{ctx.Locale.Tr "packages.installation"}}

+
+
+
+ +
{{- if gt (len .Groups) 1 -}}
+# {{ctx.Locale.Tr "packages.alt.repository.multiple_groups"}}
+
+{{end -}}
+# {{ctx.Locale.Tr "packages.alt.setup"}}
+{{- range $group := .Groups}}
+	{{- if $group}}{{$group = print "/" $group}}{{end}}
+apt-repo add rpm  _arch_ classic
+
+{{- end}}
+
+
+ +
+
# {{ctx.Locale.Tr "packages.alt.registry.install"}}
+apt-get update
+apt-get install {{$.PackageDescriptor.Package.Name}}
+
+
+
+ +
+
+
+ +

{{ctx.Locale.Tr "packages.alt.repository"}}

+
+ + + + + + + +
{{ctx.Locale.Tr "packages.alt.repository.architectures"}}
{{StringUtils.Join .Architectures ", "}}
+
+ + {{if or .PackageDescriptor.Metadata.Summary .PackageDescriptor.Metadata.Description}} +

{{ctx.Locale.Tr "packages.about"}}

+ {{if .PackageDescriptor.Metadata.Summary}}
{{.PackageDescriptor.Metadata.Summary}}
{{end}} + {{if .PackageDescriptor.Metadata.Description}}
{{.PackageDescriptor.Metadata.Description}}
{{end}} + {{end}} +{{end}} diff --git a/templates/package/content/arch.tmpl b/templates/package/content/arch.tmpl index bcc24b585b..6a041d323b 100644 --- a/templates/package/content/arch.tmpl +++ b/templates/package/content/arch.tmpl @@ -16,16 +16,16 @@ pacman-key --lsign-key '{{$.SignMail}}'

 {{- if gt (len $.Groups) 1 -}}
-# {{ctx.Locale.Tr "packages.arch.pacman.repo.multi"  $.PackageDescriptor.Package.LowerName}}
+# {{ctx.Locale.Tr "packages.arch.pacman.repo.multi" $.PackageDescriptor.Package.LowerName}}
 
 {{end -}}
 {{- $GroupSize := (len .Groups) -}}
-{{-  range $i,$v :=  .Groups -}}
+{{-  range $i,$v := .Groups -}}
 {{- if gt $i 0}}
 {{end -}}{{- if gt $GroupSize 1 -}}
 # {{ctx.Locale.Tr "packages.arch.pacman.repo.multi.item" .}}
 {{end -}}
-[{{$.PackageDescriptor.Owner.LowerName}}.{{$.RegistryHost}}]
+[{{$.PackageDescriptor.Owner.LowerName}}.{{$.PackageRegistryHost}}]
 SigLevel = Required
 Server = 
 {{end -}}
diff --git a/templates/package/content/container.tmpl b/templates/package/content/container.tmpl
index b5fdcfeb1b..dd1c24269b 100644
--- a/templates/package/content/container.tmpl
+++ b/templates/package/content/container.tmpl
@@ -5,13 +5,13 @@
 			
{{if eq .PackageDescriptor.Metadata.Type "helm"}} -
helm pull oci://{{.RegistryHost}}/{{.PackageDescriptor.Owner.LowerName}}/{{.PackageDescriptor.Package.LowerName}} --version {{.PackageDescriptor.Version.LowerVersion}}
+
helm pull oci://{{.PackageRegistryHost}}/{{.PackageDescriptor.Owner.LowerName}}/{{.PackageDescriptor.Package.LowerName}} --version {{.PackageDescriptor.Version.LowerVersion}}
{{else}} {{$separator := ":"}} {{if not .PackageDescriptor.Metadata.IsTagged}} {{$separator = "@"}} {{end}} -
docker pull {{.RegistryHost}}/{{.PackageDescriptor.Owner.LowerName}}/{{.PackageDescriptor.Package.LowerName}}{{$separator}}{{.PackageDescriptor.Version.LowerVersion}}
+
docker pull {{.PackageRegistryHost}}/{{.PackageDescriptor.Owner.LowerName}}/{{.PackageDescriptor.Package.LowerName}}{{$separator}}{{.PackageDescriptor.Version.LowerVersion}}
{{end}}
@@ -24,7 +24,7 @@
{{if .PackageDescriptor.Metadata.Manifests}} -

{{ctx.Locale.Tr "packages.container.multi_arch"}}

+

{{ctx.Locale.Tr "packages.container.images.title"}}

@@ -36,11 +36,13 @@ {{range .PackageDescriptor.Metadata.Manifests}} - + {{if ne .Platform "unknown/unknown"}} + - + + {{end}} {{end}}
{{.Digest}} {{.Platform}} {{ctx.Locale.TrSize .Size}}
diff --git a/templates/package/content/nuget.tmpl b/templates/package/content/nuget.tmpl index ea665c7bbc..c8568845f1 100644 --- a/templates/package/content/nuget.tmpl +++ b/templates/package/content/nuget.tmpl @@ -35,11 +35,12 @@ + {{$tooltipSearchInNuget := ctx.Locale.Tr "packages.search_in_external_registry" "nuget.org"}} {{range $framework, $dependencies := .PackageDescriptor.Metadata.Dependencies}} {{range $dependencies}} - {{.ID}} - {{.Version}} + {{.ID}} {{svg "octicon-link-external"}} + {{.Version}} {{svg "octicon-link-external"}} {{$framework}} {{end}} diff --git a/templates/package/metadata/alt.tmpl b/templates/package/metadata/alt.tmpl new file mode 100644 index 0000000000..16fb52e9b1 --- /dev/null +++ b/templates/package/metadata/alt.tmpl @@ -0,0 +1,4 @@ +{{if eq .PackageDescriptor.Package.Type "alt"}} + {{if .PackageDescriptor.Metadata.ProjectURL}}
{{svg "octicon-link-external" 16 "tw-mr-2"}} {{ctx.Locale.Tr "packages.details.project_site"}}
{{end}} + {{if .PackageDescriptor.Metadata.License}}
{{svg "octicon-law" 16 "tw-mr-2"}} {{.PackageDescriptor.Metadata.License}}
{{end}} +{{end}} diff --git a/templates/package/metadata/arch.tmpl b/templates/package/metadata/arch.tmpl index 822973eb7d..89001b979c 100644 --- a/templates/package/metadata/arch.tmpl +++ b/templates/package/metadata/arch.tmpl @@ -1,4 +1,4 @@ {{if eq .PackageDescriptor.Package.Type "arch"}} - {{range .PackageDescriptor.Metadata.License}}
{{svg "octicon-law" 16 "gt-mr-3"}} {{.}}
{{end}} - {{if .PackageDescriptor.Metadata.ProjectURL}}
{{svg "octicon-link-external" 16 "mr-3"}} {{ctx.Locale.Tr "packages.details.project_site"}}
{{end}} + {{if .PackageDescriptor.Metadata.ProjectURL}}
{{svg "octicon-link-external" 16 "tw-mr-2"}} {{ctx.Locale.Tr "packages.details.project_site"}}
{{end}} + {{range .PackageDescriptor.Metadata.License}}
{{svg "octicon-law" 16 "tw-mr-2"}} {{.}}
{{end}} {{end}} diff --git a/templates/package/shared/cleanup_rules/preview.tmpl b/templates/package/shared/cleanup_rules/preview.tmpl index 0d9c4b0d46..da034fec7a 100644 --- a/templates/package/shared/cleanup_rules/preview.tmpl +++ b/templates/package/shared/cleanup_rules/preview.tmpl @@ -22,7 +22,7 @@ {{.Version.Version}} {{.Creator.Name}} {{ctx.Locale.TrSize .CalculateBlobSize}} - {{DateTime "short" .Version.CreatedUnix}} + {{DateUtils.AbsoluteShort .Version.CreatedUnix}} {{else}} diff --git a/templates/package/shared/list.tmpl b/templates/package/shared/list.tmpl index 36f8bc1522..19b41d0bc8 100644 --- a/templates/package/shared/list.tmpl +++ b/templates/package/shared/list.tmpl @@ -24,7 +24,7 @@ {{svg .Package.Type.SVGName 16}} {{.Package.Type.Name}}
- {{$timeStr := TimeSinceUnix .Version.CreatedUnix ctx.Locale}} + {{$timeStr := DateUtils.TimeSince .Version.CreatedUnix}} {{$hasRepositoryAccess := false}} {{if .Repository}} {{$hasRepositoryAccess = index $.RepositoryAccessMap .Repository.ID}} diff --git a/templates/package/shared/versionlist.tmpl b/templates/package/shared/versionlist.tmpl index e5c568e059..7a1059e262 100644 --- a/templates/package/shared/versionlist.tmpl +++ b/templates/package/shared/versionlist.tmpl @@ -25,7 +25,7 @@
{{.Version.LowerVersion}}
- {{ctx.Locale.Tr "packages.published_by" (TimeSinceUnix .Version.CreatedUnix ctx.Locale) .Creator.HomeLink .Creator.GetDisplayName}} + {{ctx.Locale.Tr "packages.published_by" (DateUtils.TimeSince .Version.CreatedUnix) .Creator.HomeLink .Creator.GetDisplayName}}
diff --git a/templates/package/view.tmpl b/templates/package/view.tmpl index fe88e54317..18220e904b 100644 --- a/templates/package/view.tmpl +++ b/templates/package/view.tmpl @@ -8,7 +8,7 @@

{{.PackageDescriptor.Package.Name}} ({{.PackageDescriptor.Version.Version}})

- {{$timeStr := TimeSinceUnix .PackageDescriptor.Version.CreatedUnix ctx.Locale}} + {{$timeStr := DateUtils.TimeSince .PackageDescriptor.Version.CreatedUnix}} {{if .HasRepositoryAccess}} {{ctx.Locale.Tr "packages.published_by_in" $timeStr .PackageDescriptor.Creator.HomeLink .PackageDescriptor.Creator.GetDisplayName .PackageDescriptor.Repository.Link .PackageDescriptor.Repository.FullName}} {{else}} @@ -37,6 +37,7 @@ {{template "package/content/pub" .}} {{template "package/content/pypi" .}} {{template "package/content/rpm" .}} + {{template "package/content/alt" .}} {{template "package/content/rubygems" .}} {{template "package/content/swift" .}} {{template "package/content/vagrant" .}} @@ -48,7 +49,7 @@ {{if .HasRepositoryAccess}}
{{svg "octicon-repo" 16 "tw-mr-2"}} {{.PackageDescriptor.Repository.FullName}}
{{end}} -
{{svg "octicon-calendar" 16 "tw-mr-2"}} {{TimeSinceUnix .PackageDescriptor.Version.CreatedUnix ctx.Locale}}
+
{{svg "octicon-calendar" 16 "tw-mr-2"}} {{DateUtils.TimeSince .PackageDescriptor.Version.CreatedUnix}}
{{svg "octicon-download" 16 "tw-mr-2"}} {{.PackageDescriptor.Version.DownloadCount}}
{{template "package/metadata/alpine" .}} {{template "package/metadata/arch" .}} @@ -68,6 +69,7 @@ {{template "package/metadata/pub" .}} {{template "package/metadata/pypi" .}} {{template "package/metadata/rpm" .}} + {{template "package/metadata/alt" .}} {{template "package/metadata/rubygems" .}} {{template "package/metadata/swift" .}} {{template "package/metadata/vagrant" .}} @@ -94,7 +96,7 @@ {{range .LatestVersions}}
{{.Version}} - {{DateTime "short" .CreatedUnix}} + {{DateUtils.AbsoluteShort .CreatedUnix}}
{{end}}
diff --git a/templates/projects/list.tmpl b/templates/projects/list.tmpl index b892cff996..8c9b7c6e6f 100644 --- a/templates/projects/list.tmpl +++ b/templates/projects/list.tmpl @@ -1,12 +1,12 @@ {{if and $.CanWriteProjects (not $.Repository.IsArchived)}}
-
{{if .Verification.Verified}} + {{svg "octicon-verified" 16 "tw-mr-2"}} {{if ne .Verification.SigningUser.ID 0}} - {{svg "octicon-verified" 16 "tw-mr-2"}} {{if .Verification.SigningSSHKey}} {{ctx.Locale.Tr "repo.commits.ssh_key_fingerprint"}}: {{.Verification.SigningSSHKey.Fingerprint}} @@ -221,7 +227,6 @@ {{.Verification.SigningKey.PaddedKeyID}} {{end}} {{else}} - {{svg "octicon-unverified" 16 "tw-mr-2"}} {{if .Verification.SigningSSHKey}} {{ctx.Locale.Tr "repo.commits.ssh_key_fingerprint"}}: {{.Verification.SigningSSHKey.Fingerprint}} @@ -259,7 +264,7 @@
{{end}} {{if .NoteRendered}} -
+
{{svg "octicon-note" 16 "tw-mr-2"}} {{ctx.Locale.Tr "repo.diff.git-notes"}}: {{if .NoteAuthor}} @@ -273,11 +278,61 @@ {{else}} {{.NoteCommit.Author.Name}} {{end}} - {{TimeSince .NoteCommit.Author.When ctx.Locale}} + {{DateUtils.TimeSince .NoteCommit.Author.When}} + {{if and ($.Permission.CanWrite $.UnitTypeCode) (not $.Repository.IsArchived) (not .IsDeleted)}} +
+ + +
+ + {{end}}
-
+
{{.NoteRendered | SanitizeHTML}}
+ {{if and ($.Permission.CanWrite $.UnitTypeCode) (not $.Repository.IsArchived) (not .IsDeleted)}} +
+
+ {{.CsrfTokenHtml}} + +
+ +
+ +
+ +
+
+
+ {{end}} + {{else if and ($.Permission.CanWrite $.UnitTypeCode) (not $.Repository.IsArchived) (not .IsDeleted)}} +
+
+ {{.CsrfTokenHtml}} + +
+ +
+ +
+ +
+
+
{{end}} {{template "repo/diff/box" .}}
diff --git a/templates/repo/commits_list.tmpl b/templates/repo/commits_list.tmpl index c8c695e332..a9015e6089 100644 --- a/templates/repo/commits_list.tmpl +++ b/templates/repo/commits_list.tmpl @@ -74,13 +74,21 @@ {{end}} {{if .Committer}} - {{TimeSince .Committer.When ctx.Locale}} + {{DateUtils.TimeSince .Committer.When}} {{else}} - {{TimeSince .Author.When ctx.Locale}} + {{DateUtils.TimeSince .Author.When}} {{end}} {{if not $.PageIsWiki}} + {{if $.FileName}} + + {{svg "octicon-file-diff"}} + + {{end}} {{ctx.Locale.TrN .MaxCreationLimit "repo.form.reach_limit_of_creation_1" "repo.form.reach_limit_of_creation_n" .MaxCreationLimit}}

{{end}} -
- - - {{ctx.Locale.Tr "repo.owner_helper"}} -
+
+ {{template "repo/create_basic" .}} +
-
- - - {{ctx.Locale.Tr "repo.repo_name_helper"}} -
-
- -
- - -
- {{if .IsForcedPrivate}} - {{ctx.Locale.Tr "repo.visibility_helper_forced"}} - {{end}} - {{ctx.Locale.Tr "repo.visibility_description"}} -
-
- - -
-
- - -
- -
-
- -
- - -
-
- - -
-
-
- -
- - -
-
- - -
-
-
- -
- - -
-
- - -
-
-
- -
- - -
-
-
+
+ + {{ctx.Locale.Tr "repo.new_from_template"}} + {{ctx.Locale.Tr "repo.new_from_template_description"}} + + {{template "repo/create_from_template" .}} +
-
- - -
+
+ {{ctx.Locale.Tr "repo.auto_init"}} + {{template "repo/create_init" .}} +
-
- -
- - - {{ctx.Locale.Tr "repo.repo_gitignore_helper_desc"}} -
-
- - - {{ctx.Locale.Tr "repo.license_helper_desc" "https://choosealicense.com/"}} -
- -
- - - {{ctx.Locale.Tr "repo.readme_helper_desc"}} -
-
-
- - -
-
-
- - - {{ctx.Locale.Tr "repo.default_branch_helper"}} -
-
- - - {{ctx.Locale.Tr "repo.object_format_helper"}} -
-
- -
- - -
-
-
-
-
- - +
+ {{ctx.Locale.Tr "repo.new_advanced"}} +
{{ctx.Locale.Tr "repo.new_advanced_expand"}} + {{template "repo/create_advanced" .}} +
+
+
diff --git a/templates/repo/create_advanced.tmpl b/templates/repo/create_advanced.tmpl new file mode 100644 index 0000000000..c0274701f8 --- /dev/null +++ b/templates/repo/create_advanced.tmpl @@ -0,0 +1,45 @@ + + +{{$supportedFormatsLength := len .SupportedObjectFormats}} +{{/* Only offer object format selection if there is an actual choice */}} +{{if ge $supportedFormatsLength 2}} + +{{else}} + +{{end}} + + + + diff --git a/templates/repo/create_basic.tmpl b/templates/repo/create_basic.tmpl new file mode 100644 index 0000000000..0396629fef --- /dev/null +++ b/templates/repo/create_basic.tmpl @@ -0,0 +1,47 @@ + + + + diff --git a/templates/repo/create_from_template.tmpl b/templates/repo/create_from_template.tmpl new file mode 100644 index 0000000000..47cda3df02 --- /dev/null +++ b/templates/repo/create_from_template.tmpl @@ -0,0 +1,49 @@ + +{{/* If the dropdown is inside the label, the focus works correctly and it is more accessible. + However, the Javascript takes the focus and opens the dropdown again immediately after closing. + When the user interacts (via mouse or keyboard), the dropdown closes again. + Due to the fieldset legend, this solutions is probably acceptable until the dropdown can be fixed properly. */}} + + +
+ {{ctx.Locale.Tr "repo.template.items"}} + + + + + + + + +
diff --git a/templates/repo/create_init.tmpl b/templates/repo/create_init.tmpl new file mode 100644 index 0000000000..729b44c8e6 --- /dev/null +++ b/templates/repo/create_init.tmpl @@ -0,0 +1,56 @@ + + +
+ + + + + {{$supportedReadmesLength := len .Readmes}} + {{/* Only offer README selection if there is an actual choice */}} + {{if ge $supportedReadmesLength 2}} + + {{else}} + + {{end}} +
diff --git a/templates/repo/diff/box.tmpl b/templates/repo/diff/box.tmpl index 230e49752f..e24c880746 100644 --- a/templates/repo/diff/box.tmpl +++ b/templates/repo/diff/box.tmpl @@ -85,7 +85,6 @@ diffFileInfo.files.push(...diffDataFiles); window.config.pageData.diffFileInfo = diffFileInfo; -
{{end}}
{{if $showFileTree}} @@ -130,7 +129,7 @@
{{if $file.IsRenamed}}{{$file.OldName}} → {{end}}{{$file.Name}} {{if .IsLFSFile}} ({{ctx.Locale.Tr "repo.stored_lfs"}}){{end}} - + {{if $file.IsGenerated}} {{ctx.Locale.Tr "repo.diff.generated"}} {{end}} @@ -248,8 +247,8 @@ {{end}}
- - + +
diff --git a/templates/repo/diff/comment_form.tmpl b/templates/repo/diff/comment_form.tmpl index 856b3da01a..bb29583059 100644 --- a/templates/repo/diff/comment_form.tmpl +++ b/templates/repo/diff/comment_form.tmpl @@ -31,7 +31,6 @@ {{if $.reply}} - {{else}} {{if $.root.CurrentReview}} diff --git a/templates/repo/diff/comments.tmpl b/templates/repo/diff/comments.tmpl index 2e0c85d0a1..3128149c75 100644 --- a/templates/repo/diff/comments.tmpl +++ b/templates/repo/diff/comments.tmpl @@ -1,6 +1,6 @@ {{range .comments}} -{{$createdStr:= TimeSinceUnix .CreatedUnix ctx.Locale}} +{{$createdStr:= DateUtils.TimeSince .CreatedUnix}}
{{if .OriginalAuthor}} {{ctx.AvatarUtils.Avatar nil}} @@ -33,19 +33,15 @@
{{if .Invalidated}} {{$referenceUrl := printf "%s#%s" $.root.Issue.Link .HashTag}} - + {{ctx.Locale.Tr "repo.issues.review.outdated"}} {{end}} {{if and .Review}} {{if eq .Review.Type 0}} -
+
{{ctx.Locale.Tr "repo.issues.review.pending"}}
- {{else}} -
- {{ctx.Locale.Tr "repo.issues.review.review"}} -
{{end}} {{end}} {{template "repo/issue/view_content/add_reaction" dict "ctxData" $.root "ActionURL" (printf "%s/comments/%d/reactions" $.root.RepoLink .ID)}} @@ -53,7 +49,7 @@
-
+
{{if .RenderedContent}} {{.RenderedContent}} {{else}} diff --git a/templates/repo/diff/compare.tmpl b/templates/repo/diff/compare.tmpl index 110f8ac60b..c1b00c5f9e 100644 --- a/templates/repo/diff/compare.tmpl +++ b/templates/repo/diff/compare.tmpl @@ -39,21 +39,13 @@ {{svg "octicon-filter" 16}}
-
- + -
- + + {{else}} +
+ {{ctx.Locale.Tr "repo.pulls.sign_in_require" .SignInLink}} +
{{end}} {{if $.IsSigned}}
diff --git a/templates/repo/diff/conversation.tmpl b/templates/repo/diff/conversation.tmpl index c80d999f47..9753bd80e1 100644 --- a/templates/repo/diff/conversation.tmpl +++ b/templates/repo/diff/conversation.tmpl @@ -14,7 +14,7 @@ We only handle the case $resolved=true and $invalid=true in this template because if the comment is not resolved it has the outdated label in the comments area (not the header above). The case $resolved=false and $invalid=true is handled in repo/diff/comments.tmpl --> - + {{ctx.Locale.Tr "repo.issues.review.outdated"}} {{end}} diff --git a/templates/repo/diff/image_diff.tmpl b/templates/repo/diff/image_diff.tmpl index 0612854609..a793f54da1 100644 --- a/templates/repo/diff/image_diff.tmpl +++ b/templates/repo/diff/image_diff.tmpl @@ -22,7 +22,7 @@ {{if .blobBase}}

{{ctx.Locale.Tr "repo.diff.file_before"}}

- +

{{ctx.Locale.Tr "repo.diff.file_image_width"}}: @@ -37,7 +37,7 @@ {{if .blobHead}}

{{ctx.Locale.Tr "repo.diff.file_after"}}

- +

{{ctx.Locale.Tr "repo.diff.file_image_width"}}: @@ -55,9 +55,9 @@

- + {{ctx.Locale.Tr - + {{ctx.Locale.Tr @@ -70,8 +70,8 @@
- - + {{ctx.Locale.Tr + {{ctx.Locale.Tr
diff --git a/templates/repo/diff/new_review.tmpl b/templates/repo/diff/new_review.tmpl index a2eae007a5..13d09babe1 100644 --- a/templates/repo/diff/new_review.tmpl +++ b/templates/repo/diff/new_review.tmpl @@ -1,9 +1,16 @@
- +
+ +
{{if $.IsShowingAllCommits}}
diff --git a/templates/repo/diff/options_dropdown.tmpl b/templates/repo/diff/options_dropdown.tmpl index 09b7b80e41..44b0743e09 100644 --- a/templates/repo/diff/options_dropdown.tmpl +++ b/templates/repo/diff/options_dropdown.tmpl @@ -1,7 +1,6 @@ @@ -157,6 +163,22 @@ {{else if .IsBlame}} {{template "repo/blame" .}} {{else}}{{/* IsViewDirectory */}} + {{/* display the search bar only if */}} + {{$isCommit := StringUtils.HasPrefix .BranchNameSubURL "commit"}} + {{if and (not $isCommit) (or .CodeIndexerDisabled (and (not .TagName) (eq .Repository.DefaultBranch .BranchName)))}} + + {{end}} {{template "repo/view_list" .}} {{end}}
diff --git a/templates/repo/issue/card.tmpl b/templates/repo/issue/card.tmpl index 0b255d6705..c29c14a54b 100644 --- a/templates/repo/issue/card.tmpl +++ b/templates/repo/issue/card.tmpl @@ -24,7 +24,7 @@
{{if not $.Page.Repository}}{{.Repo.FullName}}{{end}}#{{.Index}} - {{$timeStr := TimeSinceUnix .GetLastEventTimestamp ctx.Locale}} + {{$timeStr := DateUtils.TimeSince .GetLastEventTimestamp}} {{if .OriginalAuthor}} {{ctx.Locale.Tr .GetLastEventLabelFake $timeStr .OriginalAuthor}} {{else if gt .Poster.ID 0}} diff --git a/templates/repo/issue/filter_actions.tmpl b/templates/repo/issue/filter_actions.tmpl index a341448bcc..60237f225d 100644 --- a/templates/repo/issue/filter_actions.tmpl +++ b/templates/repo/issue/filter_actions.tmpl @@ -1,9 +1,9 @@ {{range .OpenProjects}}
- {{svg .IconName 18 "tw-mr-2"}}{{.Title}} + {{svg .IconName 16 "tw-mr-2"}}{{.Title}}
{{end}} {{end}} @@ -96,7 +96,7 @@
{{range .ClosedProjects}}
- {{svg .IconName 18 "tw-mr-2"}}{{.Title}} + {{svg .IconName 16 "tw-mr-2"}}{{.Title}}
{{end}} {{end}} diff --git a/templates/repo/issue/filter_list.tmpl b/templates/repo/issue/filter_list.tmpl index 09f87b582f..ae50ac4c46 100644 --- a/templates/repo/issue/filter_list.tmpl +++ b/templates/repo/issue/filter_list.tmpl @@ -14,13 +14,13 @@
- {{ctx.Locale.Tr "repo.issues.filter_milestone_all"}} - {{ctx.Locale.Tr "repo.issues.filter_milestone_none"}} + {{ctx.Locale.Tr "repo.issues.filter_milestone_all"}} + {{ctx.Locale.Tr "repo.issues.filter_milestone_none"}} {{if .OpenMilestones}}
{{ctx.Locale.Tr "repo.issues.filter_milestone_open"}}
{{range .OpenMilestones}} - + {{svg "octicon-milestone" 16 "mr-2"}} {{.Name}} @@ -30,7 +30,7 @@
{{ctx.Locale.Tr "repo.issues.filter_milestone_closed"}}
{{range .ClosedMilestones}} - + {{svg "octicon-milestone" 16 "mr-2"}} {{.Name}} @@ -51,16 +51,16 @@ {{svg "octicon-search" 16}}
- {{ctx.Locale.Tr "repo.issues.filter_project_all"}} - {{ctx.Locale.Tr "repo.issues.filter_project_none"}} + {{ctx.Locale.Tr "repo.issues.filter_project_all"}} + {{ctx.Locale.Tr "repo.issues.filter_project_none"}} {{if .OpenProjects}}
{{ctx.Locale.Tr "repo.issues.new.open_projects"}}
{{range .OpenProjects}} - - {{svg .IconName 18 "tw-mr-2 tw-shrink-0"}}{{.Title}} + + {{svg .IconName 16 "tw-mr-2 tw-shrink-0"}}{{.Title}} {{end}} {{end}} @@ -70,8 +70,8 @@ {{ctx.Locale.Tr "repo.issues.new.closed_projects"}}
{{range .ClosedProjects}} - - {{svg .IconName 18 "tw-mr-2"}}{{.Title}} + + {{svg .IconName 16 "tw-mr-2"}}{{.Title}} {{end}} {{end}} @@ -82,7 +82,7 @@ - {{ctx.Locale.Tr "repo.issues.filter_assginee_no_select"}} - {{ctx.Locale.Tr "repo.issues.filter_assginee_no_assignee"}} + {{ctx.Locale.Tr "repo.issues.filter_assginee_no_select"}} + {{ctx.Locale.Tr "repo.issues.filter_assginee_no_assignee"}}
{{range .Assignees}} - + {{ctx.AvatarUtils.Avatar . 20}}{{template "repo/search_name" .}} {{end}} @@ -127,14 +127,14 @@ {{svg "octicon-triangle-down" 14 "dropdown icon"}}
{{end}} @@ -146,13 +146,11 @@
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
diff --git a/templates/repo/issue/milestone_issues.tmpl b/templates/repo/issue/milestone_issues.tmpl index e5dc8cb605..8b8b194f46 100644 --- a/templates/repo/issue/milestone_issues.tmpl +++ b/templates/repo/issue/milestone_issues.tmpl @@ -30,7 +30,7 @@
- {{$closedDate:= TimeSinceUnix .Milestone.ClosedDateUnix ctx.Locale}} + {{$closedDate:= DateUtils.TimeSince .Milestone.ClosedDateUnix}} {{if .IsClosed}} {{svg "octicon-clock"}} {{ctx.Locale.Tr "repo.milestones.closed" $closedDate}} {{else}} @@ -38,7 +38,7 @@ {{if .Milestone.DeadlineString}} {{svg "octicon-calendar"}} - {{DateTime "short" .Milestone.DeadlineString}} + {{DateUtils.AbsoluteShort (.Milestone.DeadlineString|DateUtils.ParseLegacy)}} {{else}} {{svg "octicon-calendar"}} diff --git a/templates/repo/issue/milestone_new.tmpl b/templates/repo/issue/milestone_new.tmpl index 9f32df00e3..4a5f0a15ba 100644 --- a/templates/repo/issue/milestone_new.tmpl +++ b/templates/repo/issue/milestone_new.tmpl @@ -35,8 +35,15 @@
- - + {{template "shared/combomarkdowneditor" (dict + "MarkdownPreviewUrl" (print .Repository.Link "/markup") + "MarkdownPreviewContext" .RepoLink + "TextareaName" "content" + "TextareaPlaceholder" (ctx.Locale.Tr "repo.milestones.desc") + "TextareaAriaLabel" (ctx.Locale.Tr "repo.milestones.desc") + "TextareaContent" .content + "EasyMDE" true + )}}
diff --git a/templates/repo/issue/milestones.tmpl b/templates/repo/issue/milestones.tmpl index 63a6f6b26a..a070a02f72 100644 --- a/templates/repo/issue/milestones.tmpl +++ b/templates/repo/issue/milestones.tmpl @@ -21,7 +21,7 @@ {{range .Milestones}}
  • -

    +

    {{svg "octicon-milestone" 16}} {{.Name}}

    @@ -49,19 +49,19 @@ {{if .UpdatedUnix}}
    {{svg "octicon-clock"}} - {{ctx.Locale.Tr "repo.milestones.update_ago" (TimeSinceUnix .UpdatedUnix ctx.Locale)}} + {{ctx.Locale.Tr "repo.milestones.update_ago" (DateUtils.TimeSince .UpdatedUnix)}}
    {{end}}
    {{if .IsClosed}} - {{$closedDate:= TimeSinceUnix .ClosedDateUnix ctx.Locale}} + {{$closedDate:= DateUtils.TimeSince .ClosedDateUnix}} {{svg "octicon-clock" 14}} {{ctx.Locale.Tr "repo.milestones.closed" $closedDate}} {{else}} {{if .DeadlineString}} {{svg "octicon-calendar" 14}} - {{DateTime "short" .DeadlineString}} + {{DateUtils.AbsoluteShort (.DeadlineString|DateUtils.ParseLegacy)}} {{else}} {{svg "octicon-calendar" 14}} diff --git a/templates/repo/issue/navbar.tmpl b/templates/repo/issue/navbar.tmpl index 30e42c77cc..4d90ca3c0e 100644 --- a/templates/repo/issue/navbar.tmpl +++ b/templates/repo/issue/navbar.tmpl @@ -1,4 +1,4 @@ - +
    diff --git a/templates/repo/issue/new_form.tmpl b/templates/repo/issue/new_form.tmpl index fe10c1f9b9..2c7807206e 100644 --- a/templates/repo/issue/new_form.tmpl +++ b/templates/repo/issue/new_form.tmpl @@ -110,7 +110,7 @@
    {{range .OpenProjects}} - {{svg .IconName 18 "tw-mr-2"}}{{.Title}} + {{svg .IconName 16 "tw-mr-2"}}{{.Title}} {{end}} {{end}} @@ -121,7 +121,7 @@
  • {{range .ClosedProjects}} - {{svg .IconName 18 "tw-mr-2"}}{{.Title}} + {{svg .IconName 16 "tw-mr-2"}}{{.Title}} {{end}} {{end}} @@ -133,49 +133,14 @@
    {{end}}
    - - -
    - - {{ctx.Locale.Tr "repo.issues.new.no_assignees"}} - - -
    + {{template "repo/issue/view_content/sidebar/assignees" dict "isExistingIssue" false "." .}} {{if and .PageIsComparePull (not (eq .HeadRepo.FullName .BaseCompareRepo.FullName)) .CanWriteToHeadRepo}}
    diff --git a/templates/repo/issue/openclose.tmpl b/templates/repo/issue/openclose.tmpl index eb2d6e09ee..5d5cf4140e 100644 --- a/templates/repo/issue/openclose.tmpl +++ b/templates/repo/issue/openclose.tmpl @@ -1,16 +1,22 @@ - diff --git a/templates/repo/issue/view_content.tmpl b/templates/repo/issue/view_content.tmpl index 683dea8425..8ede0f36e5 100644 --- a/templates/repo/issue/view_content.tmpl +++ b/templates/repo/issue/view_content.tmpl @@ -6,7 +6,7 @@ - {{$createdStr:= TimeSinceUnix .Issue.CreatedUnix ctx.Locale}} + {{$createdStr:= DateUtils.TimeSince .Issue.CreatedUnix}}
    @@ -52,7 +52,7 @@
    -
    +
    {{if .Issue.RenderedContent}} {{.Issue.RenderedContent}} {{else}} @@ -79,7 +79,7 @@ {{template "repo/issue/view_content/pull".}} {{end}} - {{if .IsSigned}} + {{if and .IsSigned (not .IsBlocked)}} {{if and (or .IsRepoAdmin .HasIssuesOrPullsWritePermission (not .Issue.IsLocked)) (not .Repository.IsArchived)}}
    @@ -90,7 +90,7 @@ {{template "repo/issue/comment_tab" .}} {{.CsrfTokenHtml}}